diff --git a/.circleci/config.yml b/.circleci/config.yml index 6c6cd73..a96c4da 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,18 +6,21 @@ orbs: jobs: install: docker: - - image: cimg/node:14.17.0 + - image: cimg/node:20.13.1 steps: - checkout - run: npm install + - run: git clone git@github.com:4ian/GDevelop.git --depth 1 + - run: cd GDevelop/newIDE/app && npm install - persist_to_workspace: root: . paths: - node_modules # For npm install. + - GDevelop/newIDE/app # As we have a dependency on GDevelop sources. tests: docker: - - image: cimg/node:14.17.0 + - image: cimg/node:20.13.1 steps: - checkout - attach_workspace: @@ -28,12 +31,12 @@ jobs: build: docker: - - image: cimg/node:14.17.0 + - image: cimg/node:20.13.1 steps: - checkout - attach_workspace: at: . - - run: npm run build + - run: npm run build -- --gdevelop-root-path GDevelop - run: npm run check-post-build - persist_to_workspace: root: . @@ -42,7 +45,7 @@ jobs: deploy: docker: - - image: cimg/node:14.17.0 + - image: cimg/node:20.13.1 steps: - checkout - attach_workspace: diff --git a/README.md b/README.md index 4eb810f..d33caa3 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,18 @@ -# GDevelop-tutorials +![GDevelop logo](https://raw.githubusercontent.com/4ian/GDevelop/master/newIDE/GDevelop%20banner.png 'GDevelop logo') -![GDevelop logo](https://raw.githubusercontent.com/4ian/GDevelop/master/newIDE/GDevelop%20banner.png "GDevelop logo") +GDevelop is a **full-featured, no-code, open-source** game development software. You can build **2D, 3D and multiplayer games** for mobile (iOS, Android), desktop and the web. GDevelop is fast and easy to use: the game logic is built up using an intuitive and powerful event-based system and reusable behaviors. + +# GDevelop (In-App) Tutorials This repository holds official tutorials for the [GDevelop](https://gdevelop.io) editor. At the moment, tutorials can only take the form of an in-app tutorial that guides a user step by step into accomplishing a specific task or discovering a whole part of the editor. +If you're search for all video tutorials, open [GDevelop Learn](https://editor.gdevelop.io/) tab and follow the [YouTube channel](https://www.youtube.com/@gdevelopapp). ## Getting Started -| ❔ I want to... | 🚀 What to do | -| ------------------------------- | ------------------------------------------------------------------------------ | -| Create an in-app tutorial | First read [this README](./docs/inAppTutorial/README.md) and then submit a new tutorial of your own | \ No newline at end of file +| ❔ I want to... | 🚀 What to do | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 🎮 Use GDevelop to make games | Go to [GDevelop homepage](https://gdevelop.io) to download the app! | +| Create an in-app tutorial | Head over to [this README](./docs/inAppTutorial/README.md) to understand how the tutorial files are structured and then submit a new tutorial of your own. | +| Help to translate existing in-app tutorials | Head over to [this README](./docs/inAppTutorial/README.md) to understand how we store translations and then submit with your suggestion. | diff --git a/__tests__/post-build.spec.js b/__tests__/post-build.spec.js index 81e1e6e..f5383c4 100644 --- a/__tests__/post-build.spec.js +++ b/__tests__/post-build.spec.js @@ -1,11 +1,21 @@ // @ts-check const fs = require('fs'); +const dree = require('dree'); -const { inAppTutorialShortHeadersPath } = require('./utils'); +const { + inAppTutorialShortHeadersPath, + inAppTutorialsFolderPath, + getAllMessagesByLocale, + getAllPlaceholdersInMessage, +} = require('./utils'); /** * @typedef {import('../scripts/types').InAppTutorialShortHeader} InAppTutorialShortHeader + * @typedef {import('../scripts/types').InAppTutorial} InAppTutorial + * @typedef {import('../scripts/types').InAppTutorialFlowStep} InAppTutorialFlowStep + * @typedef {import('../scripts/types').InAppTutorialFlowMetaStep} InAppTutorialFlowMetaStep + * @typedef {import('./utils').InAppTutorialGenericType} InAppTutorialGenericType */ describe('In app tutorials control figures', () => { @@ -15,7 +25,7 @@ describe('In app tutorials control figures', () => { ); test('there is the right number of in app tutorials', () => { - expect(shortHeaders).toHaveLength(1); // To change when adding new in app tutorials + expect(shortHeaders.length).toMatchInlineSnapshot(`12`); // To change when adding new in app tutorials }); test('all in app tutorials have a different id', () => { @@ -29,3 +39,127 @@ describe('In app tutorials control figures', () => { expect(Object.values(idCount).every((count) => count === 1)).toBe(true); }); }); + +describe('In app tutorials content checks', () => { + const allInAppTutorialFolder = dree.scan(inAppTutorialsFolderPath, { + stat: false, + normalize: true, + followLinks: true, + size: false, + hash: false, + exclude: [], + extensions: ['json'], + }); + const { children: allInAppTutorialFiles } = allInAppTutorialFolder; + if (!allInAppTutorialFiles) throw new Error('No tutorial file found.'); + /** @type {InAppTutorial[]} */ + const allInAppTutorials = allInAppTutorialFiles + .filter((file) => file.type === dree.Type.FILE) + .map((file) => JSON.parse(fs.readFileSync(file.path, 'utf-8'))); + + test('there is no empty translation', () => { + /** @type {Record>>} */ + const translationsWithEmptyFieldsByTutorial = {}; + allInAppTutorials.forEach((tutorial) => { + const allMessagesByLocale = getAllMessagesByLocale(tutorial); + /** @type {Array>} */ + const translationsWithEmptyFieldsForTutorial = []; + allMessagesByLocale.forEach((messageByLocale) => { + if (Object.values(messageByLocale).some((message) => !message)) { + translationsWithEmptyFieldsForTutorial.push(messageByLocale); + } + }); + if (translationsWithEmptyFieldsForTutorial.length > 0) { + translationsWithEmptyFieldsByTutorial[tutorial.id] = + translationsWithEmptyFieldsForTutorial; + } + }); + if (Object.keys(translationsWithEmptyFieldsByTutorial).length > 0) { + console.error(translationsWithEmptyFieldsByTutorial); + throw new Error( + 'There are missing translations in the following tutorials' + ); + } + }); + + test('all translations have all the defined locales', () => { + /** @type {{ tutorialId: string, missingLocale: string, messageByLocale: Object} []} */ + const errors = []; + allInAppTutorials.forEach((tutorial) => { + const allMessagesByLocale = getAllMessagesByLocale(tutorial); + const availableLocales = tutorial.availableLocales; + allMessagesByLocale.forEach((messageByLocale) => { + for (const locale of availableLocales) { + if (!messageByLocale[locale]) { + errors.push({ + tutorialId: tutorial.id, + missingLocale: locale, + messageByLocale, + }); + } + } + }); + }); + + if (errors.length > 0) { + console.error(errors); + throw new Error( + 'There are missing translations in some tutorials, check the console for more details' + ); + } + }); + + test('references to project data are not corrupt', () => { + /** @type {Record>} */ + const messagesWithCorruptProjectDataByTutorial = {}; + + allInAppTutorials + // We don't check the tutorials with initial template, because they already have project data. + .filter((tutorial) => !tutorial.initialTemplateUrl) + .forEach((tutorial) => { + const { flow, initialProjectData } = tutorial; + const projectData = flow.reduce( + /** + * @param {string[]} acc + * @param {InAppTutorialFlowStep | InAppTutorialFlowMetaStep} step + */ + (acc, step) => { + if ('metaKind' in step) return acc; + if (step.mapProjectData) { + acc.push(Object.keys(step.mapProjectData)[0]); + } + return acc; + }, + /** @type {string[]} */ + initialProjectData ? Object.keys(initialProjectData) : [] + ); + + const allMessagesByLocale = getAllMessagesByLocale(tutorial); + + /** @type {string[]} */ + const messagesWithCorruptProjectData = []; + allMessagesByLocale.forEach((messageByLocale) => { + Object.values(messageByLocale).forEach((value) => { + const allPlaceholders = getAllPlaceholdersInMessage(value); + if ( + allPlaceholders.some( + (placeholder) => !projectData.includes(placeholder) + ) + ) { + messagesWithCorruptProjectData.push(value); + } + }); + }); + if (messagesWithCorruptProjectData.length > 0) { + messagesWithCorruptProjectDataByTutorial[tutorial.id] = + messagesWithCorruptProjectData; + } + }); + if (Object.keys(messagesWithCorruptProjectDataByTutorial).length > 0) { + console.error(messagesWithCorruptProjectDataByTutorial); + throw new Error( + 'There are corrupt project data keys in the following tutorials' + ); + } + }); +}); diff --git a/__tests__/utils.js b/__tests__/utils.js index e7d90ea..a4f2548 100644 --- a/__tests__/utils.js +++ b/__tests__/utils.js @@ -6,5 +6,56 @@ const inAppTutorialShortHeadersPath = path.join( 'database', 'inAppTutorialShortHeaders.json' ); +const inAppTutorialsFolderPath = path.join(distPath, 'tutorials', 'in-app'); -module.exports = { distPath, inAppTutorialShortHeadersPath }; +/** + * @typedef {{[key:string] : string} | {messageByLocale?: Record}} InAppTutorialGenericType + * @typedef {import('../scripts/types').InAppTutorial} InAppTutorial + * @typedef {import('../scripts/types').MessageByLocale} MessageByLocale + */ + +/** + * Recursively browses a tutorial to return all messageByLocale object. + * @param {InAppTutorial | InAppTutorialGenericType} tutorial + * @returns {Array} + */ +const getAllMessagesByLocale = (tutorial) => { + if (Array.isArray(tutorial)) { + return Object.values(tutorial).map(getAllMessagesByLocale).flat(); + } + /** @type {Array>} */ + const localMessagesByLocale = []; + Object.entries(tutorial).forEach(([key, value]) => { + if (key === 'messageByLocale') { + // @ts-ignore + localMessagesByLocale.push(value); + return; + } + if (typeof value === 'object') { + // @ts-ignore + localMessagesByLocale.push(...getAllMessagesByLocale(value)); + return; + } + }); + return localMessagesByLocale; +}; + +const placeholderReplacingRegex = /\$\((\w+)\)/g; + +/** + * + * @param {string} message + * @returns {string[]} + */ +const getAllPlaceholdersInMessage = (message) => { + const match = message.matchAll(placeholderReplacingRegex); + return [...match].map((match) => match[1]); +}; + +module.exports = { + distPath, + inAppTutorialShortHeadersPath, + inAppTutorialsFolderPath, + getAllMessagesByLocale, + getAllPlaceholdersInMessage, +}; diff --git a/docs/inAppTutorial/README.md b/docs/inAppTutorial/README.md index ce8e6f5..ee005e7 100644 --- a/docs/inAppTutorial/README.md +++ b/docs/inAppTutorial/README.md @@ -10,3 +10,41 @@ You can have a look at the components in [the editor storybook](https://gdevelop ## How To Create An In-App Tutorial Have a look at the [documentation](./REFERENCE.md) to learn how to build your JSON. + +> Note: At the moment, there isn't a no-code approach to building/modifying an in-app tutorial. You should have GDevelop running and inspect its HTML to be able to specify the CSS selectors to use. If there are missing HTML tag ids, please tell us or open a PR on [GDevelop main repository](https://github.com/4ian/GDevelop). + +## Add a New Language to an In-App Tutorial + +> Make sure you're comfortable with editing [JSON files](https://docs.fileformat.com/web/json/). + +To help us translate the in-app tutorials, please follow these steps: + +- Git and GitHub manipulations: + - Fork the repository + - Create a new branch in your new repository + +Once the repository is installed, open the JSON file with your favorite IDE (VSCode or else.) and begin the translation work: + +- Find all the lines corresponding to a field with key `"en"` and duplicate those lines + - with VSCode, select `"en"` and then hit Ctrl+Shift+L to select all identical occurrences. +- Translate each new line you created with the above instruction +- Add the locale you added to field `availableLocales` + +**Notes** + +- There are a few things to know, you can have a look at the other translations if you're not sure: + - We're using markdown to format the text. For instance: + - **\*\*bold\*\*** + - \*_italic_\* + - `` `code` `` + - There shall not be empty translations + - Don't translate placeholders such as `$(character)` + +And finally: + +- Git and GitHub manipulations: + - Commit your changes + - Push your branch + - Open the PR from your branch to our `main` branch. + +Once you do this, a few automated checks will be run to make sure a few basic verifications are made. diff --git a/docs/inAppTutorial/REFERENCE.md b/docs/inAppTutorial/REFERENCE.md index 3020381..d7f75b7 100644 --- a/docs/inAppTutorial/REFERENCE.md +++ b/docs/inAppTutorial/REFERENCE.md @@ -1,5 +1,7 @@ # GDevelop In-App Tutorial Documentation +"In-app tutorial" is the term used in the codebase for GDevelop. It is displayed "guided lesson" in GDevelop editor. Each term designates the same thing. + ## How is handled the translation? To display the tutorial with different languages, every text that you will specify has to be an object `messageByLocale` with locales as keys and the translated sentence as value. @@ -12,7 +14,7 @@ For example, this will be the description of a tooltip: "description": { "messageByLocale": { "en": "Click on the button", - "fr-fr": "Cliquez sur le bouton" + "fr-FR": "Cliquez sur le bouton" } } } @@ -22,14 +24,19 @@ Note: If the user language is not available, it will fallback to english. ## JSON Structure -An in-app tutorial is a JSON with 4 fields: +An in-app tutorial is a JSON with 7 fields: ```json { "id": "physics2-joints", "flow": [...], "editorSwitches": {...}, - "endDialog": {...} + "endDialog": {...}, + "availableLocales": [...], + "initialTemplateUrl": "https://...", + "initialProjectData": {...}, + "titleByLocale": {...}, + "bulletPointsByLocale": {...}, } ``` @@ -37,6 +44,10 @@ An in-app tutorial is a JSON with 4 fields: This id is a string that should be unique across all in-app tutorials. +### `availableLocales` + +This is the list of locales for which a translation is available. This can be displayed to the GDevelop user before following the tutorial. + ### `endDialog` This field holds the content for the dialog that will displayed after the user has completed the last step of the [flow](#flow). @@ -85,7 +96,7 @@ The array contains either: ### `flow` -A flow is an array of steps. +A flow is an array of steps or [meta steps](#meta-steps). A step is more or less an element to highlight plus a trigger that can be detected programmatically to decide to go to the next step. @@ -96,14 +107,17 @@ Here is the structure of a step (all fields are optional): - `nextStepTrigger`: see [Triggers](#triggers) - `tooltip`: see [Tooltip](#tooltip) - `dialog`: A dialog to display with the same structure as the [the end dialog](#enddialog) +- `deprecated` (true): Useful to discard a step that is not useful anymore in order to not change the count of step of the tutorial and impact progress save on user side. - `isCheckpoint` (true): Useful to divide a tutorial in different part. When there are checkpoint steps, the notion of progress is part-based. - `isTriggerFlickering`(true): useful when a DOM mutation is not caught and the presence trigger is not fired. - `shortcuts`: list of steps that the flow can use as shortcuts. - `stepId`: id of the step to jump to - - `trigger`: DOM trigger (presence of absence of element) + - `trigger`: DOM trigger (presence of absence of element) or objectAddedInLayout trigger. - `skippable` (true): if the step can be skipped (useful when the user interaction can result in this step not being mandatory) - `isOnClosableDialog` (true): if the step is on a closable dialog, if the element to highlight is missing (meaning the dialog has been closed), the flow will go back to the previous step that is not on a closable dialog. - `mapProjectData` (object): allow to read data in the GDevelop project object and store it during the duration of the tutorial. This data can then be used in the tooltips. See [Available Project Data](#available-project-data) +- `interactsWithCanvas` (true): if the step requires interacting with the canvas (useful when a blocking layer is displayed, so the step allows the user to interact with the canvas) +- `disableBlockingLayer` (true): if the blocking layer should be disabled for this step. (useful when the step requires interacting with multiple things, and the blocking layer would prevent it) #### **Triggers** @@ -112,8 +126,18 @@ At the moment, only one trigger can be specified to go the next step. Here is th - `presenceOfElement` (string): the CSS selector of an element present in the DOM or a custom selector - `absenceOfElement` (string): the CSS selector of an element absent from the DOM or a custom selector - `valueHasChanged` (true): the CSS selector of an input whose value has changed -- `instanceAddedOnScene` (string): the name of an object for which an instance has been added on the scene -- `previewLaunched` (true): a preview has been launched +- `valueEquals` (string | boolean): the CSS selector of an input whose value is equal to the string: + - for numbers, it has to be a string (ex: "2") + - for booleans (checkboxes), use booleans (ex: true) +- `objectAddedInLayout` (true): an object has been added to the scene (from scratch, duplication or the asset store) +- `instanceAddedOnScene` (string): the name of an object for which an instance has been added on the scene. With this additional option, at the same level + - `instancesCount` (number): the number of instances that should be present on the scene. +- `previewLaunched` (true): a preview has been launched. With those additional options, at the same level: + - `inGameMessage` (`messageByLocale` object): when the user launches the preview, this message will be displayed as a standalone tooltip in the preview. Placeholders can be used but markdown won't be interpreted. + - `inGameTouchMessage` (`messageByLocale` object): same as above, for touch devices. + - `inGameMessagePosition` (string): a string that contains the position of the avatar in the preview (for instance `top-right`). + - For horizontal placement, it must contain `right` or `left`. + - For vertical placement, it must contain `top` or `middle` or `bottom`. - `clickOnTooltipButton` (`messageByLocale` object): the label of the button displayed in the tooltip that the user has to click to go to the next step. - `editorIsActive` (string `scene:editor`): to detect when a user switched editors - `scene` is optional (if your tutorial only requires a single scene, no need to specify it). In that case, you can write `:EventsSheet` if you want to check the user is on the events sheet. @@ -161,7 +185,10 @@ For each step, you can specify a tooltip to display next to the element you want - `title`: (optional) Translated text - `description`: (optional) Translated text -- `placement`: The placement of the tooltip relatively to the element to highlight. Either one of those values: `bottom`, `top`, `left`, `right` (default value `bottom`) +- `touchDescription`: (optional) Translated text on touch devices +- `placement`: (optional) The placement of the tooltip relatively to the element to highlight. Either one of those values: `bottom`, `top`, `left`, `right` (default value `bottom`) +- `mobilePlacement`: (optional) The placement of the tooltip on mobile +- `standalone`: (optional) Boolean to display the tooltip as the Red Hero avatar on the bottom left corner of the app. Notes: @@ -193,5 +220,132 @@ If your flow contains a step with id `ClickOnCreateObjectButton` (that should ha Notes: -- `playScene` is the key under which the name of the scene has been stored during the tutorial. +- `playScene` is either: + - the key under which the name of the scene has been stored during the tutorial. + - the key under which the name of the scene is defined in the field `initialProjectData`. - The possible values for the expected editor are: `Scene`, `EventsSheet`, `Home` (other editors are not supported at the moment). + +### `initialTemplateUrl` & `initialProjectData` + +If the tutorial does not start from scratch, we can provide a template URL to download the project from with `initialTemplateUrl`. This should match the URL of the template in the GDevelop templates S3 bucket (https://resources.gdevelop-app.com/in-app-tutorials/templates/{gameName}/game.json) +This template should be available inside the `templates` folder, with the same name as the tutorial. It will get deployed to the S3 bucket when merging to master. + +Inside the app, when a tutorial is running, all objects or scenes added are tracked, so they can be re-used. +However, if we start from a template, we need to know which objects or scenes are already present so they can be tracked. +Ideally, we should be able to detect them automatically, but for now, we need to provide the list of objects and scenes that are already present in the template. +To do so, we can provide the `initialProjectData` field. + +Ex: + +```json +{ + ..., + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/plinkoMultiplier/game.json", + "initialProjectData": { + "gameScene": "GameScene", + "multiplier": "Multiplier", + "particles": "PegStar_Particle" + }, +} +``` + +### `titleByLocale` & `bulletPointsByLocale` + +These fields are used in the small dialog displayed after clicking on the guided lesson card. + +## Meta steps + +We're introducing meta steps to speed up the process. +These meta steps should handle particular situations that are not interesting to the tutorial designer and will also bring consistency across tutorials. + +At the moment, there are 2 meta steps available (both are used in the `joystick` tutorial): + +- **LaunchPreview** +- **AddBehavior** + +TODO: add documentation about how to use those steps. +In the meantime, you can check how both are used in the `joystick` tutorial and discover the available fields in [the types declaration](../../scripts/types.d.ts). + +## How to test your in-app tutorial in GDevelop + +> Available in GDevelop desktop app only. + +Starting from version 5.4.202, you can load your in-app tutorial from your computer to try it. + +To do so, go to your preferences, in the section "Contributor options", activate the toggle "Show button to load guided lesson from file and test it.". + +Once this is done, a new button "Load local lesson" should appear in the homepage's learn tab, above the guided lessons section. Select your JSON file and complete your lesson! + +Notes: + +- The editor will perform a basic schema check before actually running the tutorial. + - If errors are found, please open the developer console, they will be listed there. + - The check is not exhaustive. +- If your in-app tutorial is using an initial template, make sure to have it opened before loading the tutorial. +- If you are using meta steps in your tutorial, you need to first run the build command: + + ```bash + npm run build -- --gdevelop-root-path=/path/to/GDevelop/repository + ``` + + Then select the json file generated in the folder `dist/tutorials`. + +## Translate your in-app tutorial + +If you can use ChatGPT, you can easily have a basic translation for your tutorial. To do so, for each object with a `en` key, you should add all needed locale keys and then you can ask ChatGPT to translate it. + +For instance, if you have the following: + +```json +"messageByLocale": { + "en": "Click on this button" +} +``` + +Transform it to this: + +```json +"messageByLocale": { + "en": "Click on this button", + "fr": "", + "de": "", + "es": "", + "th": "", + ... +} +``` + +And the ask the following to ChatGPT: + +``` +Given this JSON, can you add translations for the empty fields corresponding to the keys that represent the locale to translate to? + +{COPY PASTE THE JSON} +``` + +## Integrity tests + +Some tests are run in our Continuous Integration (CI) pipeline when you open a PR. +You can run them on your device to make sure your in-app tutorial passes the checks. + +Prerequisites: + +- Clone [GDevelop repository](https://github.com/4ian/GDevelop) on your computer and run `npm install` in the folder `newIDE/app/`. + +To do so, in a terminal: + +- install the project: at the root of the repository, run `npm install` +- Build the tutorials: run `npm run build -- --gdevelop-root-path=/path/to/GDevelop/repository` +- Run the tests: run `npm run check-post-build` +- Read the output to see if your in-app tutorial passes the tests. + +## Final steps + +You should follow those steps if you want your in-app tutorial to be integrated in GDevelop's interface. + +Open a new PR in [GDevelop's repository](https://github.com/4ian/GDevelop) and: + +- In the file `InAppTutorial.js`: + - add your tutorial id in a constant and add it to the list `guidedLessonsIds`. + - if applicable, add your tutorial id in the list in the function `isMiniTutorial`. +- In the file `GuidedLessons.js`, add an item in the list `guidedLessonCards` with all the fields (you should have a SVG file to use in the card). diff --git a/scripts/deploy.js b/scripts/deploy.js index 11733d1..38e8cc5 100644 --- a/scripts/deploy.js +++ b/scripts/deploy.js @@ -66,8 +66,29 @@ axios files: [ // Update the "database" 'https://resources.gdevelop-app.com/in-app-tutorials-database/inAppTutorialShortHeaders.json', - // Upload the tutorials - 'https://resources.gdevelop-app.com/in-app-tutorials/flingGamePart1.json', + // Update the full tutorials + 'https://resources.gdevelop-app.com/in-app-tutorials/flingGame.json', + // Update the guided lessons and their templates. + 'https://resources.gdevelop-app.com/in-app-tutorials/plinkoMultiplier.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/plinkoMultiplier/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/cameraParallax.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/cameraParallax/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/healthBar.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/healthBar/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/joystick.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/joystick/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/timer.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/timer/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/object3d.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/object3d/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/knightPlatformer.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/knightPlatformer/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/topDownRPGMovement.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/topDownRPGMovement/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/fireABullet.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/fireABullet/game.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/coopPlatformer.json', + 'https://resources.gdevelop-app.com/in-app-tutorials/templates/coopPlatformer/game.json', ], }, { diff --git a/scripts/generate-database.js b/scripts/generate-database.js index e55b8c9..cff981c 100644 --- a/scripts/generate-database.js +++ b/scripts/generate-database.js @@ -4,34 +4,184 @@ const dree = require('dree'); const path = require('path'); const fs = require('fs').promises; const { InAppTutorial } = require('./lib/InAppTutorial'); +const { loadGDevelopCoreAndExtensions } = require('./lib/GDevelopCoreLoader'); +const { loadSerializedProject } = require('./lib/LocalProjectOpener'); +const { + readFileTree, + enhanceFileTreeWithParsedContent, + getAllFiles, + getAllTemplateFiles, +} = require('./lib/FileTreeParser'); +const { writeProjectJSONFile } = require('./lib/LocalProjectWriter'); +const args = require('minimist')(process.argv.slice(2)); -/** - * @typedef {import("./types").InAppTutorialShortHeader} InAppTutorialShortHeader - */ +/** @typedef {import("./types").InAppTutorialShortHeader} InAppTutorialShortHeader */ +/** @typedef {import("./types").libGDevelop} libGDevelop */ +/** @typedef {import('./types').gdProject} gdProject */ + +if (!args['gdevelop-root-path']) { + shell.echo( + '❌ You must pass --gdevelop-root-path with the path to GDevelop repository with `npm install` ran in `newIDE/app`.' + ); + shell.exit(1); +} + +const distPath = path.join(__dirname, '../dist'); +const gdevelopRootPath = path.resolve( + process.cwd(), + args['gdevelop-root-path'] +); const tutorialsSourceRootPath = path.join(__dirname, '../tutorials'); const inAppTutorialsSourceRootPath = path.join( tutorialsSourceRootPath, 'in-app' ); -const distPath = path.join(__dirname, '../dist'); -const databasePath = path.join(distPath, 'database'); -const inAppTutorialsDestinationRootPath = path.join(distPath, 'tutorials'); +const inAppTutorialsDestinationRootPath = path.join( + distPath, + 'tutorials', + 'in-app' +); +const tutorialsDatabasePath = path.join(distPath, 'database'); + +const templatesSourceRootPath = path.join(__dirname, '../templates'); +const templatesDestinationRootPath = path.join( + distPath, + 'tutorials', + 'in-app', + 'templates' +); + +/** @param {string} fileOrFolderPath */ +const normalizePathSeparators = (fileOrFolderPath) => { + return fileOrFolderPath.replace(/\\/g, '/'); +}; + +/** + * Generate the URL used after deployment for a file in the templates folder. + * @param {string} filePath + */ +const getResourceUrl = (filePath) => { + const relativeFilePath = normalizePathSeparators( + path.relative(inAppTutorialsDestinationRootPath, filePath) + ); + return `https://resources.gdevelop-app.com/in-app-tutorials/${relativeFilePath}`; +}; const generateFolderStructure = () => { // Clean current folders - shell.rm('-rf', databasePath); + shell.rm('-rf', inAppTutorialsDestinationRootPath); + shell.rm('-rf', tutorialsDatabasePath); // Recreate destination folders shell.mkdir('-p', inAppTutorialsDestinationRootPath); - shell.mkdir('-p', databasePath); + shell.mkdir('-p', tutorialsDatabasePath); - // Copy tutorials in destination folders - shell.cp( - '-r', - inAppTutorialsSourceRootPath, - inAppTutorialsDestinationRootPath + // Copy templates in destination folders + shell.cp('-r', templatesSourceRootPath, templatesDestinationRootPath); +}; + +/** + * + * @param {libGDevelop} gd + * @param {gdProject} project + * @param {string} baseUrl + */ +const updateResources = (gd, project, baseUrl) => { + const worker = new gd.ArbitraryResourceWorkerJS( + project.getResourcesManager() ); + /** @param {string} file */ + worker.exposeImage = (file) => { + // Don't do anything + return file; + }; + /** @param {string} shader */ + worker.exposeShader = (shader) => { + // Don't do anything + return shader; + }; + /** @param {string} file */ + worker.exposeFile = (file) => { + if (file.length === 0) return ''; + return baseUrl + '/' + file; + }; + + gd.ResourceExposer.exposeWholeProjectResources(project, worker); +}; + +/** + * Update the template game files to use resources on resources.gdevelop-app.com + * @returns {Promise<{errors: Error[]}>} + */ +const updateTemplateFiles = async () => { + const loadedGDevelop = await loadGDevelopCoreAndExtensions({ + gdevelopRootPath, + }); + const { gd } = loadedGDevelop; + if (!gd || loadedGDevelop.errors.length) { + console.error( + 'Unable to load GDevelop core and the extensions:', + loadedGDevelop.errors + ); + shell.exit(1); + } + console.info( + 'Loaded GDevelop and extensions', + loadedGDevelop.extensionLoadingResults + ); + + /** @type {Error[]} */ + const errors = []; + console.info('updating template files.'); + + const fileTree = await readFileTree(templatesDestinationRootPath); + if (!fileTree) throw new Error('Expected fileTree not to be null'); + + const enhancedTree = await enhanceFileTreeWithParsedContent(fileTree); + const { fileTreeWithParsedContent } = enhancedTree; + if (enhancedTree.errors.length) { + console.error( + 'There were errors while parsing templates files:', + enhancedTree.errors + ); + console.info('Aborting because of these errors.'); + shell.exit(1); + } + + const allFiles = getAllFiles(fileTreeWithParsedContent); + const allTemplateFiles = getAllTemplateFiles(allFiles); + + await Promise.all( + allTemplateFiles.map(async (fileWithParsedContent) => { + const projectObject = fileWithParsedContent.parsedContent; + if (!projectObject) { + errors.push( + new Error( + `Expected valid JSON content in ${fileWithParsedContent.path}.` + ) + ); + return; + } + + const project = loadSerializedProject(gd, projectObject); + const gameFolderPath = path.dirname(fileWithParsedContent.path); + updateResources(gd, project, getResourceUrl(gameFolderPath)); + + try { + await writeProjectJSONFile(gd, project, fileWithParsedContent.path); + } catch (error) { + errors.push( + new Error( + `Error while writing the updated project file at ${fileWithParsedContent.path}: ` + + error + ) + ); + } + }) + ); + + return { errors }; }; /** @@ -78,9 +228,28 @@ const buildAndWriteInAppTutorialsDatabase = (databasePath, inAppTutorials) => { ); }; +/** + * @param {Array} inAppTutorials + */ +const processAndWriteInAppTutorials = (inAppTutorials) => { + inAppTutorials.forEach((inAppTutorial) => { + inAppTutorial.processFlowMetaSteps(); + }); + inAppTutorials.forEach((inAppTutorial) => { + fs.writeFile( + path.join( + inAppTutorialsDestinationRootPath, + path.basename(inAppTutorial.sourcePath) + ), + inAppTutorial.toString() + ); + }); +}; + const processInAppTutorials = async () => { const inAppTutorials = await readInAppTutorials(inAppTutorialsSourceRootPath); - buildAndWriteInAppTutorialsDatabase(databasePath, inAppTutorials); + processAndWriteInAppTutorials(inAppTutorials); + buildAndWriteInAppTutorialsDatabase(tutorialsDatabasePath, inAppTutorials); }; /** @@ -89,7 +258,12 @@ const processInAppTutorials = async () => { (async () => { try { generateFolderStructure(); + await updateTemplateFiles(); await processInAppTutorials(); + console.info('✅ Tutorials were successfully generated.'); + console.info( + 'ℹ️ Make sure you run the command \x1b[1mnpm run check-post-build\x1b[0m' + ); } catch (error) { console.error('The script errored', error); shell.exit(1); diff --git a/scripts/lib/FileTreeParser.js b/scripts/lib/FileTreeParser.js new file mode 100644 index 0000000..c751d09 --- /dev/null +++ b/scripts/lib/FileTreeParser.js @@ -0,0 +1,167 @@ +// @ts-check +const dree = require('dree'); +const fs = require('fs').promises; +const path = require('path'); + +/** @typedef {{name: string, searchToken: string}} Author */ +/** @typedef {{name: string, searchToken: string}} License */ +/** @typedef {import('dree').Dree} Dree */ +/** @typedef {{parsedContent?: any}} OptionalParsedJSONContent */ +/** @typedef {{children?: DreeWithParsedContent[]} & OptionalParsedJSONContent & Dree} DreeWithParsedContent */ +/** @typedef {{name: string, children: TagsTreeNode[], allChildrenTags: string[] }} TagsTreeNode */ + +/** + * Remove if necessary the BOM character at the beginning of a JSON file content. + * @param {string} content + */ +const sanitizeJSONContent = (content) => { + if (content[0] === '\uFEFF') return content.slice(1); + + return content; +}; + +/** + * Create a "file tree" by browsing all the files of the specified folder, + * only listing files with extensions that we know are useful. + * + * @param {string} rootPath + * @returns {Promise} + */ +const readFileTree = async (rootPath) => { + return await dree.scanAsync(rootPath, { + stat: false, + normalize: true, + followLinks: true, + size: false, + hash: false, + extensions: ['png', 'md', 'txt', 'json', 'ttf', 'otf', 'wav', 'aac', 'svg'], + }); +}; + +/** + * Browse the specified file tree and add the file content for each project file. + * @param {Dree} fileTree + * @returns {Promise<{fileTreeWithParsedContent: DreeWithParsedContent, errors: Error[]}>} + */ +const enhanceFileTreeWithParsedContent = async (fileTree) => { + /** @type {Error[]} */ + const errors = []; + + /** @type {DreeWithParsedContent[]} */ + const childrenFileTreeWithParsedContent = []; + + /** @type {Object.} */ + const parsedContents = {}; + + if (fileTree.type === 'directory' && fileTree.children) { + // Make a first pass on the directory to create the contents of the project files. + await Promise.all( + fileTree.children.map(async (childFileTree) => { + if ( + childFileTree.type === 'file' && + childFileTree.name.endsWith('.json') + ) { + try { + const content = await fs.readFile(childFileTree.path, 'utf-8'); + const sanitizedContent = sanitizeJSONContent(content); + const parsedContent = JSON.parse(sanitizedContent); + parsedContents[childFileTree.name] = parsedContent; + } catch (error) { + errors.push( + new Error( + 'Unable to read the content of ' + + childFileTree.path + + ' - is it valid JSON?' + ) + ); + } + } + }) + ); + + // Make a second pass to build the tree + await Promise.all( + fileTree.children.map(async (childFileTree) => { + if (childFileTree.type === 'file') { + childrenFileTreeWithParsedContent.push({ + ...childFileTree, + parsedContent: parsedContents[childFileTree.name], + children: [], + }); + } else { + const childEnhancedTree = await enhanceFileTreeWithParsedContent( + childFileTree + ); + childrenFileTreeWithParsedContent.push( + childEnhancedTree.fileTreeWithParsedContent + ); + } + }) + ); + } + + return { + fileTreeWithParsedContent: { + ...fileTree, + children: childrenFileTreeWithParsedContent, + }, + errors, + }; +}; + +/** + * Get all files of a file tree indexed by their absolute path. + * @param {DreeWithParsedContent} fileTreeWithMetadata + * @returns {Object.} + */ +const getAllFiles = (fileTreeWithMetadata) => { + if (fileTreeWithMetadata.type === 'file') { + return { [fileTreeWithMetadata.path]: fileTreeWithMetadata }; + } else { + /** @type {Object.} */ + let allFiles = {}; + + if (!fileTreeWithMetadata.children) { + // A folder without children - just ignore it. + return allFiles; + } + + fileTreeWithMetadata.children.forEach((childFileTreeWithMetadata) => { + allFiles = { ...allFiles, ...getAllFiles(childFileTreeWithMetadata) }; + }); + return allFiles; + } +}; + +/** + * Return only the files that are GDevelop project files. + * @param {Object.} allFiles + * @returns {DreeWithParsedContent[]} + */ +const getAllTemplateFiles = (allFiles) => { + /** @param {DreeWithParsedContent} fileWithMetadata */ + const isGame = (fileWithMetadata) => { + if (fileWithMetadata.name === 'game.json') return true; + + if ( + fileWithMetadata.name.endsWith('.json') && + path.basename(path.dirname(fileWithMetadata.relativePath)) === + path.basename(fileWithMetadata.name, '.json') + ) { + return true; + } + + return false; + }; + + return Object.values(allFiles).filter((fileWithMetadata) => { + return isGame(fileWithMetadata); + }); +}; + +module.exports = { + readFileTree, + enhanceFileTreeWithParsedContent, + getAllFiles, + getAllTemplateFiles, +}; diff --git a/scripts/lib/GDevelopCoreLoader.js b/scripts/lib/GDevelopCoreLoader.js new file mode 100644 index 0000000..ecfe303 --- /dev/null +++ b/scripts/lib/GDevelopCoreLoader.js @@ -0,0 +1,83 @@ +const path = require('path'); + +/** @typedef {import('../types').libGDevelop} libGDevelop */ + +/** + * Load GDevelop core library and JavaScript extensions. + * + * @param {{gdevelopRootPath: string}} options + * @returns {Promise<{gd: ?libGDevelop, extensionLoadingResults: any[], errors: Error[]}>} + */ +const loadGDevelopCoreAndExtensions = async ({ gdevelopRootPath }) => { + /** @type {Error[]} */ + const errors = []; + + const libGDJsPath = path.join(gdevelopRootPath, 'newIDE/app/public/libGD.js'); + const localJsExtensionLoaderPath = path.join( + gdevelopRootPath, + 'newIDE/app/src/JsExtensionsLoader/LocalJsExtensionsLoader.js' + ); + + /** @type {?() => Promise} */ + let initializeGDevelopJs = null; + try { + initializeGDevelopJs = require(libGDJsPath); + } catch (error) { + errors.push( + new Error(`Unable to load libGD.js from ${libGDJsPath}:` + error) + ); + } + + /** @type {?Function} */ + let makeExtensionsLoader = null; + try { + makeExtensionsLoader = require(localJsExtensionLoaderPath); + } catch (error) { + errors.push( + new Error( + `Unable to load LocalJsExtensionsLoader.js from ${localJsExtensionLoaderPath}:` + + error + ) + ); + } + + if (!initializeGDevelopJs || !makeExtensionsLoader) { + return { + gd: null, + extensionLoadingResults: [], + errors, + }; + } + + return new Promise((resolve) => { + // @ts-ignore + initializeGDevelopJs().then( + /** @param {libGDevelop} gd */ + async (gd) => { + /** @param {string} str */ + const noopTranslationFunction = (str) => str; + + gd.ProjectHelper.initializePlatforms(); + + // @ts-ignore + const extensionLoadingResults = await makeExtensionsLoader({ + gd, + filterExamples: true, + onFindGDJS: async () => ({ + gdjsRoot: path.join(gdevelopRootPath, 'newIDE/app/resources/GDJS'), + }), + }).loadAllExtensions(noopTranslationFunction); + + resolve({ + gd, + extensionLoadingResults, + errors, + }); + } + ); + }); +}; + +module.exports = { + loadGDevelopCoreAndExtensions, +}; diff --git a/scripts/lib/InAppTutorial.js b/scripts/lib/InAppTutorial.js index c0124ac..6c34388 100644 --- a/scripts/lib/InAppTutorial.js +++ b/scripts/lib/InAppTutorial.js @@ -1,9 +1,17 @@ // @ts-check const fs = require('fs'); const path = require('path'); +const { translateMetaStep } = require('./MetaStepTranslator'); +const { ensureMessageByLocale } = require('./MessageByLocale'); /** + * @typedef {import("../types").MessageByLocale} MessageByLocale * @typedef {import("../types").InAppTutorialShortHeader} InAppTutorialShortHeader + * @typedef {import("../types").InAppTutorialFlowStep} InAppTutorialFlowStep + * @typedef {import("../types").InAppTutorial} InAppTutorialType + * @typedef {import("../types").InAppTutorialFlowMetaStep} InAppTutorialFlowMetaStep + * @typedef {import("../types").EditorIdentifier} EditorIdentifier + * @typedef {import("../types").InAppTutorialEndDialog} InAppTutorialEndDialog */ class InAppTutorial { @@ -11,6 +19,24 @@ class InAppTutorial { sourcePath; /** @type {string} */ id; + /** @type {MessageByLocale} */ + titleByLocale; + /** @type {Array} */ + bulletPointsByLocale; + /** @type {Array} */ + availableLocales; + /** @type {string | undefined} */ + initialTemplateUrl; + /** @type { Record | undefined} */ + initialProjectData; + /** @type { Array } */ + flow; + /** @type {Record} */ + editorSwitches; + /** @type {InAppTutorialEndDialog} */ + endDialog; + /** @type {boolean} */ + isMiniTutorial; /** * @param {string} sourcePath @@ -25,7 +51,28 @@ class InAppTutorial { `the in app tutorial with ${tutorialContent.id} is saved under a file that does not share the same name (${sourceFileName})` ); } + if (!Array.isArray(tutorialContent.bulletPointsByLocale)) + throw new Error( + 'Field bulletPointsByLocale is not an array (or empty) for tutorial with id ' + + tutorialContent.id + ); + this.id = tutorialContent.id; + this.titleByLocale = ensureMessageByLocale(tutorialContent.titleByLocale); + this.bulletPointsByLocale = tutorialContent.bulletPointsByLocale.map( + /** @param {any} bulletPointByLocale */ + (bulletPointByLocale) => ensureMessageByLocale(bulletPointByLocale) + ); + this.availableLocales = tutorialContent.availableLocales; + this.initialTemplateUrl = tutorialContent.initialTemplateUrl; + this.initialProjectData = tutorialContent.initialProjectData; + this.editorSwitches = tutorialContent.editorSwitches; + this.endDialog = tutorialContent.endDialog; + this.isMiniTutorial = + tutorialContent.isMiniTutorial !== undefined + ? tutorialContent.isMiniTutorial + : true; + this.flow = tutorialContent.flow; } catch (error) { console.error( `An error occurred when reading tutorial file with path ${sourcePath}. The file might be corrupt.`, @@ -35,15 +82,55 @@ class InAppTutorial { } } + processFlowMetaSteps() { + /** @type {InAppTutorialFlowStep[]} */ + const newFlow = []; + this.flow.forEach((step) => { + if (!('metaKind' in step)) { + newFlow.push(step); + return; + } + newFlow.push(...translateMetaStep(step)); + }); + this.flow = newFlow; + } + /** * @returns {InAppTutorialShortHeader} */ buildShortHeader() { return { id: this.id, + titleByLocale: this.titleByLocale, + bulletPointsByLocale: this.bulletPointsByLocale, contentUrl: `https://resources.gdevelop-app.com/in-app-tutorials/${this.id}.json`, + availableLocales: this.availableLocales, + initialTemplateUrl: this.initialTemplateUrl, + initialProjectData: this.initialProjectData, + isMiniTutorial: this.isMiniTutorial, }; } + + toString() { + /** @type {InAppTutorialType} */ + const output = { + id: this.id, + titleByLocale: this.titleByLocale, + bulletPointsByLocale: this.bulletPointsByLocale, + flow: this.flow, + editorSwitches: this.editorSwitches, + endDialog: this.endDialog, + availableLocales: this.availableLocales, + isMiniTutorial: this.isMiniTutorial, + }; + if (this.initialTemplateUrl) { + output.initialTemplateUrl = this.initialTemplateUrl; + } + if (this.initialProjectData) { + output.initialProjectData = this.initialProjectData; + } + return JSON.stringify(output, null, 2); + } } module.exports = { InAppTutorial }; diff --git a/scripts/lib/LocalProjectOpener.js b/scripts/lib/LocalProjectOpener.js new file mode 100644 index 0000000..efd0f46 --- /dev/null +++ b/scripts/lib/LocalProjectOpener.js @@ -0,0 +1,15 @@ +/** @typedef {import('../types').libGDevelop} libGDevelop */ + +module.exports = { + /** + * @param {libGDevelop} gd + * @param {Object} projectObject + */ + loadSerializedProject: (gd, projectObject) => { + const serializedProject = gd.Serializer.fromJSObject(projectObject); + const newProject = gd.ProjectHelper.createNewGDJSProject(); + newProject.unserializeFrom(serializedProject); + + return newProject; + }, +}; diff --git a/scripts/lib/LocalProjectWriter.js b/scripts/lib/LocalProjectWriter.js new file mode 100644 index 0000000..9ed29d8 --- /dev/null +++ b/scripts/lib/LocalProjectWriter.js @@ -0,0 +1,50 @@ +const fs = require('fs'); + +/** @typedef {import('../types').libGDevelop} libGDevelop */ +/** @typedef {import('../types').gdProject} gdProject */ + +/** + * @param {libGDevelop} gd + * @param {any} serializable + * @param {string} methodName + * @returns {string} + */ +const serializeToJSON = (gd, serializable, methodName = 'serializeTo') => { + const serializedElement = new gd.SerializerElement(); + serializable[methodName](serializedElement); + // TODO: this could be speed up with a gd.Serializer.toPrettyJSON + // (and used in the IDE LocalProjectWriter.js too). + const json = JSON.stringify( + JSON.parse(gd.Serializer.toJSON(serializedElement)), + null, + 2 + ); + serializedElement.delete(); + + return json; +}; + +module.exports = { + /** + * @param {libGDevelop} gd + * @param {gdProject} project + * @param {string} filepath + * @returns {Promise} + */ + writeProjectJSONFile: (gd, project, filepath) => { + return new Promise((resolve, reject) => { + if (!fs) return reject('Not supported'); + + try { + const content = serializeToJSON(gd, project); + fs.writeFile(filepath, content, (err) => { + if (err) return reject(err); + + resolve(); + }); + } catch (e) { + return reject(e); + } + }); + }, +}; diff --git a/scripts/lib/MessageByLocale.js b/scripts/lib/MessageByLocale.js new file mode 100644 index 0000000..3fe74c5 --- /dev/null +++ b/scripts/lib/MessageByLocale.js @@ -0,0 +1,23 @@ +// @ts-check +/** @typedef {import("../types").MessageByLocale} MessageByLocale */ + +/** + * @param {any} messageByLocale + * @returns {MessageByLocale} + */ +const ensureMessageByLocale = (messageByLocale) => { + if (!messageByLocale) + throw new Error('A message is required and was not specified.'); + if (typeof messageByLocale === 'string') return { en: messageByLocale }; + if (typeof messageByLocale !== 'object') + throw new Error('The message is not an object'); + + if (typeof messageByLocale.en !== 'string') + throw new Error( + 'The message for key "en" is not specified (or not a string)' + ); + + return messageByLocale; +}; + +module.exports = { ensureMessageByLocale }; diff --git a/scripts/lib/MetaStepTranslator.js b/scripts/lib/MetaStepTranslator.js new file mode 100644 index 0000000..4101d98 --- /dev/null +++ b/scripts/lib/MetaStepTranslator.js @@ -0,0 +1,252 @@ +// @ts-check + +/** + * @typedef {import('../types').InAppTutorialFlowMetaStep} InAppTutorialFlowMetaStep + * @typedef {import('../types').InAppTutorialFlowStep} InAppTutorialFlowStep + */ + +/** + * @param {InAppTutorialFlowMetaStep} metaStep + * @returns {InAppTutorialFlowStep[]} + */ +const translateMetaStep = (metaStep) => { + switch (metaStep.metaKind) { + case 'launch-preview': + const isStandalone = + metaStep.nextStep !== 'previewLaunched' && + !!metaStep.nextStep.clickOnTooltipButton; + return [ + { + id: metaStep.id, + elementToHighlightId: '#toolbar-preview-button', + nextStepTrigger: + metaStep.nextStep === 'previewLaunched' + ? { + previewLaunched: true, + inGameMessage: metaStep.inGameMessage, + inGameTouchMessage: metaStep.inGameTouchMessage, + inGameMessagePosition: metaStep.inGameMessagePosition, + } + : { + clickOnTooltipButton: metaStep.nextStep.clickOnTooltipButton, + }, + tooltip: { + standalone: isStandalone, + description: metaStep.description || { + messageByLocale: { + en: "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + fr: 'Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.', + ar: 'حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.', + de: 'Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.', + es: '¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.', + fi: 'Olemme valmiita! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.', + it: 'abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.', + tr: 'Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.', + ja: '完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。', + ko: '우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.', + pl: 'Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.', + pt: 'Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.', + ru: 'Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.', + sl: 'Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.', + sq: 'Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.', + th: 'เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**', + uk: 'Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.', + zh: '我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。', + }, + }, + placement: isStandalone ? undefined : 'bottom', + }, + }, + ]; + case 'add-behavior': + return [ + { + elementToHighlightId: '#toolbar-open-objects-panel-button', + nextStepTrigger: { + presenceOfElement: '#add-new-object-button', + }, + tooltip: { + description: { + messageByLocale: { + en: 'Open the **Objects** panel.', + fr: 'Ouvrez le panneau des **objets**.', + ar: 'فتح لوحة **الكائنات**.', + de: 'Öffnen Sie das **Objekte**-Panel.', + es: 'Abre el panel de **objetos**.', + fi: 'Avaa **Objektit**-paneeli.', + it: 'Apri il pannello **Oggetti**.', + tr: 'Nesneler panelini açın.', + ja: '**オブジェクト**パネルを開いてください。', + ko: '**오브젝트** 패널을 엽니다.', + pl: 'Otwórz panel **Obiekty**.', + pt: 'Abra o painel de **objetos**.', + ru: 'Откройте панель **Объекты**.', + sl: 'Odpri panel **Predmeti**.', + sq: 'Hapni panelin e **objekteve**.', + th: 'เปิดแผงควบคุม **วัตถุ**', + uk: "Відкрийте панель **Об'єкти**.", + zh: '打开**对象**面板。', + }, + }, + placement: 'bottom', + mobilePlacement: 'top', + }, + skippable: true, + }, + { + elementToHighlightId: `objectInObjectsList:${metaStep.objectKey}`, + nextStepTrigger: { + presenceOfElement: '#object-editor-dialog', + }, + tooltip: { + placement: 'top', + description: metaStep.objectHighlightDescription, + ...(metaStep.objectHighlightTouchDescription + ? { touchDescription: metaStep.objectHighlightTouchDescription } + : undefined), + }, + }, + { + elementToHighlightId: '#behaviors-tab', + nextStepTrigger: { + presenceOfElement: '#add-behavior-button', + }, + tooltip: { + description: { + messageByLocale: { + en: 'See the **behaviors** of the **object** here.', + fr: "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + ar: 'رؤية **سلوكيات الكائن** من هنا.', + de: 'Sehen Sie sich die **Verhaltensweisen** des **Objekts** hier an.', + es: 'Los **comportamientos** del **objeto** se encuentran en esta pestaña.', + fi: 'Katso **objektin käyttäytymiset** täältä.', + it: "Vedi i **comportamenti** dell'**oggetto** qui.", + tr: '**Nesnenin** **davranışlarını** burada görün.', + ja: 'ここに **オブジェクト** の **動作** を見る。', + ko: '여기서 **객체**의 **동작**을 확인하세요.', + pl: 'Zobacz **akcje** **obiektu** tutaj.', + pt: 'Veja os **comportamentos** do **objeto** aqui.', + ru: 'Смотрите **поведение** **объекта** здесь.', + sl: 'Oglejte si **vedenja** **predmeta** tukaj.', + sq: 'Shikoje **veprimet** te **objektit** ketu.', + th: 'ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่', + uk: "Дивіться **поведінку** **об'єкта** тут.", + zh: '在这里查看 **对象** 的 **动作**。', + }, + }, + placement: 'bottom', + }, + skippable: true, + isOnClosableDialog: true, + }, + { + elementToHighlightId: '#add-behavior-button', + nextStepTrigger: { + presenceOfElement: metaStep.behaviorListItemId, + }, + tooltip: { + description: { + messageByLocale: { + en: `Let's add the **${metaStep.behaviorDisplayNameByLocale['en']}** behavior.`, + fr: `Ajoutons le comportement **${metaStep.behaviorDisplayNameByLocale['fr']}**.`, + ar: `هيّا نقوم بإضافة السلوك **${metaStep.behaviorDisplayNameByLocale['ar']}**.`, + de: `Fügen wir das **${metaStep.behaviorDisplayNameByLocale['de']}**-Verhalten hinzu.`, + es: `Agreguemos el comportamiento **${metaStep.behaviorDisplayNameByLocale['es']}**.`, + fi: `Lisätään **${metaStep.behaviorDisplayNameByLocale['fi']}**-käyttäytyminen.`, + it: `Aggiungiamo il comportamento **${metaStep.behaviorDisplayNameByLocale['it']}**.`, + tr: `**${metaStep.behaviorDisplayNameByLocale['tr']}** davranışını ekleyelim.`, + ja: `**${metaStep.behaviorDisplayNameByLocale['ja']}** の動作を追加しましょう。`, + ko: `**${metaStep.behaviorDisplayNameByLocale['ko']}** 동작을 추가해 봅시다.`, + pl: `Dodajmy zachowanie **${metaStep.behaviorDisplayNameByLocale['pl']}**.`, + pt: `Vamos adicionar o comportamento **${metaStep.behaviorDisplayNameByLocale['pt']}**.`, + ru: `Добавим **поведение ${metaStep.behaviorDisplayNameByLocale['ru']}**.`, + sl: `Dodajmo **vedenje ${metaStep.behaviorDisplayNameByLocale['sl']}**.`, + sq: `Hajde te shtojme **${metaStep.behaviorDisplayNameByLocale['sq']}** verpim.`, + th: `เพิ่ม **${metaStep.behaviorDisplayNameByLocale['th']}** พฤติกรรม`, + uk: `Додайте **поведінку ${metaStep.behaviorDisplayNameByLocale['uk']}**.`, + zh: `添加 **${metaStep.behaviorDisplayNameByLocale['zh']}** 动作。`, + }, + }, + }, + isOnClosableDialog: true, + }, + { + elementToHighlightId: metaStep.behaviorListItemId, + nextStepTrigger: { + presenceOfElement: metaStep.behaviorParameterPanelId, + }, + tooltip: { + description: { + messageByLocale: { + en: `Select the ${metaStep.behaviorDisplayNameByLocale['en']} behavior.`, + fr: `Sélectionnez le comportement ${metaStep.behaviorDisplayNameByLocale['fr']}.`, + ar: `تحديد السلوك ${metaStep.behaviorDisplayNameByLocale['ar']}.`, + de: `Wählen Sie das ${metaStep.behaviorDisplayNameByLocale['de']}-Verhalten aus.`, + es: `Selecciona el comportamiento ${metaStep.behaviorDisplayNameByLocale['es']}.`, + fi: `Valitse ${metaStep.behaviorDisplayNameByLocale['fi']} käyttäytyminen.`, + it: `Seleziona il comportamento ${metaStep.behaviorDisplayNameByLocale['it']}.`, + tr: `${metaStep.behaviorDisplayNameByLocale['tr']} davranışını seçin.`, + ja: `${metaStep.behaviorDisplayNameByLocale['ja']} の動作を選択します。`, + ko: `${metaStep.behaviorDisplayNameByLocale['ko']} 동작을 선택하세요.`, + pl: `Wybierz zachowanie ${metaStep.behaviorDisplayNameByLocale['pl']}.`, + pt: `Selecione o comportamento ${metaStep.behaviorDisplayNameByLocale['pt']}.`, + ru: `Выберите поведение ${metaStep.behaviorDisplayNameByLocale['ru']}.`, + sl: `Izberite vedenje ${metaStep.behaviorDisplayNameByLocale['sl']}.`, + sq: `Selekto ${metaStep.behaviorDisplayNameByLocale['sq']} veprim.`, + th: `เลือกพฤติกรรม ${metaStep.behaviorDisplayNameByLocale['th']}`, + uk: `Виберіть поведінку ${metaStep.behaviorDisplayNameByLocale['uk']}.`, + zh: `选择 ${metaStep.behaviorDisplayNameByLocale['zh']} 动作。`, + }, + }, + }, + isOnClosableDialog: true, + }, + ...(metaStep.parameters + ? metaStep.parameters.map((parameterData) => ({ + elementToHighlightId: `${metaStep.behaviorParameterPanelId} ${parameterData.parameterId}`, + nextStepTrigger: { + valueEquals: parameterData.expectedValue, + }, + tooltip: { + description: parameterData.description, + }, + isOnClosableDialog: true, + })) + : []), + { + elementToHighlightId: '#object-editor-dialog #apply-button', + nextStepTrigger: { + absenceOfElement: '#object-editor-dialog', + }, + tooltip: { + description: metaStep.finishedConfigurationDescription || { + messageByLocale: { + en: "We're done.", + fr: 'Nous avons terminé.', + ar: 'انتهينا.', + de: 'Wir sind fertig.', + es: 'Hemos terminado.', + fi: 'Olemme valmiita.', + it: 'Abbiamo finito.', + tr: 'Tamamlandık.', + ja: '完了です。', + ko: '끝났습니다.', + pl: 'Skończyliśmy.', + pt: 'Terminamos.', + ru: 'Мы закончили.', + sl: 'Končali smo.', + sq: 'Kemi përfunduar.', + th: 'เราเสร็จแล้ว', + uk: 'Ми закінчили.', + zh: '我们完成了。', + }, + }, + }, + }, + ]; + default: + return []; + } +}; + +exports.translateMetaStep = translateMetaStep; diff --git a/scripts/types.d.ts b/scripts/types.d.ts index 4e76b10..86e6c4d 100644 --- a/scripts/types.d.ts +++ b/scripts/types.d.ts @@ -1,4 +1,144 @@ +export type MessageByLocale = Record; + +export type TranslatedText = { + messageByLocale: MessageByLocale; +}; + export interface InAppTutorialShortHeader { id: string; + titleByLocale: MessageByLocale; + bulletPointsByLocale: Array; contentUrl: string; + availableLocales: Array; + initialTemplateUrl?: string; + initialProjectData?: Record; + isMiniTutorial: boolean; } + +export type InAppTutorialTooltip = { + placement?: 'bottom' | 'left' | 'right' | 'top'; + mobilePlacement?: 'bottom' | 'left' | 'right' | 'top'; + title?: TranslatedText; + description?: TranslatedText; + touchDescription?: TranslatedText; + standalone?: boolean; +}; + +type InAppTutorialFlowStepDOMChangeTrigger = + | { + presenceOfElement: string; + } + | { + absenceOfElement: string; + }; + +type AddBehaviorMetaStep = { + metaKind: 'add-behavior'; + objectKey: string; + behaviorListItemId: string; + behaviorParameterPanelId: string; + behaviorDisplayNameByLocale: MessageByLocale; + parameters: Array<{ + parameterId: string; + expectedValue: string; + description: TranslatedText; + }>; + objectHighlightDescription: TranslatedText; + objectHighlightTouchDescription?: TranslatedText; + finishedConfigurationDescription?: TranslatedText; +}; + +type LaunchPreviewMetaStep = { + id?: string; + metaKind: 'launch-preview'; + description?: TranslatedText; + inGameMessage?: TranslatedText; + inGameTouchMessage?: TranslatedText; + inGameMessagePosition?: string; + nextStep: + | 'previewLaunched' + | { + clickOnTooltipButton: TranslatedText; + }; +}; + +type InAppTutorialFlowMetaStep = AddBehaviorMetaStep | LaunchPreviewMetaStep; + +export type InAppTutorialFlowStepTrigger = + | InAppTutorialFlowStepDOMChangeTrigger + | { + valueHasChanged: true; + } + | { + valueEquals: string; + } + | { + objectAddedInLayout: true; + } + | { + instanceAddedOnScene: string; + instancesCount?: number; + } + | { + previewLaunched: true; + inGameMessage?: TranslatedText; + inGameTouchMessage?: TranslatedText; + inGameMessagePosition?: string; + } + | { + editorIsActive: string; + } + | { + clickOnTooltipButton: TranslatedText; + }; + +export type InAppTutorialFlowStepShortcutTrigger = + | InAppTutorialFlowStepDOMChangeTrigger + | { objectAddedInLayout: true }; + +export type InAppTutorialFlowStep = { + elementToHighlightId?: string; + id?: string; + isTriggerFlickering?: true; + deprecated?: true; + nextStepTrigger?: InAppTutorialFlowStepTrigger; + shortcuts?: Array<{ + stepId: string; + // TODO: Adapt provider to make it possible to use other triggers as shortcuts + trigger: InAppTutorialFlowStepShortcutTrigger; + }>; + mapProjectData?: Record; + tooltip?: InAppTutorialTooltip; + skippable?: true; + isOnClosableDialog?: boolean; +}; + +export type EditorIdentifier = 'Scene' | 'EventsSheet' | 'Home'; + +export type InAppTutorialEndDialog = { + content: Array< + | TranslatedText + | { + image: { + imageSource: string; + linkHref?: string; + }; + } + >; +}; + +export type InAppTutorial = { + id: string; + flow: Array; + editorSwitches: Record; + endDialog: InAppTutorialEndDialog; + availableLocales: Array; + initialTemplateUrl?: string; + initialProjectData?: Record; + isMiniTutorial: boolean; + titleByLocale: MessageByLocale; + bulletPointsByLocale: Array; +}; + +export type libGDevelop = any; +export type gdProject = any; diff --git a/templates/cameraParallax/assets/Flat dark joystick border.png b/templates/cameraParallax/assets/Flat dark joystick border.png new file mode 100644 index 0000000..5ddd717 Binary files /dev/null and b/templates/cameraParallax/assets/Flat dark joystick border.png differ diff --git a/templates/cameraParallax/assets/Flat dark joystick thumb.png b/templates/cameraParallax/assets/Flat dark joystick thumb.png new file mode 100644 index 0000000..36f5262 Binary files /dev/null and b/templates/cameraParallax/assets/Flat dark joystick thumb.png differ diff --git a/templates/cameraParallax/assets/Ground.png b/templates/cameraParallax/assets/Ground.png new file mode 100644 index 0000000..1b785cc Binary files /dev/null and b/templates/cameraParallax/assets/Ground.png differ diff --git a/templates/cameraParallax/assets/Idle-1.png b/templates/cameraParallax/assets/Idle-1.png new file mode 100644 index 0000000..4d2a087 Binary files /dev/null and b/templates/cameraParallax/assets/Idle-1.png differ diff --git a/templates/cameraParallax/assets/Idle-2.png b/templates/cameraParallax/assets/Idle-2.png new file mode 100644 index 0000000..d0ef470 Binary files /dev/null and b/templates/cameraParallax/assets/Idle-2.png differ diff --git a/templates/cameraParallax/assets/Idle-3.png b/templates/cameraParallax/assets/Idle-3.png new file mode 100644 index 0000000..51436d7 Binary files /dev/null and b/templates/cameraParallax/assets/Idle-3.png differ diff --git a/templates/cameraParallax/assets/Idle-4.png b/templates/cameraParallax/assets/Idle-4.png new file mode 100644 index 0000000..d0ef470 Binary files /dev/null and b/templates/cameraParallax/assets/Idle-4.png differ diff --git a/templates/cameraParallax/assets/Jump-1.png b/templates/cameraParallax/assets/Jump-1.png new file mode 100644 index 0000000..3ca1ab3 Binary files /dev/null and b/templates/cameraParallax/assets/Jump-1.png differ diff --git a/templates/cameraParallax/assets/Jump-2.png b/templates/cameraParallax/assets/Jump-2.png new file mode 100644 index 0000000..6c899a8 Binary files /dev/null and b/templates/cameraParallax/assets/Jump-2.png differ diff --git a/templates/cameraParallax/assets/Jump-3.png b/templates/cameraParallax/assets/Jump-3.png new file mode 100644 index 0000000..3193d64 Binary files /dev/null and b/templates/cameraParallax/assets/Jump-3.png differ diff --git a/templates/cameraParallax/assets/Jump-4.png b/templates/cameraParallax/assets/Jump-4.png new file mode 100644 index 0000000..8342e3d Binary files /dev/null and b/templates/cameraParallax/assets/Jump-4.png differ diff --git a/templates/cameraParallax/assets/Run-1.png b/templates/cameraParallax/assets/Run-1.png new file mode 100644 index 0000000..edb8c90 Binary files /dev/null and b/templates/cameraParallax/assets/Run-1.png differ diff --git a/templates/cameraParallax/assets/Run-2.png b/templates/cameraParallax/assets/Run-2.png new file mode 100644 index 0000000..cdcc106 Binary files /dev/null and b/templates/cameraParallax/assets/Run-2.png differ diff --git a/templates/cameraParallax/assets/Run-3.png b/templates/cameraParallax/assets/Run-3.png new file mode 100644 index 0000000..18c1579 Binary files /dev/null and b/templates/cameraParallax/assets/Run-3.png differ diff --git a/templates/cameraParallax/assets/Run-4.png b/templates/cameraParallax/assets/Run-4.png new file mode 100644 index 0000000..aaa6236 Binary files /dev/null and b/templates/cameraParallax/assets/Run-4.png differ diff --git a/templates/cameraParallax/assets/Run-5.png b/templates/cameraParallax/assets/Run-5.png new file mode 100644 index 0000000..eccbc40 Binary files /dev/null and b/templates/cameraParallax/assets/Run-5.png differ diff --git a/templates/cameraParallax/assets/Run-6.png b/templates/cameraParallax/assets/Run-6.png new file mode 100644 index 0000000..5915a6d Binary files /dev/null and b/templates/cameraParallax/assets/Run-6.png differ diff --git a/templates/cameraParallax/assets/Top arrow button.png b/templates/cameraParallax/assets/Top arrow button.png new file mode 100644 index 0000000..7e5dc75 Binary files /dev/null and b/templates/cameraParallax/assets/Top arrow button.png differ diff --git a/templates/cameraParallax/assets/WallLeft.png b/templates/cameraParallax/assets/WallLeft.png new file mode 100644 index 0000000..ea3766a Binary files /dev/null and b/templates/cameraParallax/assets/WallLeft.png differ diff --git a/templates/cameraParallax/assets/WallRight.png b/templates/cameraParallax/assets/WallRight.png new file mode 100644 index 0000000..20463b7 Binary files /dev/null and b/templates/cameraParallax/assets/WallRight.png differ diff --git a/templates/cameraParallax/assets/You Win.png b/templates/cameraParallax/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/cameraParallax/assets/You Win.png differ diff --git a/templates/cameraParallax/assets/clouds-1.png b/templates/cameraParallax/assets/clouds-1.png new file mode 100644 index 0000000..299dae1 Binary files /dev/null and b/templates/cameraParallax/assets/clouds-1.png differ diff --git a/templates/cameraParallax/assets/town-1.png b/templates/cameraParallax/assets/town-1.png new file mode 100644 index 0000000..1646859 Binary files /dev/null and b/templates/cameraParallax/assets/town-1.png differ diff --git a/templates/cameraParallax/game.json b/templates/cameraParallax/game.json new file mode 100644 index 0000000..52ed8e8 --- /dev/null +++ b/templates/cameraParallax/game.json @@ -0,0 +1,17528 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 226, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.cameraparallaxtutorial", + "pixelsRounding": true, + "projectUuid": "fec2302d-bab6-4c3c-9708-53638b91d17a", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "camera-parallax-tutorial", + "version": "1.0.0", + "name": "Camera Parallax Tutorial", + "description": "", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/clouds-1.png", + "kind": "image", + "metadata": "", + "name": "clouds-1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Ground.png", + "kind": "image", + "metadata": "", + "name": "assets\\Ground.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-1.png", + "kind": "image", + "metadata": "", + "name": "Run-1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-2.png", + "kind": "image", + "metadata": "", + "name": "Run-2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-3.png", + "kind": "image", + "metadata": "", + "name": "Run-3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-3.png", + "kind": "image", + "metadata": "", + "name": "Run-4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-5.png", + "kind": "image", + "metadata": "", + "name": "Run-5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Run-6.png", + "kind": "image", + "metadata": "", + "name": "Run-6.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Idle-1.png", + "kind": "image", + "metadata": "", + "name": "Idle-1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Idle-2.png", + "kind": "image", + "metadata": "", + "name": "Idle-2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Idle-3.png", + "kind": "image", + "metadata": "", + "name": "Idle-3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Idle-4.png", + "kind": "image", + "metadata": "", + "name": "Idle-4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/town-1.png", + "kind": "image", + "metadata": "", + "name": "town-1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/WallRight.png", + "kind": "image", + "metadata": "", + "name": "assets\\WallRight.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/WallLeft.png", + "kind": "image", + "metadata": "", + "name": "assets\\WallLeft.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Jump-1.png", + "kind": "image", + "metadata": "", + "name": "Jump-1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Jump-2.png", + "kind": "image", + "metadata": "", + "name": "Jump-2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Jump-3.png", + "kind": "image", + "metadata": "", + "name": "Jump-3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Jump-4.png", + "kind": "image", + "metadata": "", + "name": "Jump-4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Top arrow button.png", + "kind": "image", + "metadata": "", + "name": "Top arrow button.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Flat Dark/e3943e1b23ceb90f00fc5e7c0481c5147b983fdc5397fb3690e102e53ce72d4f_Top arrow button.png", + "name": "Top arrow button.png" + } + }, + { + "file": "assets/Flat dark joystick border.png", + "kind": "image", + "metadata": "", + "name": "Flat dark joystick border.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/1db606cabd7372d1494ba5934bc25bcdd72f5a213c4a27509be57c3f4d5aecca_Flat dark joystick border.png", + "name": "Flat dark joystick border.png" + } + }, + { + "file": "assets/Flat dark joystick thumb.png", + "kind": "image", + "metadata": "", + "name": "Flat dark joystick thumb.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/10167ade22c4a6b48324e6c1d1bd6dc74179d7bed0775890903f418b4a05c8a1_Flat dark joystick thumb.png", + "name": "Flat dark joystick thumb.png" + } + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": false, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 206, + "disableInputWhenNotFocused": true, + "mangledName": "CameraScene", + "name": "CameraScene", + "r": 206, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 206, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.22993261354593675, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "Floor", + "persistentUuid": "dfe30617-73ce-4f7b-a10b-088538a5f43f", + "width": 3024, + "x": -848, + "y": 592, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 188, + "layer": "", + "name": "PlayerObject", + "persistentUuid": "ded74885-118b-4e48-9502-bd9705db2ff1", + "width": 304, + "x": 496, + "y": 400, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 752, + "layer": "", + "name": "WallRight", + "persistentUuid": "f42afc91-037c-490c-9cdf-d59187bcfa4c", + "width": 128, + "x": 2096, + "y": -32, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 752, + "layer": "", + "name": "WallLeft", + "persistentUuid": "3f9c0613-c0a3-41a6-b964-b4c19ca574ee", + "width": 128, + "x": -848, + "y": -32, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "Joysticks", + "name": "FlatDarkJoystick", + "persistentUuid": "6d41f662-4b75-44d8-8e07-7c623047ffe5", + "width": 0, + "x": 122, + "y": 596, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 166, + "layer": "Joysticks", + "name": "TopArrowButton", + "persistentUuid": "304abd69-5c72-4f7a-bb10-81b7277fd360", + "width": 166, + "x": 1089, + "y": 508, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "PlayerObject", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "Property": "PlatformerObject", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "JumpButton": "A" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "acceleration": 1500, + "maxSpeed": 450, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 2000, + "gravity": 1000, + "ignoreDefaultControls": false, + "jumpSpeed": 600, + "jumpSustainTime": 0.2, + "ladderClimbingSpeed": 150, + "maxFallingSpeed": 700, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.2, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Idle-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Idle-2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Idle-3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Idle-4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Run-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Run-2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Run-3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Run-4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Run-5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Run-6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 154, + "y": 52 + }, + { + "x": 266, + "y": 52 + }, + { + "x": 266, + "y": 236 + }, + { + "x": 154, + "y": 236 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.2, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Jump-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Jump-2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Jump-3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Jump-4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 320, + "name": "FarBackground", + "texture": "clouds-1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 320, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 640, + "name": "MidBackground", + "texture": "town-1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 640, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Floor", + "texture": "assets\\Ground.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "WallRight", + "texture": "assets\\WallRight.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "WallLeft", + "texture": "assets\\WallLeft.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "9c727020616afdd6ba786b8af206a90481f07db0ca175ed6a4cc5b7e01c66d06", + "name": "TopArrowButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "A", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Top arrow button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "e71bd69f896d6c7531b48c65ceb5da25071d4fbdeb518aeceecba8d21f34ed8d", + "name": "FlatDarkJoystick", + "type": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "variables": [], + "effects": [], + "behaviors": [], + "content": {}, + "childrenContent": { + "Border": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat dark joystick border.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + "Thumb": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat dark joystick thumb.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + } + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "PlayerObject" + }, + { + "objectName": "FarBackground" + }, + { + "objectName": "MidBackground" + }, + { + "objectName": "Floor" + }, + { + "objectName": "WallRight" + }, + { + "objectName": "WallLeft" + }, + { + "objectName": "TopArrowButton" + }, + { + "objectName": "FlatDarkJoystick" + }, + { + "objectName": "EndingDialog" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the offset of the background" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Movement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change default background color" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SceneBackground" + }, + "parameters": [ + "", + "\"24;18;32\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "HideLayer" + }, + "parameters": [ + "TopArrowButton", + "\"Joysticks\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Player animations" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "PlayerObject", + "\"Run\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "PlayerObject", + "\"Jump\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "PlayerObject", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject", + "<", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "PlayerObject", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "PlayerObject", + "PlatformerObject", + ">", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "PlayerObject", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Force camera to stay within the boundaries" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ClampCamera" + }, + "parameters": [ + "", + "WallLeft.BoundingBoxLeft()", + "0", + "WallRight.BoundingBoxRight()", + "Floor.BoundingBoxBottom()", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BehaviorActivated" + }, + "parameters": [ + "PlayerObject", + "SmoothCamera" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "PlayerObject", + "FarBackground", + "", + "", + "" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "PlayerObject", + "MidBackground", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "10" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "EndingDialog", + "EndingDialog", + "0", + "0", + "\"UI\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraWidth(\"UI\", 1)/2", + "=", + "CameraHeight(\"UI\", 1)/2" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Background", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 0, + "ambientLightColorG": 8823888, + "ambientLightColorR": 16, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 12053944, + "ambientLightColorG": 6068784, + "ambientLightColorR": 12533720, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Joysticks", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior" + }, + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": "", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.1.3", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "GetArgumentAsString(\"ButtonState\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone", + "=", + "GetArgumentAsNumber(\"DeadZoneRadius\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyDeadZoneRadius()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Resumed!!!\"", + "", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickForce()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickAngle()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyControllerIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyDeadZoneRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyButtonIdentifier()", + "GetArgumentAsString(\"ButtonState\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "description": "", + "group": "", + "extraInformation": [], + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsReleased" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJumpButton()", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::JoystickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "SpriteMultitouchJoystick::JoystickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::JoystickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "sign(SpriteMultitouchJoystick::JoystickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier()))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "description": "", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyControllerIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyJoystickIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyDeadZoneRadius()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsString(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ParentOrigin" + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [] + } + ] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "description": "", + "group": "", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/tutorials/follow-player-with-camera/", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.4.1", + "description": [ + "The camera follows an object according to:", + "- a frame rate independent catch-up speed to make the scrolling from smooth to strong", + "- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object", + "- a follow-free zone to avoid scrolling on small movements", + "- an offset to see further in one direction", + "- an extra delay and catch-up speed to give an impression of speed (useful for dash)", + "- position forecasting and delay to simulate a cameraman response time", + "", + "A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping." + ], + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth", + "platformer", + "platform" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "name": "SmoothCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "LeftwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "RightwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "UpwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "DownwardSpeed", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "LeftwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "RightwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "UpwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "DownwardSpeedMax", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaLeft", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaRight", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaTop", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "FollowFreeAreaBottom", + "log(1 - )" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelay", + "=", + "CameraDelay" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "IsCalledManually", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsCalledManually", + "True", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "FollowOnX", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * LogLeftwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "OldX - LeftwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "OldX - LeftwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * LogRightwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "OldX + RightwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "OldX + RightwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "FollowOnY", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * LogUpwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "OldY - UpwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "OldY - UpwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * LogDownwardSpeed)", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "OldY + DownwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "OldY + DownwardSpeedMax * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingEnd", + "=", + "TimeFromStart() + NewWaitingDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingSpeedXMax", + "=", + "NewWaitingSpeedXMax" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "WaitingSpeedYMax", + "=", + "NewWaitingSpeedYMax" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelayCatchUpDuration", + "=", + "NewCatchUpDuration" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "NewWaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "NewWaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "NewWaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "NewCatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Index])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forecasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "ProjectedOldestX", + "ProjectedOldestY", + "ProjectedNewestX", + "ProjectedNewestY", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "ForecastedX", + "ForecastedY", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnX", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnX", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnY", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "FollowOnY", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaTop", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaTop", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaTop", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FollowFreeAreaBottom", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LeftwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LeftwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UpwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DownwardSpeedMax", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LeftwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogLeftwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RightwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogRightwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DownwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogDownwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UpwardSpeed", + "=", + "clamp(0, 1, Value)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LogUpwardSpeed", + "=", + "log(1 - Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset X", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetX", + "sentence": "the camera offset on X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraOffsetX" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetX", + "name": "SetOffsetXOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraOffsetX", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "private": true, + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetXOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetXOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset Y", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetY", + "sentence": "the camera offset on Y axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraOffsetY" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetY", + "name": "SetOffsetYOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetYOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraOffsetY", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "private": true, + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetYOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraOffsetY", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastTime", + "=", + "min(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelay", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedX + CameraOffsetX - FollowFreeAreaLeft" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedX + CameraOffsetX + FollowFreeAreaRight" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedY + CameraOffsetY + FollowFreeAreaBottom" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ForecastedY + CameraOffsetY - FollowFreeAreaTop" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + "+", + "max(0, TimeDelta() * (1 - min(WaitingSpeedXMax * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), WaitingSpeedYMax * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(CameraExtraDelay)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterX", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DelayedCenterY", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDelayCatchUpSpeed", + "=", + "CameraExtraDelay / CameraDelayCatchUpDuration" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraExtraDelay", + "=", + "max(0, CameraExtraDelay -CameraDelayCatchUpSpeed * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(CameraExtraDelay)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CameraDelay + CameraExtraDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "WaitingEnd", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "Time" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "ObjectY" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - CameraDelay - CameraExtraDelay - ForecastHistoryDuration" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanX", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Index])" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryMeanY", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(ForecastHistoryMeanX) + \" \" + ToString(ForecastHistoryMeanY)", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceX", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceY", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryCovariance", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceX", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX, 2)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryVarianceY", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY, 2)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryCovariance", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Index]) - ForecastHistoryMeanX)\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Index]) - ForecastHistoryMeanY)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(ForecastHistoryVarianceX) + \" \" + ToString(ForecastHistoryVarianceY) + \" \" + ToString(ForecastHistoryCovariance)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + "<", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceY)", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "DelayedCenterX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "DelayedCenterY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + ">=", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceY)", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + ">=", + "abs(ForecastHistoryVarianceY)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearA", + "=", + "ForecastHistoryCovariance / ForecastHistoryVarianceX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearB", + "=", + "ForecastHistoryMeanY - ForecastHistoryLinearA * ForecastHistoryMeanX" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(ForecastHistoryVarianceX)", + "<", + "abs(ForecastHistoryVarianceY)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearA", + "=", + "ForecastHistoryCovariance / ForecastHistoryVarianceY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastHistoryLinearB", + "=", + "ForecastHistoryMeanX - ForecastHistoryLinearA * ForecastHistoryMeanY" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(ForecastHistoryLinearA) + \" \" + ToString(ForecastHistoryLinearB)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "ProjectedOldestX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestX", + "=", + "ProjectedOldestY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestY", + "=", + "Index" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "ProjectedNewestX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestX", + "=", + "ProjectedNewestY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestY", + "=", + "Index" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(ProjectedOldestX) + \" \" + ToString(ProjectedOldestY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(ProjectedNewestX) + \" \" + ToString(ProjectedNewestY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forecasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedX", + "=", + "ProjectedNewestX + ( ProjectedNewestX - ProjectedOldestX) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ForecastedY", + "=", + "ProjectedNewestY + ( ProjectedNewestY - ProjectedOldestY) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(ForecastedX) + \" \" + ToString(ForecastedY)", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestX", + "=", + "(NewestX + (NewestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedNewestY", + "=", + "NewestY + (NewestX * ForecastHistoryLinearA - NewestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestX", + "=", + "(OldestX + (OldestY - ForecastHistoryLinearB) * ForecastHistoryLinearA) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ProjectedOldestY", + "=", + "OldestY + (OldestX * ForecastHistoryLinearA - OldestY \n+ ForecastHistoryLinearB) / (1 + pow(ForecastHistoryLinearA, 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- ForecastTime / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area left border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area right border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset X", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset Y", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Camera delay", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast time", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast history duration", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Leftward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Rightward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsCalledManually" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "name": "SmoothPlatformerCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorFollowFreeAreaTop", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorFollowFreeAreaBottom", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorUpwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorDownwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorUpwardSpeedMax", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "FloorDownwardSpeedMax", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirFollowFreeAreaTop", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirFollowFreeAreaBottom", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirUpwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirDownwardSpeed", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirUpwardSpeedMax", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "AirDownwardSpeedMax", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "description": "", + "group": "", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorDownwardSpeedMax" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} diff --git a/templates/coopPlatformer/assets/CantoraOne-Regular.ttf b/templates/coopPlatformer/assets/CantoraOne-Regular.ttf new file mode 100644 index 0000000..57446a2 Binary files /dev/null and b/templates/coopPlatformer/assets/CantoraOne-Regular.ttf differ diff --git a/templates/coopPlatformer/assets/Coin.wav b/templates/coopPlatformer/assets/Coin.wav new file mode 100644 index 0000000..6a09175 Binary files /dev/null and b/templates/coopPlatformer/assets/Coin.wav differ diff --git a/templates/coopPlatformer/assets/Death.wav b/templates/coopPlatformer/assets/Death.wav new file mode 100644 index 0000000..15097fa Binary files /dev/null and b/templates/coopPlatformer/assets/Death.wav differ diff --git a/templates/coopPlatformer/assets/Door Opening.wav b/templates/coopPlatformer/assets/Door Opening.wav new file mode 100644 index 0000000..119420b Binary files /dev/null and b/templates/coopPlatformer/assets/Door Opening.wav differ diff --git a/templates/coopPlatformer/assets/Door1.png b/templates/coopPlatformer/assets/Door1.png new file mode 100644 index 0000000..3884613 Binary files /dev/null and b/templates/coopPlatformer/assets/Door1.png differ diff --git a/templates/coopPlatformer/assets/Door2.png b/templates/coopPlatformer/assets/Door2.png new file mode 100644 index 0000000..e498725 Binary files /dev/null and b/templates/coopPlatformer/assets/Door2.png differ diff --git a/templates/coopPlatformer/assets/DoorOpen.wav b/templates/coopPlatformer/assets/DoorOpen.wav new file mode 100644 index 0000000..f2c2323 Binary files /dev/null and b/templates/coopPlatformer/assets/DoorOpen.wav differ diff --git a/templates/coopPlatformer/assets/Fire1.png b/templates/coopPlatformer/assets/Fire1.png new file mode 100644 index 0000000..d78dbed Binary files /dev/null and b/templates/coopPlatformer/assets/Fire1.png differ diff --git a/templates/coopPlatformer/assets/Fire2.png b/templates/coopPlatformer/assets/Fire2.png new file mode 100644 index 0000000..a5f6d0d Binary files /dev/null and b/templates/coopPlatformer/assets/Fire2.png differ diff --git a/templates/coopPlatformer/assets/Fire3.png b/templates/coopPlatformer/assets/Fire3.png new file mode 100644 index 0000000..2706033 Binary files /dev/null and b/templates/coopPlatformer/assets/Fire3.png differ diff --git a/templates/coopPlatformer/assets/Fire4.png b/templates/coopPlatformer/assets/Fire4.png new file mode 100644 index 0000000..628d83b Binary files /dev/null and b/templates/coopPlatformer/assets/Fire4.png differ diff --git a/templates/coopPlatformer/assets/Green Button With Shadow_Hovered.png b/templates/coopPlatformer/assets/Green Button With Shadow_Hovered.png new file mode 100644 index 0000000..3fbae00 Binary files /dev/null and b/templates/coopPlatformer/assets/Green Button With Shadow_Hovered.png differ diff --git a/templates/coopPlatformer/assets/Green Button With Shadow_Idle.png b/templates/coopPlatformer/assets/Green Button With Shadow_Idle.png new file mode 100644 index 0000000..f4f475c Binary files /dev/null and b/templates/coopPlatformer/assets/Green Button With Shadow_Idle.png differ diff --git a/templates/coopPlatformer/assets/Green Button With Shadow_Pressed.png b/templates/coopPlatformer/assets/Green Button With Shadow_Pressed.png new file mode 100644 index 0000000..5f24ead Binary files /dev/null and b/templates/coopPlatformer/assets/Green Button With Shadow_Pressed.png differ diff --git a/templates/coopPlatformer/assets/Knight-Death1.png b/templates/coopPlatformer/assets/Knight-Death1.png new file mode 100644 index 0000000..16e50a0 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Death1.png differ diff --git a/templates/coopPlatformer/assets/Knight-Death2.png b/templates/coopPlatformer/assets/Knight-Death2.png new file mode 100644 index 0000000..6d23ee0 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Death2.png differ diff --git a/templates/coopPlatformer/assets/Knight-Death3.png b/templates/coopPlatformer/assets/Knight-Death3.png new file mode 100644 index 0000000..895d18d Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Death3.png differ diff --git a/templates/coopPlatformer/assets/Knight-Death4.png b/templates/coopPlatformer/assets/Knight-Death4.png new file mode 100644 index 0000000..c7bf120 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Death4.png differ diff --git a/templates/coopPlatformer/assets/Knight-Idle1.png b/templates/coopPlatformer/assets/Knight-Idle1.png new file mode 100644 index 0000000..66dfada Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Idle1.png differ diff --git a/templates/coopPlatformer/assets/Knight-Idle2.png b/templates/coopPlatformer/assets/Knight-Idle2.png new file mode 100644 index 0000000..bb5d74b Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Idle2.png differ diff --git a/templates/coopPlatformer/assets/Knight-Idle3.png b/templates/coopPlatformer/assets/Knight-Idle3.png new file mode 100644 index 0000000..3864fc7 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Idle3.png differ diff --git a/templates/coopPlatformer/assets/Knight-Idle4.png b/templates/coopPlatformer/assets/Knight-Idle4.png new file mode 100644 index 0000000..bb5d74b Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Idle4.png differ diff --git a/templates/coopPlatformer/assets/Knight-Roll4.png b/templates/coopPlatformer/assets/Knight-Roll4.png new file mode 100644 index 0000000..130e559 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Roll4.png differ diff --git a/templates/coopPlatformer/assets/Knight-Roll5.png b/templates/coopPlatformer/assets/Knight-Roll5.png new file mode 100644 index 0000000..a88d4e9 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Roll5.png differ diff --git a/templates/coopPlatformer/assets/Knight-Roll6.png b/templates/coopPlatformer/assets/Knight-Roll6.png new file mode 100644 index 0000000..8d00971 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Roll6.png differ diff --git a/templates/coopPlatformer/assets/Knight-Roll7.png b/templates/coopPlatformer/assets/Knight-Roll7.png new file mode 100644 index 0000000..373803c Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Roll7.png differ diff --git a/templates/coopPlatformer/assets/Knight-Roll8.png b/templates/coopPlatformer/assets/Knight-Roll8.png new file mode 100644 index 0000000..aa77cdf Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Roll8.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run1.png b/templates/coopPlatformer/assets/Knight-Run1.png new file mode 100644 index 0000000..5b8f984 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run1.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run10.png b/templates/coopPlatformer/assets/Knight-Run10.png new file mode 100644 index 0000000..ab25d29 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run10.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run11.png b/templates/coopPlatformer/assets/Knight-Run11.png new file mode 100644 index 0000000..77401ec Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run11.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run12.png b/templates/coopPlatformer/assets/Knight-Run12.png new file mode 100644 index 0000000..da152fe Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run12.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run13.png b/templates/coopPlatformer/assets/Knight-Run13.png new file mode 100644 index 0000000..b154891 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run13.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run14.png b/templates/coopPlatformer/assets/Knight-Run14.png new file mode 100644 index 0000000..2ee3938 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run14.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run15.png b/templates/coopPlatformer/assets/Knight-Run15.png new file mode 100644 index 0000000..77401ec Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run15.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run16.png b/templates/coopPlatformer/assets/Knight-Run16.png new file mode 100644 index 0000000..a5ae757 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run16.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run2.png b/templates/coopPlatformer/assets/Knight-Run2.png new file mode 100644 index 0000000..d99791f Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run2.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run3.png b/templates/coopPlatformer/assets/Knight-Run3.png new file mode 100644 index 0000000..ec454e1 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run3.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run4.png b/templates/coopPlatformer/assets/Knight-Run4.png new file mode 100644 index 0000000..2323592 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run4.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run5.png b/templates/coopPlatformer/assets/Knight-Run5.png new file mode 100644 index 0000000..ee4489c Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run5.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run6.png b/templates/coopPlatformer/assets/Knight-Run6.png new file mode 100644 index 0000000..abd57c6 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run6.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run7.png b/templates/coopPlatformer/assets/Knight-Run7.png new file mode 100644 index 0000000..1a28a78 Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run7.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run8.png b/templates/coopPlatformer/assets/Knight-Run8.png new file mode 100644 index 0000000..744225e Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run8.png differ diff --git a/templates/coopPlatformer/assets/Knight-Run9.png b/templates/coopPlatformer/assets/Knight-Run9.png new file mode 100644 index 0000000..523a39f Binary files /dev/null and b/templates/coopPlatformer/assets/Knight-Run9.png differ diff --git a/templates/coopPlatformer/assets/Left arrow round button.png b/templates/coopPlatformer/assets/Left arrow round button.png new file mode 100644 index 0000000..d718b54 Binary files /dev/null and b/templates/coopPlatformer/assets/Left arrow round button.png differ diff --git a/templates/coopPlatformer/assets/NewSprite-1-0.png b/templates/coopPlatformer/assets/NewSprite-1-0.png new file mode 100644 index 0000000..85908c3 Binary files /dev/null and b/templates/coopPlatformer/assets/NewSprite-1-0.png differ diff --git a/templates/coopPlatformer/assets/PlatformDirtdoor1.png b/templates/coopPlatformer/assets/PlatformDirtdoor1.png new file mode 100644 index 0000000..039e9bf Binary files /dev/null and b/templates/coopPlatformer/assets/PlatformDirtdoor1.png differ diff --git a/templates/coopPlatformer/assets/PlatformDirtdoor2.png b/templates/coopPlatformer/assets/PlatformDirtdoor2.png new file mode 100644 index 0000000..f4b797c Binary files /dev/null and b/templates/coopPlatformer/assets/PlatformDirtdoor2.png differ diff --git a/templates/coopPlatformer/assets/Platform_Bridge.png b/templates/coopPlatformer/assets/Platform_Bridge.png new file mode 100644 index 0000000..3a7a3c1 Binary files /dev/null and b/templates/coopPlatformer/assets/Platform_Bridge.png differ diff --git a/templates/coopPlatformer/assets/Platform_Stone2.png b/templates/coopPlatformer/assets/Platform_Stone2.png new file mode 100644 index 0000000..8bba308 Binary files /dev/null and b/templates/coopPlatformer/assets/Platform_Stone2.png differ diff --git a/templates/coopPlatformer/assets/Platform_Stone3.png b/templates/coopPlatformer/assets/Platform_Stone3.png new file mode 100644 index 0000000..64fbfa0 Binary files /dev/null and b/templates/coopPlatformer/assets/Platform_Stone3.png differ diff --git a/templates/coopPlatformer/assets/RestartPoint.png b/templates/coopPlatformer/assets/RestartPoint.png new file mode 100644 index 0000000..51eac89 Binary files /dev/null and b/templates/coopPlatformer/assets/RestartPoint.png differ diff --git a/templates/coopPlatformer/assets/Right arrow round button.png b/templates/coopPlatformer/assets/Right arrow round button.png new file mode 100644 index 0000000..23a8e4c Binary files /dev/null and b/templates/coopPlatformer/assets/Right arrow round button.png differ diff --git a/templates/coopPlatformer/assets/Shadow.png b/templates/coopPlatformer/assets/Shadow.png new file mode 100644 index 0000000..e26a9ff Binary files /dev/null and b/templates/coopPlatformer/assets/Shadow.png differ diff --git a/templates/coopPlatformer/assets/Spikes.png b/templates/coopPlatformer/assets/Spikes.png new file mode 100644 index 0000000..b050251 Binary files /dev/null and b/templates/coopPlatformer/assets/Spikes.png differ diff --git a/templates/coopPlatformer/assets/Top arrow button.png b/templates/coopPlatformer/assets/Top arrow button.png new file mode 100644 index 0000000..7e5dc75 Binary files /dev/null and b/templates/coopPlatformer/assets/Top arrow button.png differ diff --git a/templates/coopPlatformer/assets/coin1.png b/templates/coopPlatformer/assets/coin1.png new file mode 100644 index 0000000..49baf2d Binary files /dev/null and b/templates/coopPlatformer/assets/coin1.png differ diff --git a/templates/coopPlatformer/assets/coin10.png b/templates/coopPlatformer/assets/coin10.png new file mode 100644 index 0000000..0e79baf Binary files /dev/null and b/templates/coopPlatformer/assets/coin10.png differ diff --git a/templates/coopPlatformer/assets/coin11.png b/templates/coopPlatformer/assets/coin11.png new file mode 100644 index 0000000..98ff488 Binary files /dev/null and b/templates/coopPlatformer/assets/coin11.png differ diff --git a/templates/coopPlatformer/assets/coin12.png b/templates/coopPlatformer/assets/coin12.png new file mode 100644 index 0000000..2b85e5d Binary files /dev/null and b/templates/coopPlatformer/assets/coin12.png differ diff --git a/templates/coopPlatformer/assets/coin2.png b/templates/coopPlatformer/assets/coin2.png new file mode 100644 index 0000000..760b7cd Binary files /dev/null and b/templates/coopPlatformer/assets/coin2.png differ diff --git a/templates/coopPlatformer/assets/coin3.png b/templates/coopPlatformer/assets/coin3.png new file mode 100644 index 0000000..98ff488 Binary files /dev/null and b/templates/coopPlatformer/assets/coin3.png differ diff --git a/templates/coopPlatformer/assets/coin4.png b/templates/coopPlatformer/assets/coin4.png new file mode 100644 index 0000000..55a64d9 Binary files /dev/null and b/templates/coopPlatformer/assets/coin4.png differ diff --git a/templates/coopPlatformer/assets/coin5.png b/templates/coopPlatformer/assets/coin5.png new file mode 100644 index 0000000..7cfa110 Binary files /dev/null and b/templates/coopPlatformer/assets/coin5.png differ diff --git a/templates/coopPlatformer/assets/coin6.png b/templates/coopPlatformer/assets/coin6.png new file mode 100644 index 0000000..6490c6b Binary files /dev/null and b/templates/coopPlatformer/assets/coin6.png differ diff --git a/templates/coopPlatformer/assets/coin7.png b/templates/coopPlatformer/assets/coin7.png new file mode 100644 index 0000000..de1aa58 Binary files /dev/null and b/templates/coopPlatformer/assets/coin7.png differ diff --git a/templates/coopPlatformer/assets/coin8.png b/templates/coopPlatformer/assets/coin8.png new file mode 100644 index 0000000..6490c6b Binary files /dev/null and b/templates/coopPlatformer/assets/coin8.png differ diff --git a/templates/coopPlatformer/assets/coin9.png b/templates/coopPlatformer/assets/coin9.png new file mode 100644 index 0000000..7cfa110 Binary files /dev/null and b/templates/coopPlatformer/assets/coin9.png differ diff --git a/templates/coopPlatformer/assets/slime_green_walk1.png b/templates/coopPlatformer/assets/slime_green_walk1.png new file mode 100644 index 0000000..43da875 Binary files /dev/null and b/templates/coopPlatformer/assets/slime_green_walk1.png differ diff --git a/templates/coopPlatformer/assets/slime_green_walk2.png b/templates/coopPlatformer/assets/slime_green_walk2.png new file mode 100644 index 0000000..2ef33b5 Binary files /dev/null and b/templates/coopPlatformer/assets/slime_green_walk2.png differ diff --git a/templates/coopPlatformer/assets/slime_green_walk3.png b/templates/coopPlatformer/assets/slime_green_walk3.png new file mode 100644 index 0000000..2d03697 Binary files /dev/null and b/templates/coopPlatformer/assets/slime_green_walk3.png differ diff --git a/templates/coopPlatformer/assets/slime_green_walk4.png b/templates/coopPlatformer/assets/slime_green_walk4.png new file mode 100644 index 0000000..b8be63c Binary files /dev/null and b/templates/coopPlatformer/assets/slime_green_walk4.png differ diff --git a/templates/coopPlatformer/game.json b/templates/coopPlatformer/game.json new file mode 100644 index 0000000..74f4bf3 --- /dev/null +++ b/templates/coopPlatformer/game.json @@ -0,0 +1,28636 @@ +{ + "firstLayout": "Lobby", + "gdVersion": { + "build": 237, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.coopplatformertutorial", + "pixelsRounding": true, + "projectUuid": "df2b03ec-3534-4819-bce7-42fd527f479d", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "multiplayer-coop-platformer-tutorial", + "version": "1.0.0", + "name": "Co-op platformer tutorial", + "description": "A platformer game where 2 players work together to collect all of the coins.\n\nThis game example includes:\n-Multiplayer lobby\n-Platformer behavior\n-Smooth camera behavior\n-Rectangular movement behavior\n-Sound effects\n-Text objects\n-Timers", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [ + "mobile" + ], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/Knight-Idle1.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Idle2.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Idle3.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Idle4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Platform_Stone2.png", + "kind": "image", + "metadata": "", + "name": "Platform_Stone2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/slime_green_walk1.png", + "kind": "image", + "metadata": "", + "name": "slime_green_walk1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk2.png", + "kind": "image", + "metadata": "", + "name": "slime_green_walk2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk3.png", + "kind": "image", + "metadata": "", + "name": "slime_green_walk3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk4.png", + "kind": "image", + "metadata": "", + "name": "slime_green_walk4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin1.png", + "kind": "image", + "metadata": "", + "name": "coin1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin2.png", + "kind": "image", + "metadata": "", + "name": "coin2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin3.png", + "kind": "image", + "metadata": "", + "name": "coin3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin4.png", + "kind": "image", + "metadata": "", + "name": "coin4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/coin5.png", + "kind": "image", + "metadata": "", + "name": "coin5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/coin6.png", + "kind": "image", + "metadata": "", + "name": "coin6.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/coin7.png", + "kind": "image", + "metadata": "", + "name": "coin7.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/coin8.png", + "kind": "image", + "metadata": "", + "name": "coin8.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/coin9.png", + "kind": "image", + "metadata": "", + "name": "coin9.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin10.png", + "kind": "image", + "metadata": "", + "name": "coin10.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin11.png", + "kind": "image", + "metadata": "", + "name": "coin11.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/coin12.png", + "kind": "image", + "metadata": "", + "name": "coin12.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/RestartPoint.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "RestartPoint", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Coin.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.09,\\\"sustainPunch\\\":30,\\\"decay\\\":0.29,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":1700,\\\"frequencySweep\\\":0,\\\"frequencyDeltaSweep\\\":0,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":10,\\\"frequencyJump1Amount\\\":40,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"sine\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":20,\\\"squareDutySweep\\\":30,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Coin\"}}", + "name": "Coin", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": false + }, + { + "file": "assets/Knight-Roll4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Roll4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Roll5.png", + "kind": "image", + "metadata": "", + "name": "Knight-Roll5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Roll6.png", + "kind": "image", + "metadata": "", + "name": "Knight-Roll6.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Roll7.png", + "kind": "image", + "metadata": "", + "name": "Knight-Roll7.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Roll8.png", + "kind": "image", + "metadata": "", + "name": "Knight-Roll8.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run1.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run2.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run3.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run5.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run6.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run6.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run7.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run7.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run8.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run8.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run9.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run9.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run10.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run10.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run11.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run11.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run12.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run12.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run13.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run13.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run14.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run14.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run15.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run15.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run16.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run16.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Platform_Bridge.png", + "kind": "image", + "metadata": "", + "name": "Platform_Bridge.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Death1.png", + "kind": "image", + "metadata": "", + "name": "Knight-Death1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Death2.png", + "kind": "image", + "metadata": "", + "name": "Knight-Death2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Death3.png", + "kind": "image", + "metadata": "", + "name": "Knight-Death3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Death4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Death4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Spikes.png", + "kind": "image", + "metadata": "", + "name": "Spikes.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Pixel Adventure Pack/Traps/Spikes/9728e7ce3b9e8fc40dd7f91a8553a1d6818f5e4026cdbe05293716d4fc796b12_Spikes.png", + "name": "Spikes.png" + } + }, + { + "file": "assets/PlatformDirtdoor1.png", + "kind": "image", + "metadata": "", + "name": "PlatformDirtdoor1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/PlatformDirtdoor2.png", + "kind": "image", + "metadata": "", + "name": "PlatformDirtdoor2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/DoorOpen.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.09,\\\"sustainPunch\\\":30,\\\"decay\\\":0.2497308561265963,\\\"tremoloDepth\\\":2,\\\"tremoloFrequency\\\":90,\\\"frequency\\\":1149.3866448668648,\\\"frequencySweep\\\":-4900,\\\"frequencyDeltaSweep\\\":-3200,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"pinknoise\\\",\\\"interpolateNoise\\\":false,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"DoorOpen\"}}", + "name": "DoorOpen", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Death.wav", + "kind": "audio", + "metadata": "", + "name": "assets\\Death.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Door1.png", + "kind": "image", + "metadata": "", + "name": "assets\\Door1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Door2.png", + "kind": "image", + "metadata": "", + "name": "assets\\Door2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Fire1.png", + "kind": "image", + "metadata": "", + "name": "Fire1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Fire2.png", + "kind": "image", + "metadata": "", + "name": "Fire2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Fire3.png", + "kind": "image", + "metadata": "", + "name": "Fire3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Fire4.png", + "kind": "image", + "metadata": "", + "name": "Fire4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Platform_Stone3.png", + "kind": "image", + "metadata": "", + "name": "Platform_Stone3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Shadow.png", + "kind": "image", + "metadata": "", + "name": "Shadow.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/NewSprite-1-0.png", + "kind": "image", + "metadata": "", + "name": "NewSprite-1-0.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Door Opening.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0,\\\"sustainPunch\\\":0,\\\"decay\\\":0.14,\\\"tremoloDepth\\\":38,\\\"tremoloFrequency\\\":1,\\\"frequency\\\":500,\\\"frequencySweep\\\":3800,\\\"frequencyDeltaSweep\\\":-3200,\\\"repeatFrequency\\\":3.4000000000000004,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":-5,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.53,\\\"waveform\\\":\\\"pinknoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":20,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":4,\\\"flangerOffsetSweep\\\":9,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":-1,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":-2200,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":1700,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":120}\",\"name\":\"Door Opening\"}}", + "name": "Door Opening", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": false + }, + { + "file": "assets/Left arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Left arrow round button.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Right arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Right arrow round button.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Top arrow button.png", + "kind": "image", + "metadata": "", + "name": "Top arrow button.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Green Button With Shadow_Hovered.png", + "kind": "image", + "metadata": "", + "name": "Green Button With Shadow_Hovered.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/staging/public-resources/Menu buttons/3cfcef451f366e0586d68ae863db979bdeb2ec9453290b236ba3a1fbf19db418_Green Button With Shadow_Hovered.png", + "name": "Green Button With Shadow_Hovered.png" + } + }, + { + "file": "assets/Green Button With Shadow_Idle.png", + "kind": "image", + "metadata": "", + "name": "Green Button With Shadow_Idle.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/staging/public-resources/Menu buttons/63f468aa943eb440db683045192c88a94de99bd6e3aa5fc0afc3d93dd8d39324_Green Button With Shadow_Idle.png", + "name": "Green Button With Shadow_Idle.png" + } + }, + { + "file": "assets/Green Button With Shadow_Pressed.png", + "kind": "image", + "metadata": "", + "name": "Green Button With Shadow_Pressed.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/staging/public-resources/Menu buttons/3c957fd6edd0a38bee1807034ca83d582216e6e2f48058e413979f8b1f504e8b_Green Button With Shadow_Pressed.png", + "name": "Green Button With Shadow_Pressed.png" + } + }, + { + "file": "assets/CantoraOne-Regular.ttf", + "kind": "font", + "metadata": "", + "name": "CantoraOne-Regular.ttf", + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/staging/public-resources/Menu buttons/05b0c1364a92b436b86ca819e66b63480d1bc2fb399f6c0cf8bffbf8199ccc2a_CantoraOne-Regular.ttf", + "name": "CantoraOne-Regular.ttf" + } + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [ + { + "folded": true, + "name": "GameLevel", + "type": "number", + "value": 1 + } + ], + "layouts": [ + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "Lobby", + "name": "Lobby", + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.841642812537312, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 48, + "height": 133, + "keepRatio": true, + "layer": "", + "name": "LobbyButton", + "persistentUuid": "b2976aee-eb12-4d76-aadc-572663a81708", + "width": 321, + "x": 479, + "y": 288, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "PlayerNumberText", + "persistentUuid": "6184d07d-d1fd-451d-ba87-04679e6aa24e", + "width": 0, + "x": 462, + "y": 112, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "569b45d3c7c34f7706563239938d04ca599016ff9857ee38c945c72330d4339e", + "name": "LobbyButton", + "type": "PanelSpriteButton::PanelSpriteButton", + "variant": "Green Button With Shadow", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "LeftPadding": 16, + "RightPadding": 16, + "PressedLabelOffsetY": 3, + "BottomPadding": 32, + "TopPadding": 32, + "HoveredFadeOutDuration": 0.25, + "LabelText": "Join Lobby" + }, + "childrenContent": { + "Hovered": { + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Green Button With Shadow_Hovered.png", + "tiled": true, + "topMargin": 16, + "width": 192 + }, + "Idle": { + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Green Button With Shadow_Idle.png", + "tiled": true, + "topMargin": 16, + "width": 192 + }, + "Label": { + "bold": false, + "italic": false, + "smoothed": true, + "underlined": false, + "string": "Join Lobby", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Join Lobby", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "verticalTextAlignment": "top", + "characterSize": 40, + "color": "255;255;255" + } + }, + "Pressed": { + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "rightMargin": 16, + "texture": "Green Button With Shadow_Pressed.png", + "tiled": true, + "topMargin": 16, + "width": 192 + } + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "PlayerNumberText", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Requires 2 players\n\nOpen two previews if you're\ntesting this game by yourself", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "characterSize": 30, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Requires 2 players\n\nOpen two previews if you're\ntesting this game by yourself", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "verticalTextAlignment": "top", + "characterSize": 30, + "color": "255;255;255" + } + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "LobbyButton" + }, + { + "objectName": "PlayerNumberText" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Lobby opening and game start" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsClicked" + }, + "parameters": [ + "LobbyButton", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "Multiplayer::IsLobbiesWindowOpen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Multiplayer::OpenGameLobbies" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Multiplayer::HasLobbyGameJustStarted" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "" + ] + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + } + ] + }, + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.7876290101673995, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "PlayerObjects", + "objects": [ + { + "name": "Player1" + }, + { + "name": "Player2" + } + ] + }, + { + "name": "MobileControls", + "objects": [ + { + "name": "RightArrowButton" + }, + { + "name": "LeftArrowButton" + }, + { + "name": "JumpArrowButton" + } + ] + } + ], + "variables": [ + { + "folded": true, + "name": "Paused", + "type": "boolean", + "value": false + }, + { + "folded": true, + "name": "StartingNumberOfPlayers", + "type": "number", + "value": 0 + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 96, + "keepRatio": true, + "layer": "UI", + "name": "Coin_counts", + "persistentUuid": "41f8307b-569a-41be-ab59-5935c0f41ca7", + "width": 496, + "x": 16, + "y": 16, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Player1", + "persistentUuid": "9d8cf5b8-300d-4864-99de-2192786a92c2", + "width": 0, + "x": 353, + "y": 317, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "RestartPoint", + "persistentUuid": "ab1aa95f-1f0b-4794-b8cc-8064edcc69c1", + "width": 16, + "x": 384, + "y": 306, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "7ec37e8a-3ecf-4ada-9fad-27bf6a47f5db", + "width": 528, + "x": 352, + "y": 480, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Door", + "persistentUuid": "18fbe4b2-863f-4025-b22f-db38f8325a22", + "width": 0, + "x": 368, + "y": 456, + "zOrder": -295, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 240, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "5318690a-e7ed-4dbf-9982-a736e0c79ac9", + "width": 16, + "x": 336, + "y": 256, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 240, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "05144071-fae2-4e24-8085-18c380327fc5", + "width": 16, + "x": 912, + "y": 256, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "90e06866-66cc-447d-b287-fc871a49a86b", + "width": 0, + "x": 416, + "y": 464, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 48, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "869b21ab-43eb-44a6-b082-0badc3a5f8d4", + "width": 16, + "x": 880, + "y": 448, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "24b633c5-9cd7-45c3-8a55-8e7f1f067e76", + "width": 192, + "x": 592, + "y": 336, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "e26a63ac-76a2-4540-a177-52aaac05be47", + "width": 448, + "x": 432, + "y": 384, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "7f6ff5dc-f02d-4706-9279-dbcebde50940", + "width": 0, + "x": 864, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "2d83d4b4-c041-4299-b5c7-e9dd39ac9c0d", + "width": 0, + "x": 560, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "0e24124b-90de-4083-af2f-340dc96e4d78", + "width": 0, + "x": 624, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "2253089d-b442-4c70-a08e-5c43a142c670", + "width": 0, + "x": 688, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "442eb558-32f9-4d61-adbb-5029b9cbaee6", + "width": 0, + "x": 656, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "584c6497-2dd0-4bdb-bf53-e5e43a5b831a", + "width": 16, + "x": 656, + "y": 272, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 80, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "1b453d3a-c964-49f3-bcbb-c983b5fd2f2a", + "width": 16, + "x": 896, + "y": 416, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "63bfb0ee-e58b-4698-a31f-b393c56a5b5e", + "width": 0, + "x": 752, + "y": 304, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 2 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "865fb451-b455-4556-bea6-1fbc799bcb6e", + "width": 0, + "x": 608, + "y": 304, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 2 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Button", + "persistentUuid": "8be570aa-58b1-4df9-85b5-30c605b5b72f", + "width": 0, + "x": 800, + "y": 381, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 2 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "e9a0c65e-cb0e-43b0-875d-03d2a1fc9065", + "width": 0, + "x": 752, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "56bd5138-88ba-4c4c-8a8d-8441476cbf95", + "width": 0, + "x": 880, + "y": 432, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "02297e5a-9d43-4e8d-8614-0024531a2760", + "width": 0, + "x": 896, + "y": 400, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "cbf8b6d8-c6ba-40e2-a7f5-5b39048a0c81", + "width": 0, + "x": 832, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "4f3aebf4-f2aa-4f5b-a71d-18143b878906", + "width": 144, + "x": 480, + "y": 432, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "1ad7a92f-291b-4dd8-97db-3059ba00d284", + "width": 0, + "x": 496, + "y": 464, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "67a53b43-3ef2-4010-a86f-82ac04e6fd6b", + "width": 0, + "x": 560, + "y": 464, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "18de8e74-1559-4f93-a35e-73ca4b511e41", + "width": 0, + "x": 528, + "y": 464, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "37b04f3b-6d0d-48f2-b489-a1415140b8bb", + "width": 0, + "x": 608, + "y": 448, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 1 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "8d4d21b7-570b-4fd6-9cc7-39ab02bcaecd", + "width": 0, + "x": 480, + "y": 448, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 1 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Button", + "persistentUuid": "f213baa7-9061-4ce4-b197-917b4a7fe8ca", + "width": 0, + "x": 544, + "y": 429, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 1 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "2cf8d7de-8ef6-4a0c-b710-fe0654ec7b14", + "width": 0, + "x": 592, + "y": 464, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "40bfabb2-2686-4959-8bff-7519b4707986", + "width": 160, + "x": 608, + "y": 288, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "619860a3-4cdd-43c1-9f62-822d371e810e", + "width": 0, + "x": 784, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "5d980d48-c10c-4ee5-8c83-e3aa46a4dabe", + "width": 0, + "x": 800, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "38ac5242-c1bd-40d5-a0ca-e02b0f8445f7", + "width": 16, + "x": 816, + "y": 464, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "bea3aa4f-4e48-4553-ab7b-5cc22246901e", + "width": 0, + "x": 592, + "y": 352, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 3 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Doorway2", + "persistentUuid": "1f5cb259-f276-427b-a767-3e83425e98f4", + "width": 0, + "x": 768, + "y": 352, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 3 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "3fbca21d-45fb-4f16-af00-e42bf9d81a07", + "width": 0, + "x": 624, + "y": 320, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "f39abee1-57eb-4066-a00d-7d0e9f740d1f", + "width": 0, + "x": 688, + "y": 320, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "d0d7cd15-4a51-4d5b-a476-0409253b5ba7", + "width": 0, + "x": 656, + "y": 320, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "3764a4ae-97c3-47d1-ac12-ef04c9d7ca51", + "width": 0, + "x": 720, + "y": 320, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "ab50102e-c678-400a-a985-1811c77086b5", + "width": 0, + "x": 720, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Button", + "persistentUuid": "21fd0c51-c1fd-48eb-8666-776c4ca731b0", + "width": 0, + "x": 544, + "y": 381, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 3 + } + ] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "af36feb3-cf88-4d04-8bf0-aeffa71fc4e7", + "width": 0, + "x": 688, + "y": 272, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "8dd7dedd-8e53-4835-80fb-d59343e59f91", + "width": 16, + "x": 704, + "y": 272, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "86327429-41c7-4de1-b5fd-4d17f8ac5d50", + "width": 0, + "x": 464, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "fb616ccf-db13-4eca-8138-a04a15ce4417", + "width": 0, + "x": 512, + "y": 368, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "eea9e589-6626-4df3-b76f-2b2365c5570f", + "width": 16, + "x": 768, + "y": 464, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "106177e7-cc2e-454a-bd86-da85a1389ebe", + "width": 0, + "x": 688, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "14256e9c-7e95-4f10-a5aa-e3dd3e3ea72f", + "width": 0, + "x": 704, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "74964931-7e72-49ea-8ad0-1b8867102648", + "width": 16, + "x": 672, + "y": 464, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "3a2b286a-ab76-4759-a5c7-d8af28da0707", + "width": 0, + "x": 816, + "y": 432, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "8656fe80-3a23-4e36-90c9-ab67a30076c3", + "width": 0, + "x": 672, + "y": 432, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "c9d08664-83a5-4ef0-b497-565dbe6887f8", + "width": 0, + "x": 768, + "y": 432, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Player2", + "persistentUuid": "e0f86c19-31be-408e-8c29-8e627c8cd556", + "width": 0, + "x": 400, + "y": 318, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "40c9fe04-79b2-4cfc-97e5-601cb56314e3", + "width": 0, + "x": 736, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "1e849b54-27b9-4655-92a2-48d40296e62f", + "width": 0, + "x": 752, + "y": 464, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "c3a35705-258a-4376-bcae-7b5159d0d220", + "width": 16, + "x": 720, + "y": 464, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "be42c2b2-0525-46be-b746-ae684f4de534", + "width": 0, + "x": 720, + "y": 432, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 112, + "keepRatio": true, + "layer": "UI", + "name": "RightArrowButton", + "persistentUuid": "dc363dc8-deed-41e3-b07e-f364ef86142e", + "width": 112, + "x": 176, + "y": 576, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 112, + "keepRatio": true, + "layer": "UI", + "name": "LeftArrowButton", + "persistentUuid": "72b00e0e-dc79-4c3b-b3a8-03d08bedbf8a", + "width": 112, + "x": 32, + "y": 576, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 112, + "keepRatio": true, + "layer": "UI", + "name": "JumpArrowButton", + "persistentUuid": "698c6c0e-c26f-4217-9dfa-f113f122700f", + "width": 112, + "x": 1136, + "y": 576, + "zOrder": 23, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "790d968f-ab5a-4bf6-850a-74a71bd8bec9", + "width": 0, + "x": 672, + "y": 272, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 80, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "ebc49a65-1d1f-4fac-be22-190940ff44ff", + "width": 80, + "x": 352, + "y": 352, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Coin", + "persistentUuid": "bf2dc83b-6334-486d-9ed8-78276c919e03", + "width": 0, + "x": 480, + "y": 416, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Player1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "PitchModifier", + "type": "number", + "value": 0.8 + } + ], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": false, + "platformType": "Jumpthru", + "yGrabOffset": 0 + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "EnableAnimationChanges": true, + "EnableHorizontalFlipping": true, + "IdleAnimationName": "Idle", + "RunAnimationName": "Run", + "JumpAnimationName": "Jump", + "FallAnimationName": "Fall", + "ClimbAnimationName": "Climb", + "PlatformerBehavior": "PlatformerObject", + "Animation": "Animation", + "Flippable": "Flippable" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "jumpSpeed": 450, + "jumpSustainTime": 0, + "gravity": 800, + "maxFallingSpeed": 400, + "ignoreDefaultControls": true, + "acceleration": 1000, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 3000, + "ladderClimbingSpeed": 150, + "maxSpeed": 100, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Run1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run13.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run14.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run15.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run16.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Death", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Death1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Fall", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 16, + "name": "Tiles", + "texture": "Platform_Stone2.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": false, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Coin", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.125, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "coin1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "coin12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 13, + "y": 3 + }, + { + "x": 13, + "y": 13 + }, + { + "x": 3, + "y": 13 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Coin_counts", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [ + { + "folded": true, + "name": "Player", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "string": "Coins left: 0", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "left", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": true, + "isShadowEnabled": true, + "italic": false, + "outlineColor": "0;0;0", + "outlineThickness": 5, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Coins left: 0", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "left", + "verticalTextAlignment": "top", + "characterSize": 40, + "color": "255;255;255" + } + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "RestartPoint", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "RestartPoint", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "RestartPoint", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 64, + "y": 0 + }, + { + "x": 64, + "y": 64 + }, + { + "x": 0, + "y": 64 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Button", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Platform_Bridge.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 16, + "y": 7 + }, + { + "x": 0, + "y": 7 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "ad5eec3101f5acd69d381481f39db03d7eabbf96c9681c66bee04f5e78f38a85", + "name": "Spikes", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Spikes.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 1, + "y": 9 + }, + { + "x": 15, + "y": 9 + }, + { + "x": 15, + "y": 16 + }, + { + "x": 1, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Doorway2", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "Key", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": false, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "PlatformDirtdoor1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 32 + }, + { + "x": 0, + "y": 0 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 16, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "PlatformDirtdoor2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 16, + "y": 0 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "9dd32a3c05b50959a5ff266a506ff7e4a509e8fde2f007adbfc1ef6213e8e2dd", + "name": "Door", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Closed", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\Door1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 20, + "y": 0 + }, + { + "x": 20, + "y": 24 + }, + { + "x": 0, + "y": 24 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Opened", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\Door2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 20, + "y": 0 + }, + { + "x": 20, + "y": 24 + }, + { + "x": 0, + "y": 24 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Player2", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "PitchModifier", + "type": "number", + "value": 0.8 + } + ], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": false, + "platformType": "Jumpthru", + "yGrabOffset": 0 + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "EnableAnimationChanges": true, + "EnableHorizontalFlipping": true, + "IdleAnimationName": "Idle", + "RunAnimationName": "Run", + "JumpAnimationName": "Jump", + "FallAnimationName": "Fall", + "ClimbAnimationName": "Climb", + "PlatformerBehavior": "PlatformerObject", + "Animation": "Animation", + "Flippable": "Flippable" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "jumpSpeed": 450, + "jumpSustainTime": 0, + "gravity": 800, + "maxFallingSpeed": 400, + "ignoreDefaultControls": true, + "acceleration": 1000, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 3000, + "ladderClimbingSpeed": 150, + "maxSpeed": 100, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Run1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run13.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run14.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run15.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run16.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Death", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Death1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Fall", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "0236c9d3f392e7c67c24858c9725a423057a0586e6569a46cdb60f9ac2cf3c88", + "name": "RightArrowButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Right arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "0236c9d3f392e7c67c24858c9725a423057a0586e6569a46cdb60f9ac2cf3c88", + "name": "LeftArrowButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Left arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "0236c9d3f392e7c67c24858c9725a423057a0586e6569a46cdb60f9ac2cf3c88", + "name": "JumpArrowButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Top arrow button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Player1" + }, + { + "objectName": "Player2" + }, + { + "objectName": "Tiles" + }, + { + "objectName": "Coin" + }, + { + "objectName": "Coin_counts" + }, + { + "objectName": "RestartPoint" + }, + { + "objectName": "Button" + }, + { + "objectName": "Spikes" + }, + { + "objectName": "Doorway2" + }, + { + "objectName": "Door" + }, + { + "objectName": "RightArrowButton" + }, + { + "objectName": "LeftArrowButton" + }, + { + "objectName": "JumpArrowButton" + } + ] + }, + "events": [ + { + "colorB": 155, + "colorG": 155, + "colorR": 155, + "creationTime": 0, + "folded": true, + "name": "Beginning of scene set up", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Beginning of scene - game set-up" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "3", + "", + "" + ] + }, + { + "type": { + "value": "SceneBackground" + }, + "parameters": [ + "", + "\"74;144;226\"" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "RestartPoint" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "MobileControls", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Player controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Default controls for platformer behaviors are turned off, these controls allow a player to control platformer objects" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "LeftArrowButton", + "ButtonFSM", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "PlayerObjects", + "PlatformerObject" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Right" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "RightArrowButton", + "ButtonFSM", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "PlayerObjects", + "PlatformerObject" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Space" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Up" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "JumpArrowButton", + "ButtonFSM", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "PlayerObjects", + "PlatformerObject" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 155, + "colorG": 155, + "colorR": 155, + "creationTime": 0, + "folded": true, + "name": "Game logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Camera control" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Multiplayer::MultiplayerObjectBehavior::IsObjectOwnedByCurrentPlayer" + }, + "parameters": [ + "PlayerObjects", + "MultiplayerObject" + ] + } + ], + "actions": [ + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "PlayerObjects", + "", + "", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Doorway buttons", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "Button", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "Doorway2", + "Key", + "=", + "Button.Key" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Index" + }, + "parameters": [ + "Doorway2", + "Animation", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Button", + "PlayerObjects", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "Doorway2", + "Animation", + "=", + "1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "DoorOpen", + "", + "50", + "1" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Index" + }, + "parameters": [ + "Doorway2", + "Animation", + "=", + "1" + ] + }, + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "Button", + "PlayerObjects", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "Doorway2", + "Animation", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "DoorOpen", + "", + "50", + "0.8" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Player coin pick up and pitch increase", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "PlayerObjects", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "PlayerObjects", + "Coin", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Coin", + "" + ] + }, + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "PlayerObjects", + "PitchModifier", + "+", + "0.05" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Coin", + "", + "50", + "PlayerObjects.PitchModifier" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "PlayerObjects", + "\"Pitch\"" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Coin_counts", + "Text", + "=", + "\"Coins Remaining: \" + ToString(SceneInstancesCount(Coin))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "PlayerObjects", + "\"Pitch\"", + ">=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "PlayerObjects", + "PitchModifier", + "=", + "0.8" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Coin_counts", + "Text", + "=", + "\"Coins Remaining: \" + ToString(SceneInstancesCount(Coin))" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Player death and respawn", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "PlayerObjects", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "PlayerObjects", + "Spikes", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "PlayerObjects", + "Animation", + "=", + "\"Death\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Multiplayer::MultiplayerObjectBehavior::IsObjectOwnedByCurrentPlayer" + }, + "parameters": [ + "PlayerObjects", + "MultiplayerObject" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Name" + }, + "parameters": [ + "PlayerObjects", + "Animation", + "=", + "\"Death\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "assets\\Death.wav", + "", + "50", + "1" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "PlayerObjects", + "PlatformerObject", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "2" + ] + }, + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "PlayerObjects", + "=", + "RestartPoint.X()", + "=", + "RestartPoint.Y()" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "PlayerObjects", + "PlatformerObject", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Door opening to change level", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SceneInstancesCount" + }, + "parameters": [ + "", + "Coin", + "<=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.25" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Door", + "Animation", + "=", + "\"Opened\"" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Door Opening", + "", + "100", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "PlayerObjects", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Door", + "PlayerObjects.CenterX()", + "PlayerObjects.CenterY()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "PlayerObjects", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Name" + }, + "parameters": [ + "Door", + "Animation", + "=", + "\"Opened\"" + ] + }, + { + "type": { + "value": "SceneInstancesCount" + }, + "parameters": [ + "", + "PlayerObjects", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Game End\"", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior" + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + } + ] + }, + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "Game_32End", + "name": "Game End", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.5843784410741076, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Collisions", + "objects": [] + }, + { + "name": "Hazard", + "objects": [ + { + "name": "Enemy" + }, + { + "name": "Spikes" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 192, + "keepRatio": true, + "layer": "UI", + "name": "Level", + "persistentUuid": "3d4468d6-508b-4061-9959-aa9d0afd979d", + "width": 592, + "x": 345, + "y": 64, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "CameraCenter", + "persistentUuid": "d502ae73-b72e-430f-a7bc-bbf6a75f92cd", + "width": 16, + "x": 640, + "y": 384, + "zOrder": 99, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 128, + "keepRatio": true, + "layer": "", + "name": "Player", + "persistentUuid": "5090a798-6d9d-48f6-afc5-53151b2e504e", + "width": 128, + "x": 704, + "y": 352, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Fire", + "persistentUuid": "748e27af-c455-45a8-8c5c-0e816dc5f9df", + "width": 0, + "x": 576, + "y": 272, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 128, + "keepRatio": true, + "layer": "", + "name": "Player", + "persistentUuid": "d57e3539-7572-4764-ad5d-4f1c2f47e7b6", + "width": 128, + "x": 448, + "y": 352, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 192, + "keepRatio": true, + "layer": "", + "name": "LargeTiles", + "persistentUuid": "e8e3a5fa-707b-410a-9540-24ce36dbcc63", + "width": 1024, + "x": 128, + "y": 464, + "zOrder": 100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 672, + "keepRatio": true, + "layer": "", + "name": "Shadow", + "persistentUuid": "51874e5c-0580-4a2f-87c9-3bbffc203d81", + "width": 896, + "x": 192, + "y": 0, + "zOrder": 102, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 96, + "keepRatio": true, + "layer": "", + "name": "Enemy", + "persistentUuid": "114da76f-29b1-46e4-b18c-cf59f31167a3", + "width": 96, + "x": 304, + "y": 368, + "zOrder": 77, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "f8b7a601-f7a9-4a42-b48f-c5dde4d61a97", + "width": 64, + "x": 880, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "0b65689a-8ad9-4444-96e2-aa08d3453b4e", + "width": 64, + "x": 944, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 160, + "keepRatio": true, + "layer": "", + "name": "Black", + "persistentUuid": "61bbd3d8-c822-4fe7-ba12-cf69512ccd26", + "width": 912, + "x": 192, + "y": 464, + "zOrder": -56, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "c79b4e50-71b0-41d6-af8f-b00f803b022e", + "width": 64, + "x": 1008, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "7d4a5728-57bf-4198-9c84-ecbe46d4ffbe", + "width": 64, + "x": 1072, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "73334a1d-6033-427c-8303-313d29a47575", + "width": 64, + "x": 240, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Spikes", + "persistentUuid": "42296331-2cd7-41d3-8663-333c9c5cb7d8", + "width": 64, + "x": 176, + "y": 400, + "zOrder": 78, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "Player", + "type": "number", + "value": 1 + }, + { + "folded": true, + "name": "PitchModifier", + "type": "number", + "value": 0.8 + }, + { + "folded": true, + "name": "Coins", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Idle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Roll8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Run1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run13.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run14.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run15.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Run16.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Death", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Knight-Death1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Knight-Death4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": false, + "name": "centre", + "x": 16, + "y": 16 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 9 + }, + { + "x": 22, + "y": 9 + }, + { + "x": 22, + "y": 28 + }, + { + "x": 9, + "y": 28 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Enemy", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "slime_green_walk1.png", + "points": [ + { + "name": "Checker", + "x": 24, + "y": 17 + } + ], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "slime_green_walk2.png", + "points": [ + { + "name": "Checker", + "x": 24, + "y": 17 + } + ], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "slime_green_walk3.png", + "points": [ + { + "name": "Checker", + "x": 24, + "y": 17 + } + ], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "slime_green_walk4.png", + "points": [ + { + "name": "Checker", + "x": 24, + "y": 17 + } + ], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Level", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Game End", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "characterSize": 130, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": true, + "isShadowEnabled": true, + "italic": false, + "outlineColor": "0;0;0", + "outlineThickness": 7, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Game End", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "verticalTextAlignment": "top", + "characterSize": 130, + "color": "255;255;255" + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "ad5eec3101f5acd69d381481f39db03d7eabbf96c9681c66bee04f5e78f38a85", + "name": "Spikes", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Spikes.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 1, + "y": 9 + }, + { + "x": 15, + "y": 9 + }, + { + "x": 15, + "y": 16 + }, + { + "x": 1, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "CameraCenter", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "RestartPoint", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "RestartPoint", + "points": [], + "originPoint": { + "name": "origine", + "x": 32, + "y": 32 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 64, + "y": 0 + }, + { + "x": 64, + "y": 64 + }, + { + "x": 0, + "y": 64 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Fire", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Fire1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 92 + }, + { + "x": 124, + "y": 92 + }, + { + "x": 124, + "y": 192 + }, + { + "x": 8, + "y": 192 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fire2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 92 + }, + { + "x": 124, + "y": 92 + }, + { + "x": 124, + "y": 192 + }, + { + "x": 8, + "y": 192 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fire3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 92 + }, + { + "x": 124, + "y": 92 + }, + { + "x": 124, + "y": 192 + }, + { + "x": 8, + "y": 192 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Fire4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 92 + }, + { + "x": 124, + "y": 92 + }, + { + "x": 124, + "y": 192 + }, + { + "x": 8, + "y": 192 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "LargeTiles", + "texture": "Platform_Stone3.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Shadow", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 768, + "y": 0 + }, + { + "x": 768, + "y": 512 + }, + { + "x": 0, + "y": 512 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Black", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "NewSprite-1-0.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 64, + "y": 0 + }, + { + "x": 64, + "y": 64 + }, + { + "x": 0, + "y": 64 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Player" + }, + { + "objectName": "Enemy" + }, + { + "objectName": "Level" + }, + { + "objectName": "Spikes" + }, + { + "objectName": "CameraCenter" + }, + { + "objectName": "Fire" + }, + { + "objectName": "LargeTiles" + }, + { + "objectName": "Shadow" + }, + { + "objectName": "Black" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + }, + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Player", + ">", + "Fire.X()" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "CameraCenter" + ] + }, + { + "type": { + "value": "SceneBackground" + }, + "parameters": [ + "", + "\"56;107;167\"" + ] + }, + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Player", + "Flippable", + "yes" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "1.5", + "", + "" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "CameraCenter", + "", + "", + "" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetSpeedScale" + }, + "parameters": [ + "Player", + "Animation", + "=", + "0.9" + ] + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "gdevelopVersion": "", + "helpPath": "/tutorials/follow-player-with-camera/", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.3.1", + "description": [ + "The camera follows an object according to:", + "- a frame rate independent catch-up speed to make the scrolling from smooth to strong", + "- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object", + "- a follow-free zone to avoid scrolling on small movements", + "- an offset to see further in one direction", + "- an extra delay and catch-up speed to give an impression of speed (useful for dash)", + "- position forecasting and delay to simulate a cameraman response time", + "", + "A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping." + ], + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth", + "platformer", + "platform" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "name": "SmoothCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaLeft()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaRight()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaTop()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaBottom()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::PropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * Object.Behavior::PropertyLogLeftwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * Object.Behavior::PropertyLogRightwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * Object.Behavior::PropertyLogUpwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * Object.Behavior::PropertyLogDownwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "TimeFromStart() + GetArgumentAsNumber(\"WaitingDuration\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedXMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedXMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedYMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedYMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CatchUpDuration\")" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "WaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "WaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "WaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "CatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forecasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyProjectedOldestX()", + "Object.Behavior::PropertyProjectedOldestY()", + "Object.Behavior::PropertyProjectedNewestX()", + "Object.Behavior::PropertyProjectedNewestY()", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyForecastedX()", + "Object.Behavior::PropertyForecastedY()", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnX\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "FollowOnX", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnY\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "FollowOnY", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaRight\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "SetFollowFreeAreaRight", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaLeft\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "SetFollowFreeAreaLeft", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"FollowFreeAreaTop\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "FollowFreeAreaTop", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaBottom\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "SetFollowFreeAreaBottom", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in ratio per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"LeftwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyLeftwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "LeftwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"RightwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyRightwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "RightwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"DownwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyDownwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "DownwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"UpwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyUpwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "UpwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset X", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetX", + "sentence": "the camera offset on X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetX", + "name": "SetOffsetXOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "private": true, + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetXOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetXOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetX\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "CameraOffsetX", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset Y", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetY", + "sentence": "the camera offset on Y axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetY", + "name": "SetOffsetYOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetYOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "private": true, + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetYOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetY\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"ForecastTime\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "ForecastTime", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"CameraDelay\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "CameraDelay", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() - Object.Behavior::PropertyFollowFreeAreaLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() + Object.Behavior::PropertyFollowFreeAreaRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() + Object.Behavior::PropertyFollowFreeAreaBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() - Object.Behavior::PropertyFollowFreeAreaTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "max(0, TimeDelta() * (1 - min(Object.Behavior::PropertyWaitingSpeedXMax() * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), Object.Behavior::PropertyWaitingSpeedYMax() * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraExtraDelay() / Object.Behavior::PropertyCameraDelayCatchUpDuration()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyCameraExtraDelay() -Object.Behavior::PropertyCameraDelayCatchUpSpeed() * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraDelay() + Object.Behavior::PropertyCameraExtraDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "GetArgumentAsNumber(\"Time\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "GetArgumentAsNumber(\"ObjectX\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "GetArgumentAsNumber(\"ObjectY\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - Object.Behavior::PropertyCameraDelay() - Object.Behavior::PropertyCameraExtraDelay() - Object.Behavior::PropertyForecastHistoryDuration()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(Object.Behavior::PropertyForecastHistoryMeanX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryMeanY())", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX())\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY())" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceY()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryCovariance())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanY() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanX()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanX() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanY()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(Object.Behavior::PropertyProjectedOldestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedOldestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(Object.Behavior::PropertyProjectedNewestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedNewestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forecasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX() + ( Object.Behavior::PropertyProjectedNewestX() - Object.Behavior::PropertyProjectedOldestX()) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY() + ( Object.Behavior::PropertyProjectedNewestY() - Object.Behavior::PropertyProjectedOldestY()) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(Object.Behavior::PropertyForecastedX()) + \" \" + ToString(Object.Behavior::PropertyForecastedY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"NewestX\") + (GetArgumentAsNumber(\"NewestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"NewestY\") + (GetArgumentAsNumber(\"NewestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"NewestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"OldestX\") + (GetArgumentAsNumber(\"OldestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"OldestY\") + (GetArgumentAsNumber(\"OldestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"OldestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- Object.Behavior::PropertyForecastTime() / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "group": "Catch-up speed", + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area left border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area right border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom border", + "group": "Position", + "advanced": true, + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset X", + "group": "Position", + "advanced": true, + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset Y", + "group": "Position", + "advanced": true, + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Camera delay", + "group": "Timing", + "deprecated": true, + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast time", + "group": "Timing", + "deprecated": true, + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast history duration", + "group": "Timing", + "deprecated": true, + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Leftward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Rightward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed", + "group": "Maximum speed", + "advanced": true, + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsCalledManually" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "name": "SmoothPlatformerCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeedMax()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeedMax()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top in the air", + "group": "Position", + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom in the air", + "group": "Position", + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top on the floor", + "group": "Position", + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom on the floor", + "group": "Position", + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio per second)", + "group": "Catch-up speed", + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio per second)", + "group": "Catch-up speed", + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio per second)", + "group": "Catch-up speed", + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio per second)", + "group": "Catch-up speed", + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed in the air", + "group": "Maximum speed", + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed in the air", + "group": "Maximum speed", + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed on the floor", + "group": "Maximum speed", + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed on the floor", + "group": "Maximum speed", + "name": "FloorDownwardSpeedMax" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": "", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.1.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyShouldCheckHovering" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)", + "TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyIndex())" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTouchId()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyIdleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyFocusedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyPressedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyIdleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyFocusedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyPressedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "group": "Effects", + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "group": "Effects", + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFocusedAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyPressedAnimationName()" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyIdleAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyFocusedAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyPressedAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "group": "Animation", + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "group": "Animation", + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIdleValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleValue()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedValue()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedValue()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedValue()", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFadeInDuration()", + "Object.Behavior::PropertyFadeInEasing()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFadeOutDuration()", + "Object.Behavior::PropertyFadeOutEasing()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenInitialValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyEffectValue()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTargetedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenInitialValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyEffectValue()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTargetedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "GetArgumentAsNumber(\"Duration\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Tween::Ease(GetArgumentAsString(\"Easing\"), Object.Behavior::PropertyTweenInitialValue(), Object.Behavior::PropertyTweenTargetedValue(), Object.Behavior::PropertyTweenTime() / GetArgumentAsNumber(\"Duration\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "GetArgumentAsNumber(\"Duration\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTweenTargetedValue()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyEffectName()", + "Object.Behavior::PropertyEffectProperty()", + "Object.Behavior::PropertyEffectValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyEffectName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyEffectProperty()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectProperty" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "EffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "PropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyIdleValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyIdleValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFocusedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyPressedValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPressedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "group": "Effect", + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "group": "Value", + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "group": "Value", + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "Object.Behavior::PropertyIdleScale()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleScale()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedScale()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedScale()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedScale()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "GetArgumentAsNumber(\"Value\")", + "GetArgumentAsNumber(\"Value\")", + "Object.Behavior::PropertyFadeInEasing()", + "1000 * Object.Behavior::PropertyFadeInDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "GetArgumentAsNumber(\"Value\")", + "GetArgumentAsNumber(\"Value\")", + "Object.Behavior::PropertyFadeOutEasing()", + "1000 * Object.Behavior::PropertyFadeOutDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyIdleScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyIdleScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFocusedScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyPressedScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPressedScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "group": "Size", + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "group": "Size", + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyIdleColorTint()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleColorTint()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedColorTint()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedColorTint()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedColorTint()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "GetArgumentAsString(\"Value\")", + "Object.Behavior::PropertyFadeInEasing()", + "1000 * Object.Behavior::PropertyFadeInDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "GetArgumentAsString(\"Value\")", + "Object.Behavior::PropertyFadeOutEasing()", + "1000 * Object.Behavior::PropertyFadeOutDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyIdleColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFocusedColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPressedColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "group": "Color", + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "group": "Color", + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Platformer character animator", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTIzLDExYzIuMiwwLDQtMS44LDQtNHMtMS44LTQtNC00cy00LDEuOC00LDRTMjAuOCwxMSwyMywxMXoiLz4NCgk8cGF0aCBkPSJNMzAuOCwxMi40Yy0wLjMtMC40LTEtMC41LTEuNC0wLjJsLTIuOSwyLjNjLTAuOCwwLjctMiwwLjYtMi43LTAuMmwtNy45LTcuOWMtMS42LTEuNi00LjEtMS42LTUuNywwTDcuMyw5LjMNCgkJYy0wLjQsMC40LTAuNCwxLDAsMS40czEsMC40LDEuNCwwbDIuOC0yLjhjMC44LTAuOCwyLjEtMC44LDIuOSwwbDEuNiwxLjZMMTEuNiwxNGMtMSwxLTEuNCwyLjMtMS4xLDMuN2MwLjIsMS4xLDAuOSwyLDEuOCwyLjYNCgkJbC0xLjYsMS42Yy0wLjQsMC40LTEsMC40LTEuNCwwbC0zLjYtMy42Yy0wLjQtMC40LTEtMC40LTEuNCwwcy0wLjQsMSwwLDEuNGwzLjYsMy42YzAuNiwwLjYsMS4zLDAuOSwyLjEsMC45czEuNi0wLjMsMi4xLTAuOQ0KCQlsMi4xLTIuMWwyLjUsMWMwLjcsMC4zLDEuMiwxLDEuMiwxLjh2NmMwLDAuNiwwLjQsMSwxLDFzMS0wLjQsMS0xdi02YzAtMS42LTEtMy4xLTIuNS0zLjdsLTEuNy0wLjdsNS4yLTUuMmwxLjQsMS40DQoJCWMwLjgsMC44LDEuOCwxLjIsMi45LDEuMmMwLjksMCwxLjgtMC4zLDIuNS0wLjlsMi45LTIuM0MzMS4xLDEzLjQsMzEuMSwxMi44LDMwLjgsMTIuNHoiLz4NCjwvZz4NCjwvc3ZnPg0K", + "name": "PlatformerCharacterAnimator", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg", + "shortDescription": "Change animations and horizontal flipping of a platformer character automatically.", + "version": "1.1.0", + "description": [ + "Automatically change the animations and horizontal flipping of a platformer character based on movement and interaction with platform objects.", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer))." + ], + "origin": { + "identifier": "PlatformerCharacterAnimator", + "name": "gdevelop-extension-store" + }, + "tags": [ + "animation", + "platformer", + "platform", + "flip" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Change animations and horizontal flipping of a platformer character automatically.", + "fullName": "Platformer character animator", + "name": "PlatformerCharacterAnimator", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onActivate", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated animation changes a platformer character. Disabling animation changes is useful to play custom animations.", + "fullName": "Enable (or disable) automated animation changes", + "functionType": "Action", + "name": "EnableChangingAnimations", + "sentence": "Enable automated animation changes on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableAnimationChanges\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Change animations automatically", + "name": "EnableAnimationChanges", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated horizontal flipping of a platform character.", + "fullName": "Enable (or disable) automated horizontal flipping", + "functionType": "Action", + "name": "EnableHorizontalFlipping", + "sentence": "Enable automated horizontal flipping on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalFlipping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable horizontal flipping", + "name": "EnableHorizontalFlipping", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Idle\" animation name. Do not use quotation marks.", + "fullName": "\"Idle\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetIdleAnimationName", + "sentence": "Set \"Idle\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyIdleAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Move\" animation name. Do not use quotation marks.", + "fullName": "\"Move\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetMoveAnimationName", + "sentence": "Set \"Move\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyRunAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Jump\" animation name. Do not use quotation marks.", + "fullName": "\"Jump\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetJumpAnimationName", + "sentence": "Set \"Jump\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyJumpAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Fall\" animation name. Do not use quotation marks.", + "fullName": "\"Fall\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetFallAnimationName", + "sentence": "Set \"Fall\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyFallAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Climb\" animation name. Do not use quotation marks.", + "fullName": "\"Climb\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetClimbAnimationName", + "sentence": "Set \"Climb\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyClimbAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Enable animation changes", + "name": "EnableAnimationChanges" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable horizontal flipping", + "name": "EnableHorizontalFlipping" + }, + { + "value": "Idle", + "type": "String", + "label": "\"Idle\" animation name ", + "group": "Animation names", + "name": "IdleAnimationName" + }, + { + "value": "Run", + "type": "String", + "label": "\"Run\" animation name", + "group": "Animation names", + "name": "RunAnimationName" + }, + { + "value": "Jump", + "type": "String", + "label": "\"Jump\" animation name", + "group": "Animation names", + "name": "JumpAnimationName" + }, + { + "value": "Fall", + "type": "String", + "label": "\"Fall\" animation name", + "group": "Animation names", + "name": "FallAnimationName" + }, + { + "value": "Climb", + "type": "String", + "label": "\"Climb\" animation name", + "group": "Animation names", + "name": "ClimbAnimationName" + }, + { + "value": "", + "type": "Behavior", + "label": "Platformer character", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerBehavior" + }, + { + "value": "", + "type": "Behavior", + "label": "Animatable capacity", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Flippable capacity", + "extraInformation": [ + "FlippableCapability::FlippableBehavior" + ], + "name": "Flippable" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian, Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Rectangular movement", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNoYXBlLXJlY3RhbmdsZS1wbHVzIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5LDZIMjJWOEgxOVYxMUgxN1Y4SDE0VjZIMTdWM0gxOVY2TTE3LDE3VjE0SDE5VjE5SDNWNkgxMVY4SDVWMTdIMTdaIiAvPjwvc3ZnPg==", + "name": "RectangleMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/shape-rectangle-plus.svg", + "shortDescription": "Move objects in a rectangular pattern.", + "version": "1.2.0", + "description": [ + "Move objects in a rectangular pattern with easing functions from the Tween extension.", + "", + "It can be used for:", + "", + "- Moveable platforms", + "- Enemy movement patterns", + "- Moving along the border of another object (inside, center, outside)", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer)).", + "", + "This game shows how to make objects move around the border of another object ([open the project online](https://editor.gdevelop.io/?project=example://moving-saw-platformer)).", + "", + "This example can be used to test different settings ([open the project online](https://editor.gdevelop.io/?project=example://rectangular-movement)).", + "" + ], + "origin": { + "identifier": "RectangleMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "rectangular", + "movement", + "rectangle", + "patrol", + "platform", + "enemy" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Distance from an object to the closest edge of a second object.", + "fullName": "Distance from an object to the closest edge of a second object", + "functionType": "Expression", + "name": "DistanceToClosestEdge", + "private": true, + "sentence": "Distance from _PARAM1_ to the closest edge of _PARAM2_ ", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If point is inside rectangle, just use min distance" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + ">=", + "CenterObject.BoundingBoxLeft()" + ] + }, + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + "<=", + "CenterObject.BoundingBoxRight()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + ">=", + "CenterObject.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + "<=", + "CenterObject.BoundingBoxBottom()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "min(\nmin(\nMovingObject.BoundingBoxCenterY() - CenterObject.BoundingBoxTop(), \nCenterObject.BoundingBoxBottom() - MovingObject.BoundingBoxCenterY()),\nmin(\nMovingObject.BoundingBoxCenterX() - CenterObject.BoundingBoxLeft(), \nCenterObject.BoundingBoxRight() - MovingObject.BoundingBoxCenterX())\n)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If point is outside rectangle, find distance to clamped position on rectangle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + "<", + "CenterObject.BoundingBoxLeft()" + ] + }, + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + ">", + "CenterObject.BoundingBoxRight()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + "<", + "CenterObject.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + ">", + "CenterObject.BoundingBoxBottom()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DistanceBetweenPositions(\nMovingObject.BoundingBoxCenterX(),\nMovingObject.BoundingBoxCenterY(),\nclamp(MovingObject.BoundingBoxCenterX(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxRight()),\nclamp(MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxTop(), CenterObject.BoundingBoxBottom())\n)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + }, + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Update rectangular movement to follow the border of an object. Run once, or every time the center object moves.", + "fullName": "Update rectangular movement to follow the border of an object", + "functionType": "Action", + "name": "MoveAlongBorderOfObject", + "sentence": "Update rectangular movement of _PARAM1_ to follow the border of _PARAM3_. Position on border: _PARAM4_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create object link (if one has not been created)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Set a valid initial value by picking any Center object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "MovingObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.DistanceToClosestEdge", + "=", + "RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject)" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update value if distance is lower than existing minimum", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.DistanceToClosestEdge", + "=", + "min(MovingObject.Variable(__RectangleMovement.DistanceToClosestEdge), RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject))" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Link objects that have the closest distance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Link the MovingObject that has the shortest distance (and don't create more links even if another object has the same distance)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject)", + "=", + "MovingObject.Variable(__RectangleMovement.DistanceToClosestEdge)" + ] + } + ], + "actions": [ + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "MovingObject", + "CenterObject" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update rectangular movement to follow the border of object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "MovingObject", + "CenterObject", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inside (default)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"Inside\"" + ] + }, + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom() - MovingObject.Height()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight() - MovingObject.Width()", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Center", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"Center\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop() - MovingObject.Height()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom() - MovingObject.Height()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft() - MovingObject.Width()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight() - MovingObject.Width()/2", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Outside", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"Outside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop() - MovingObject.Height()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft() - MovingObject.Width()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + }, + { + "description": "Rectangle Movement (required)", + "name": "RectangleMovement", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + }, + { + "description": "Position on border", + "name": "PositionOnBorder", + "supplementaryInformation": "[\"Inside\",\"Center\",\"Outside\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Move to the nearest corner of the center object.", + "fullName": "Move to the nearest corner of the center object", + "functionType": "Action", + "name": "MoveToNearestCorner", + "sentence": "Move _PARAM1_ to the nearest corner of _PARAM3_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create a link to the closest object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::MoveAlongBorderOfObject" + }, + "parameters": [ + "", + "MovingObject", + "RectangleMovement", + "CenterObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move to nearest corner", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "MovingObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "CenterObject", + "MovingObject", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to TopLeft (don't use a condition on the first check so the variable starts with a valid corner)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxTop())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Top-left corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to TopRight" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxTop())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxTop())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Top-right corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to BottomLeft" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxBottom())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxBottom())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Bottom-left corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to BottomRight" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxBottom())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxBottom())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Bottom-right corner\"", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + }, + { + "description": "Rectangle Movement (required)", + "name": "RectangleMovement", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Move objects in a rectangular pattern.", + "fullName": "Rectangular movement", + "name": "RectangleMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Y()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the initial state according to the configuration." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyInitialPosition" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Top-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::TopRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyInitialPosition" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Bottom-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::BottomRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyInitialPosition" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Bottom-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::BottomLeftDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyLeft" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.X() - Object.Behavior::DeltaX()" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Y() - Object.Behavior::DeltaY()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update the rectangle when the object is moved outside of the behavior." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyLeft" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.X() - Object.Behavior::PropertyOldX()" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyTop" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Y() - Object.Behavior::PropertyOldY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the object on the rectangular path." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyLeft() + Object.Behavior::DeltaX()", + "=", + "Object.Behavior::PropertyTop() + Object.Behavior::DeltaY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save the position to detect when the object is moved outside of the behavior." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Y()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Step on the path." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "mod(Object.Behavior::PropertyProgress() + TimeDelta() / Object.Behavior::LoopDuration(), 1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "mod(Object.Behavior::PropertyProgress() - TimeDelta() / Object.Behavior::LoopDuration(), 1)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Teleport the object to a corner of the movement rectangle.", + "fullName": "Teleport at a corner", + "functionType": "Action", + "name": "TeleportToCorner", + "sentence": "Set the position of _PARAM0_ at the _PARAM2_ of the rectangle loop", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Corner\")", + "=", + "\"Top-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Corner\")", + "=", + "\"Top-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::TopRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Corner\")", + "=", + "\"Bottom-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::BottomRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Corner\")", + "=", + "\"Bottom-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyProgress" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::BottomLeftDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Corner", + "name": "Corner", + "supplementaryInformation": "[\"Top-left corner\",\"Top-right corner\",\"Bottom-left corner\",\"Bottom-right corner\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the perimeter of the movement rectangle.", + "fullName": "Perimeter", + "functionType": "Expression", + "group": "Rectangular movement shape", + "name": "Perimeter", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * (abs(Object.Behavior::PropertyWidth()) + abs(Object.Behavior::PropertyHeight()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through the whole rectangle (in seconds).", + "fullName": "Loop duration", + "functionType": "Expression", + "name": "LoopDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * (Object.Behavior::PropertyHorizontalEdgeDuration() + Object.Behavior::PropertyVerticalEdgeDuration())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through a horizontal edge (in seconds).", + "fullName": "Horizontal edge duration", + "functionType": "Expression", + "name": "HorizontalEdgeDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through a vertical edge (in seconds).", + "fullName": "Vertical edge duration", + "functionType": "Expression", + "name": "VerticalEdgeDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyVerticalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the rectangle width.", + "fullName": "Width", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Width", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyWidth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the rectangle height.", + "fullName": "Height", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Height", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHeight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the left bound of the movement.", + "fullName": "Left bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Left", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the top bound of the movement.", + "fullName": "Top bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Top", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the right bound of the movement.", + "fullName": "Right bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Right", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyLeft() + Object.Behavior::PropertyWidth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the bottom bound of the movement.", + "fullName": "Bottom bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Bottom", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTop() + Object.Behavior::PropertyHeight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the left bound of the rectangular movement.", + "fullName": "Left bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetLeft", + "sentence": "Change the movement left bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyWidth" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyLeft() - GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyLeft" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the top bound of the rectangular movement.", + "fullName": "Top bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetTop", + "sentence": "Change the movement top bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyHeight" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyTop() - GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the right bound of the rectangular movement.", + "fullName": "Right bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetRight", + "sentence": "Change the movement right bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyWidth" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\") - Object.Behavior::PropertyLeft()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the bottom bound of the rectangular movement.", + "fullName": "Bottom bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetBottom", + "sentence": "Change the movement bottom bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyHeight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\") - Object.Behavior::PropertyTop()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time the object takes to go through a horizontal edge (in seconds).", + "fullName": "Horizontal edge duration", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetHorizontalEdgeDuration", + "sentence": "Change the time _PARAM0_ takes to go through a horizontal edge to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyHorizontalEdgeDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time the object takes to go through a vertical edge (in seconds).", + "fullName": "Vertical edge duration", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetVerticalEdgeDuration", + "sentence": "Change the time _PARAM0_ takes to go through a vertical edge to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyVerticalEdgeDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the direction to clockwise or counter-clockwise.", + "fullName": "Clockwise", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetClockwise", + "sentence": "Use clockwise direction for _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Clockwise", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the easing function of the movement.", + "fullName": "Easing", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetEasing", + "sentence": "Change the easing of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle the direction to clockwise or counter-clockwise.", + "fullName": "Toggle direction", + "functionType": "Action", + "name": "ToogleClockwise", + "sentence": "Toogle the direction of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyToogleClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyToogleClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyToogleClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyToogleClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetPropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving clockwise.", + "fullName": "Is moving clockwise", + "functionType": "Condition", + "name": "IsMovingClockwise", + "sentence": "_PARAM0_ is moving clockwise", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving to the left.", + "fullName": "Is moving left", + "functionType": "Condition", + "name": "IsMovingLeft", + "sentence": "_PARAM0_ is moving to the left", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnTop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnBottom" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving up.", + "fullName": "Is moving up", + "functionType": "Condition", + "name": "IsMovingUp", + "sentence": "_PARAM0_ is moving up", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnLeft" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnRight" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving to the right.", + "fullName": "Is moving right", + "functionType": "Condition", + "name": "IsMovingRight", + "sentence": "_PARAM0_ is moving to the right", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnTop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnBottom" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving down.", + "fullName": "Is moving down", + "functionType": "Condition", + "name": "IsMovingDown", + "sentence": "_PARAM0_ is moving down", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnRight" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangleMovement::RectangleMovement::PropertyClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnLeft" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the left side of the rectangle.", + "fullName": "Is on left", + "functionType": "Condition", + "name": "IsOnLeft", + "sentence": "_PARAM0_ is on the left side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the top side of the rectangle.", + "fullName": "Is on top", + "functionType": "Condition", + "name": "IsOnTop", + "sentence": "_PARAM0_ is on the top side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::TopRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the right side of the rectangle.", + "fullName": "Is on right", + "functionType": "Condition", + "name": "IsOnRight", + "sentence": "_PARAM0_ is on the right side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::BottomRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the bottom side of the rectangle.", + "fullName": "Is on bottom", + "functionType": "Condition", + "name": "IsOnBottom", + "sentence": "_PARAM0_ is on the bottom side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the top-right one.", + "fullName": "Duration to top right", + "functionType": "Expression", + "name": "TopRightDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the bottom-right one.", + "fullName": "Duration to bottom right", + "functionType": "Expression", + "name": "BottomRightDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalEdgeDuration() + Object.Behavior::PropertyVerticalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the bottom-left one.", + "fullName": "Duration to bottom left", + "functionType": "Expression", + "name": "BottomLeftDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * Object.Behavior::PropertyHorizontalEdgeDuration() + Object.Behavior::PropertyVerticalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between the covered distance from the last vertex and the edge length (between 0 and 1).", + "fullName": "Progress on edge", + "functionType": "Expression", + "name": "EdgeProgress", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::HalfCurrentTime() / Object.Behavior::PropertyHorizontalEdgeDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::HalfCurrentTime()", + ">=", + "abs(Object.Behavior::PropertyHorizontalEdgeDuration())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "(Object.Behavior::HalfCurrentTime() - Object.Behavior::PropertyHorizontalEdgeDuration()) / Object.Behavior::PropertyVerticalEdgeDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of the current edge origin.", + "fullName": "Edge origin X", + "functionType": "Expression", + "name": "EdgeOriginX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyWidth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the Y position of the current edge origin.", + "fullName": "Edge origin Y", + "functionType": "Expression", + "name": "EdgeOriginY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::Perimeter()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHeight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of the current edge target.", + "fullName": "Edge target X", + "functionType": "Expression", + "name": "EdgeTargetY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHeight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the Y position of the current edge target.", + "fullName": "Edge target Y", + "functionType": "Expression", + "name": "EdgeTargetX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyWidth()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time from the top-left vertex.", + "fullName": "Current time", + "functionType": "Expression", + "name": "CurrentTime", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyProgress() * Object.Behavior::LoopDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the covered length from the top-left vertex or the bottom-right one.", + "fullName": "Half Current length", + "functionType": "Expression", + "name": "HalfCurrentTime", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object. Behavior::LoopDuration() * mod(Object.Behavior::PropertyProgress(), 0.5)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the displacement on the X axis from the top-left vertex.", + "fullName": "Delta X", + "functionType": "Expression", + "name": "DeltaX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::EdgeOriginX(), Object.Behavior::EdgeTargetX(), Object.Behavior::EdgeProgress())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the displacement on the Y axis from the top-left vertex.", + "fullName": "Delta Y", + "functionType": "Expression", + "name": "DeltaY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Tween::Ease(Object.Behavior::PropertyEasing(), Object.Behavior::EdgeOriginY(), Object.Behavior::EdgeTargetY(), Object.Behavior::EdgeProgress())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "unit": "Pixel", + "label": "Width", + "group": "Dimension", + "name": "Width" + }, + { + "value": "100", + "type": "Number", + "unit": "Pixel", + "label": "Height", + "group": "Dimension", + "name": "Height" + }, + { + "value": "true", + "type": "Boolean", + "label": "Clockwise", + "group": "Speed", + "name": "Clockwise" + }, + { + "value": "4", + "type": "Number", + "unit": "Second", + "label": "Horizontal edge duration", + "group": "Speed", + "name": "HorizontalEdgeDuration" + }, + { + "value": "1", + "type": "Number", + "unit": "Second", + "label": "Vertical edge duration", + "group": "Speed", + "name": "VerticalEdgeDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Left" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Top" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Progress" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "OldY" + }, + { + "value": "easeInOutSine", + "type": "Choice", + "label": "Easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "Easing" + }, + { + "value": "Top-left corner", + "type": "Choice", + "label": "Initial position", + "extraInformation": [ + "Top-left corner", + "Top-right corner", + "Bottom-right corner", + "Bottom-left corner" + ], + "name": "InitialPosition" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ToogleClockwise" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Panel sprite button", + "gdevelopVersion": ">=5.5.230", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTI5LDIzSDNjLTEuMSwwLTItMC45LTItMlYxMWMwLTEuMSwwLjktMiwyLTJoMjZjMS4xLDAsMiwwLjksMiwydjEwQzMxLDIyLjEsMzAuMSwyMywyOSwyM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMywxOUwxMywxOWMtMS4xLDAtMi0wLjktMi0ydi0yYzAtMS4xLDAuOS0yLDItMmgwYzEuMSwwLDIsMC45LDIsMnYyQzE1LDE4LjEsMTQuMSwxOSwxMywxOXoiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIxOCIgeTE9IjEzIiB4Mj0iMTgiIHkyPSIxOSIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjIxIiB5MT0iMTMiIHgyPSIxOCIgeTI9IjE3Ii8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMjEiIHkxPSIxOSIgeDI9IjE5IiB5Mj0iMTYiLz4NCjwvc3ZnPg0K", + "name": "PanelSpriteButton", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Interface Elements/Interface Elements_interface_ui_button_ok_cta_clock_tap.svg", + "shortDescription": "A button that can be customized.", + "version": "2.0.0", + "description": [ + "The button can be customized with a background for each state and a label. It handles user interactions and a simple condition can be used to check if it is clicked.", + "", + "There are ready-to-use buttons in the asset-store [menu buttons pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=menu-buttons-menu-buttons)." + ], + "origin": { + "identifier": "PanelSpriteButton", + "name": "gdevelop-extension-store" + }, + "tags": [ + "button", + "ui" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "changelog": [ + { + "version": "2.0.0", + "breaking": "- Buttons now use \"variants\", allowing easy swapping of their visual aspect. You will have to make some adjustments to existing buttons in your project. Follow this [migration documentation](https://wiki.gdevelop.io/gdevelop5/objects/custom-objects-prefab-template/migrate-to-variants/) to do these changes." + } + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "The finite state machine used internally by the button object.", + "fullName": "Button finite state machine", + "name": "ButtonFSM", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PanelSpriteButton::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 256, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Button", + "description": "A button that can be customized.", + "fullName": "Button (panel sprite)", + "isInnerAreaFollowingParentSize": true, + "isUsingLegacyInstancesRenderer": false, + "name": "PanelSpriteButton", + "objects": [ + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Label", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 4, + "topEdgeAnchor": 4, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "useLegacyBottomAndRightAnchors": false + } + ], + "string": "Text", + "font": "", + "textAlignment": "center", + "characterSize": 20, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Text", + "font": "", + "textAlignment": "center", + "verticalTextAlignment": "center", + "characterSize": 20, + "color": "0;0;0" + } + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Idle", + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [ + { + "folded": true, + "name": "State", + "type": "string", + "value": "Idle" + } + ], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "ButtonFSM", + "type": "PanelSpriteButton::ButtonFSM", + "ShouldCheckHovering": true + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Hovered", + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Pressed", + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Label" + }, + { + "objectName": "Idle" + }, + { + "objectName": "Hovered" + }, + { + "objectName": "Pressed" + } + ] + }, + "objectsGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "layer": "", + "name": "Idle", + "persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6", + "width": 256, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "layer": "", + "name": "Label", + "persistentUuid": "3b29c95c-5363-4e25-bf47-eecf13e8a226", + "width": 256, + "x": 0, + "y": 32, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create one background instance for of each state.\nOnly the instance for the current state is shown." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Hovered", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Pressed", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetSize" + }, + "parameters": [ + "Hovered", + "Resizable", + "Idle.Width()", + "Idle.Height()" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetSize" + }, + "parameters": [ + "Pressed", + "Resizable", + "Idle.Width()", + "Idle.Height()" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Hovered", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Pressed", + "=", + "1" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Label", + "Text", + "=", + "LabelText" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsPressed" + }, + "parameters": [ + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "PressedLabelOffsetY", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Label", + "Text", + "=", + "LabelText" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Show the right background accordingly to the new state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Idle", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HoveredFadeOutDuration", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenBehavior::AddObjectOpacityTween2" + }, + "parameters": [ + "Hovered", + "Tween", + "\"Fadeout\"", + "0", + "\"linear\"", + "HoveredFadeOutDuration", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HoveredFadeOutDuration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "OpacityCapability::OpacityBehavior::Value" + }, + "parameters": [ + "Hovered", + "Opacity", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "Hovered", + "Opacity", + "=", + "255" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsHovered" + }, + "parameters": [ + "Object", + "ButtonFSM" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Hovered", + "Tween", + "\"Fadeout\"" + ] + }, + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "Hovered", + "Opacity", + "=", + "255" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "PressedLabelOffsetY", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Hovered" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Pressed", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PanelSpriteButton::PanelSpriteButton::SetLabelOffset" + }, + "parameters": [ + "Object", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Idle" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Hovered", + "" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Pressed" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::IsIdle" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::IsClicked" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::IsHovered" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::IsFocused" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PanelSpriteButton::ButtonFSM::IsPressed" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Change the text of the button label.", + "fullName": "Label text", + "functionType": "Action", + "name": "SetLabelText", + "private": true, + "sentence": "Change the text of _PARAM0_ to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Label", + "Text", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + }, + { + "description": "Text", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "LabelText", + "name": "SetLabelTextOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Label", + "Text", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the label text.", + "fullName": "Label text", + "functionType": "ExpressionAndCondition", + "name": "LabelText", + "sentence": "the label text", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Label.Text::Value()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate interactions with the button.", + "fullName": "De/activate interactions", + "functionType": "Action", + "name": "Activate", + "sentence": "Activate interactions with _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Idle", + "ButtonFSM", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if interactions are activated on the button.", + "fullName": "Interactions activated", + "functionType": "Condition", + "name": "IsActivated", + "sentence": "Interactions on _PARAM0_ are activated", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BehaviorActivated" + }, + "parameters": [ + "Idle", + "ButtonFSM" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the labelOffset of the object.", + "fullName": "LabelOffset", + "functionType": "ExpressionAndCondition", + "name": "LabelOffset", + "private": true, + "sentence": "the labelOffset", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "LabelOffset" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "LabelOffset", + "name": "SetLabelOffset", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetCenterY" + }, + "parameters": [ + "Label", + "+", + "Value - LabelOffset" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LabelOffset", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PanelSpriteButton::PanelSpriteButton", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "MultilineString", + "label": "Label", + "name": "LabelText" + }, + { + "value": "0.25", + "type": "Number", + "unit": "Second", + "label": "Hovered fade out duration", + "group": "States", + "name": "HoveredFadeOutDuration" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Label offset on Y axis when pressed", + "group": "States", + "name": "PressedLabelOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "", + "hidden": true, + "name": "LabelOffset" + }, + { + "value": "", + "type": "Choice", + "label": "", + "extraInformation": [ + "Label.Text=LabelText" + ], + "hidden": true, + "name": "_PropertyMapping" + } + ], + "variants": [ + { + "areaMaxX": 192, + "areaMaxY": 69, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "assetStoreAssetId": "569b45d3c7c34f7706563239938d04ca599016ff9857ee38c945c72330d4339e", + "assetStoreOriginalName": "Green Button With Shadow", + "name": "Green Button With Shadow", + "objects": [ + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Label", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ], + "string": "BUTTON", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "BUTTON", + "font": "CantoraOne-Regular.ttf", + "textAlignment": "center", + "verticalTextAlignment": "center", + "characterSize": 40, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "name": "Idle", + "rightMargin": 16, + "texture": "Green Button With Shadow_Idle.png", + "tiled": false, + "topMargin": 16, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "variables": [ + { + "folded": true, + "name": "State", + "type": "string", + "value": "Idle" + } + ], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "ButtonFSM", + "type": "PanelSpriteButton::ButtonFSM", + "serializedBehavior": { + "name": "ButtonFSM", + "type": "PanelSpriteButton::ButtonFSM", + "ShouldCheckHovering": true + } + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "name": "Hovered", + "rightMargin": 16, + "texture": "Green Button With Shadow_Hovered.png", + "tiled": false, + "topMargin": 16, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior", + "serializedBehavior": { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 16, + "height": 69, + "leftMargin": 16, + "name": "Pressed", + "rightMargin": 16, + "texture": "Green Button With Shadow_Pressed.png", + "tiled": false, + "topMargin": 16, + "type": "PanelSpriteObject::PanelSprite", + "width": 192, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Label" + }, + { + "objectName": "Idle" + }, + { + "objectName": "Hovered" + }, + { + "objectName": "Pressed" + } + ] + }, + "objectsGroups": [ + { + "name": "Background", + "objects": [ + { + "name": "Idle" + }, + { + "name": "Hovered" + }, + { + "name": "Pressed" + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [ + { + "angle": 0, + "customSize": false, + "depth": 1, + "height": 64, + "layer": "", + "name": "Idle", + "persistentUuid": "24882334-eec8-403e-8bf1-70fc928a46e6", + "width": 64, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 60, + "keepRatio": true, + "layer": "", + "name": "Label", + "persistentUuid": "0fc63b9b-9e62-48c4-a3fa-576380a64e67", + "width": 188, + "x": 2, + "y": 32, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + } + ] + } + ] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/fireABullet/assets/Bump.wav b/templates/fireABullet/assets/Bump.wav new file mode 100644 index 0000000..a1aee22 Binary files /dev/null and b/templates/fireABullet/assets/Bump.wav differ diff --git a/templates/fireABullet/assets/Death.wav b/templates/fireABullet/assets/Death.wav new file mode 100644 index 0000000..3e38833 Binary files /dev/null and b/templates/fireABullet/assets/Death.wav differ diff --git a/templates/fireABullet/assets/Explosion.wav b/templates/fireABullet/assets/Explosion.wav new file mode 100644 index 0000000..64bde24 Binary files /dev/null and b/templates/fireABullet/assets/Explosion.wav differ diff --git a/templates/fireABullet/assets/Fire round button2.png b/templates/fireABullet/assets/Fire round button2.png new file mode 100644 index 0000000..3e5bae7 Binary files /dev/null and b/templates/fireABullet/assets/Fire round button2.png differ diff --git a/templates/fireABullet/assets/LaserFire.wav b/templates/fireABullet/assets/LaserFire.wav new file mode 100644 index 0000000..731eeaf Binary files /dev/null and b/templates/fireABullet/assets/LaserFire.wav differ diff --git a/templates/fireABullet/assets/Left arrow round button.png b/templates/fireABullet/assets/Left arrow round button.png new file mode 100644 index 0000000..50a781a Binary files /dev/null and b/templates/fireABullet/assets/Left arrow round button.png differ diff --git a/templates/fireABullet/assets/PTSans-Bold.ttf b/templates/fireABullet/assets/PTSans-Bold.ttf new file mode 100644 index 0000000..7f2bddb Binary files /dev/null and b/templates/fireABullet/assets/PTSans-Bold.ttf differ diff --git a/templates/fireABullet/assets/Top arrow round button.png b/templates/fireABullet/assets/Top arrow round button.png new file mode 100644 index 0000000..f220013 Binary files /dev/null and b/templates/fireABullet/assets/Top arrow round button.png differ diff --git a/templates/fireABullet/assets/You Win.png b/templates/fireABullet/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/fireABullet/assets/You Win.png differ diff --git a/templates/fireABullet/assets/laserBlue06.png b/templates/fireABullet/assets/laserBlue06.png new file mode 100644 index 0000000..3f8ee7a Binary files /dev/null and b/templates/fireABullet/assets/laserBlue06.png differ diff --git a/templates/fireABullet/assets/meteorBrown_big1.png b/templates/fireABullet/assets/meteorBrown_big1.png new file mode 100644 index 0000000..5030e2f Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_big1.png differ diff --git a/templates/fireABullet/assets/meteorBrown_big2.png b/templates/fireABullet/assets/meteorBrown_big2.png new file mode 100644 index 0000000..9c41fbc Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_big2.png differ diff --git a/templates/fireABullet/assets/meteorBrown_big3.png b/templates/fireABullet/assets/meteorBrown_big3.png new file mode 100644 index 0000000..d967212 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_big3.png differ diff --git a/templates/fireABullet/assets/meteorBrown_big4.png b/templates/fireABullet/assets/meteorBrown_big4.png new file mode 100644 index 0000000..e418330 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_big4.png differ diff --git a/templates/fireABullet/assets/meteorBrown_med1.png b/templates/fireABullet/assets/meteorBrown_med1.png new file mode 100644 index 0000000..1829bd2 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_med1.png differ diff --git a/templates/fireABullet/assets/meteorBrown_med3.png b/templates/fireABullet/assets/meteorBrown_med3.png new file mode 100644 index 0000000..00e89a6 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_med3.png differ diff --git a/templates/fireABullet/assets/meteorBrown_small1.png b/templates/fireABullet/assets/meteorBrown_small1.png new file mode 100644 index 0000000..d0c58c5 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_small1.png differ diff --git a/templates/fireABullet/assets/meteorBrown_small2.png b/templates/fireABullet/assets/meteorBrown_small2.png new file mode 100644 index 0000000..6212311 Binary files /dev/null and b/templates/fireABullet/assets/meteorBrown_small2.png differ diff --git a/templates/fireABullet/assets/playerLife3_empty.png b/templates/fireABullet/assets/playerLife3_empty.png new file mode 100644 index 0000000..a38ee3d Binary files /dev/null and b/templates/fireABullet/assets/playerLife3_empty.png differ diff --git a/templates/fireABullet/assets/playerLife3_red.png b/templates/fireABullet/assets/playerLife3_red.png new file mode 100644 index 0000000..b8a103b Binary files /dev/null and b/templates/fireABullet/assets/playerLife3_red.png differ diff --git a/templates/fireABullet/assets/playerLife3_red2.png b/templates/fireABullet/assets/playerLife3_red2.png new file mode 100644 index 0000000..b8a103b Binary files /dev/null and b/templates/fireABullet/assets/playerLife3_red2.png differ diff --git a/templates/fireABullet/assets/playerShip3_red.png b/templates/fireABullet/assets/playerShip3_red.png new file mode 100644 index 0000000..eb02c7e Binary files /dev/null and b/templates/fireABullet/assets/playerShip3_red.png differ diff --git a/templates/fireABullet/assets/star1.png b/templates/fireABullet/assets/star1.png new file mode 100644 index 0000000..d7aaa9f Binary files /dev/null and b/templates/fireABullet/assets/star1.png differ diff --git a/templates/fireABullet/game.json b/templates/fireABullet/game.json new file mode 100644 index 0000000..991a415 --- /dev/null +++ b/templates/fireABullet/game.json @@ -0,0 +1,38375 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 236, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.spaceasteroidstutorial", + "pixelsRounding": false, + "projectUuid": "80b6a2b5-c2fa-4608-9ace-c0a4648ccf37", + "scaleMode": "linear", + "sizeOnStartupMode": "", + "templateSlug": "space-asteroids-tutorial", + "version": "1.0.0", + "name": "Space Asteroids Tutorial", + "description": "", + "author": "", + "windowWidth": 960, + "windowHeight": 540, + "latestCompilationDirectory": "C:\\Users\\helpe\\Desktop\\Final Final Test", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/playerShip3_red.png", + "kind": "image", + "metadata": "", + "name": "playerShip3_red.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/laserBlue06.png", + "kind": "image", + "metadata": "", + "name": "laserBlue06.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_big1.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_big1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_big2.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_big2.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_big3.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_big3.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_big4.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_big4.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_med1.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_med1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_med3.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_med3.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_small1.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_small1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/meteorBrown_small2.png", + "kind": "image", + "metadata": "", + "name": "meteorBrown_small2.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/playerLife3_red.png", + "kind": "image", + "metadata": "", + "name": "playerLife3_red.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/PTSans-Bold.ttf", + "kind": "font", + "metadata": "", + "name": "PTSans-Bold.ttf", + "userAdded": true + }, + { + "file": "assets/star1.png", + "kind": "image", + "metadata": "", + "name": "star1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/LaserFire.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"LaserFire\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.07,\\\"sustainPunch\\\":0,\\\"decay\\\":0.09,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":1200,\\\"frequencySweep\\\":-600,\\\"frequencyDeltaSweep\\\":-800,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"sine\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":25,\\\"squareDutySweep\\\":100,\\\"flangerOffset\\\":9,\\\"flangerOffsetSweep\\\":4,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"LaserFire\"}}", + "name": "LaserFire.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Bump.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"LaserFire\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0.035093724376676905,\\\"sustain\\\":0.025232395483004266,\\\"sustainPunch\\\":30,\\\"decay\\\":0.4409183865928994,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":800,\\\"frequencySweep\\\":-300,\\\"frequencyDeltaSweep\\\":-500,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"brownnoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":13.09550881872742,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":-6600,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Bump\"}}", + "name": "Bump.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Death.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"LaserFire\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":1.08,\\\"sustain\\\":0,\\\"sustainPunch\\\":0,\\\"decay\\\":2.81,\\\"tremoloDepth\\\":36,\\\"tremoloFrequency\\\":237,\\\"frequency\\\":300,\\\"frequencySweep\\\":0,\\\"frequencyDeltaSweep\\\":0,\\\"repeatFrequency\\\":38.900000000000006,\\\"frequencyJump1Onset\\\":0,\\\"frequencyJump1Amount\\\":-85,\\\"frequencyJump2Onset\\\":75,\\\"frequencyJump2Amount\\\":-40,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"triangle\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":1200,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":4800,\\\"compression\\\":1.8,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Death\"}}", + "name": "Death.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Explosion.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"LaserFire\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.09,\\\"sustainPunch\\\":60,\\\"decay\\\":0.36,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":10000,\\\"frequencySweep\\\":-2000,\\\"frequencyDeltaSweep\\\":-3400,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"brownnoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Explosion\"}}", + "name": "Explosion.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": false + }, + { + "file": "assets/Left arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Left arrow round button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/On-Screen Controls/Sprites/Shaded Light/Left arrow round button.png", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/Top arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Top arrow round button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/On-Screen Controls/Sprites/Shaded Light/Top arrow round button.png", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/Fire round button2.png", + "kind": "image", + "metadata": "", + "name": "Fire round button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/On-Screen Controls/Sprites/Shaded Light/Fire round button.png", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/playerLife3_red2.png", + "kind": "image", + "metadata": "", + "name": "assets\\playerLife3_red.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/playerLife3_empty.png", + "kind": "image", + "metadata": "", + "name": "assets\\playerLife3_empty.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": true, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "PlayScene", + "name": "PlayScene", + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.7432961293347794, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Asteroid", + "objects": [ + { + "name": "BigAsteroid" + }, + { + "name": "MediumAsteroid" + }, + { + "name": "SmallAsteroid" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 34, + "layer": "", + "name": "Player", + "persistentUuid": "4730307d-6826-4f23-aa38-cfc573c3979d", + "width": 62, + "x": 443, + "y": 250, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "7c17a455-872b-4594-8747-df202613ad1e", + "width": 64, + "x": 592, + "y": 343, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "646c0f2e-ce8d-40d2-bbf7-b4dc2982f589", + "width": 64, + "x": 470, + "y": 144, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "a604b736-f6a6-4b05-b689-b2bc01793bf4", + "width": 64, + "x": 298, + "y": 244, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "710c4998-a832-40f0-9f2b-5a579c9e3840", + "width": 64, + "x": 378, + "y": 376, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "eb6b0b70-8826-44fd-9652-feb5a119c67a", + "width": 28, + "x": 760, + "y": 207, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "e6d5b58e-1a06-42dc-a78d-9abeed19f16d", + "width": 28, + "x": 303, + "y": 161, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "32cda707-223f-425c-a4fe-7891859b9ae4", + "width": 28, + "x": 247, + "y": 340, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "827dd4d1-37f5-4659-aa2f-12aa828cd1e6", + "width": 28, + "x": 513, + "y": 476, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "68432921-046d-40f0-b7f2-ae7784321c44", + "width": 18, + "x": 660, + "y": 171, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "b7b2a0fd-2528-4fba-922f-8e23ee7b6bb5", + "width": 18, + "x": 142, + "y": 308, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "b7671368-e04a-4718-83d6-d5533dc04683", + "width": 18, + "x": 343, + "y": 459, + "zOrder": 12, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "c7c451e8-f15a-4f79-8cfb-14daa0e944fc", + "width": 18, + "x": 574, + "y": 253, + "zOrder": 13, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "a94786cb-4a9e-4738-96d1-bc3d1e19e5c5", + "width": 18, + "x": 585, + "y": 129, + "zOrder": 14, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "3c4b246d-f5e2-44a2-b89e-9f6cea82e927", + "width": 18, + "x": 177, + "y": 167, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "7ab05b74-ac81-4d8f-bfba-2e0c4761c0db", + "width": 64, + "x": 371, + "y": 66, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "c30b43e5-2457-49b1-a072-69d92c1343b4", + "width": 18, + "x": 68, + "y": 219, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "605a4f55-c636-4500-9d62-c7c09b5ba5e4", + "width": 18, + "x": 162, + "y": 453, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "d1e14cfd-cc81-4ff6-9a9f-f8ff8071e0cf", + "width": 18, + "x": 734, + "y": 291, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 116, + "layer": "", + "name": "StarBackground", + "persistentUuid": "51cc03a1-a022-4e51-b3b1-79cdbcc88b33", + "width": 161, + "x": 637, + "y": 191, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 116, + "layer": "", + "name": "StarBackground", + "persistentUuid": "bc8af009-373f-47f9-975c-c18598b95f9f", + "width": 161, + "x": 291, + "y": 324, + "zOrder": 23, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "899eb31f-8223-4d99-b226-95037e836938", + "width": 64, + "x": 717, + "y": 387, + "zOrder": 24, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "2fa9abe0-fdcf-4b4a-a59b-03a99ad92d97", + "width": 28, + "x": 232, + "y": 81, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "fa212d1b-7cc4-4e4f-bc71-f6f443886efa", + "width": 18, + "x": 765, + "y": 99, + "zOrder": 26, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "105efa9a-6e94-4050-bb56-0e4120a3da49", + "width": 28, + "x": 692, + "y": 83, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "UI", + "name": "TutorialText", + "persistentUuid": "a58d2328-1eb3-4b48-a3e2-13a9cb6d4392", + "width": 0, + "x": 10, + "y": 466, + "zOrder": 28, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "650505c4-02f9-4f8b-9008-45c12256def2", + "width": 64, + "x": 866, + "y": 256, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 38, + "layer": "", + "name": "BigAsteroid", + "persistentUuid": "26630863-83da-49a3-bfc6-ea92f174a61e", + "width": 64, + "x": 864, + "y": 121, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "ed895a56-6062-4456-a39d-1c8b591a0d25", + "width": 28, + "x": 806, + "y": 471, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "c5beb8e2-264e-4f98-abc1-96deeaff93d4", + "width": 28, + "x": 891, + "y": 342, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "654f880c-fb07-49b4-9ca5-aa0c1810bf3c", + "width": 18, + "x": 690, + "y": 501, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "2b3de375-2b55-431e-a6ed-0fa585a937f4", + "width": 18, + "x": 850, + "y": 409, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "61f2c057-a6c8-43ef-90f0-596cf8efae6a", + "width": 28, + "x": 58, + "y": 410, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 20, + "layer": "", + "name": "MediumAsteroid", + "persistentUuid": "4b685f15-cf4f-431d-bde1-5b67eac9ff5a", + "width": 28, + "x": 75, + "y": 109, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 13, + "layer": "", + "name": "SmallAsteroid", + "persistentUuid": "ec34a641-0c36-465b-8fa4-d61a9f2b727f", + "width": 18, + "x": 903, + "y": 478, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 50, + "layer": "UI", + "name": "LifeBar", + "persistentUuid": "09c1a0ad-0d39-4964-86bd-357b756206b7", + "width": 228, + "x": 32, + "y": 32, + "zOrder": 29, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Flash", + "type": "Flash::Flash", + "HalfPeriodTime": 0.1, + "IsFlashing": false, + "FlashDuration": 0 + }, + { + "name": "Health", + "type": "Health::Health", + "Health": 3, + "DamageCooldown": 1.5, + "MaxHealth": 3, + "IsJustDamaged": false, + "CooldownActive": false + }, + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Dynamic", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 20, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 10, + "friction": 2, + "restitution": 0.2, + "linearDamping": 2, + "angularDamping": 4, + "gravityScale": 0, + "layers": 1, + "masks": 1 + }, + { + "name": "ScreenWrapPhysics", + "type": "ScreenWrap::ScreenWrapPhysics", + "RequiredPhysicsBehavior": "Physics2", + "HorizontalWrapping": true, + "VerticalWrapping": true, + "BorderTop": 0, + "BorderLeft": 0, + "BorderRight": 0, + "BorderBottom": 0, + "TriggerOffset": 25, + "AngularVelocity": 0, + "LinearVelocityX": 0, + "LinearVelocityY": 0 + } + ], + "animations": [ + { + "name": "playerShip3_red", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "playerShip3_red.png", + "points": [ + { + "name": "BulletFlash", + "x": 45, + "y": 19 + }, + { + "name": "BulletSpawn", + "x": 36, + "y": 19 + }, + { + "name": "MotionTrail", + "x": 6, + "y": 19 + } + ], + "originPoint": { + "name": "origine", + "x": 24.5, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 14, + "y": 3 + }, + { + "x": 42, + "y": 19 + }, + { + "x": 14, + "y": 35 + }, + { + "x": 6, + "y": 19 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Bullet", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "DestroyOutside", + "type": "DestroyOutsideBehavior::DestroyOutside", + "extraBorder": 32 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.11999999731779099, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "laserBlue06.png", + "points": [ + { + "name": "BulletHit", + "x": 18.5, + "y": 3.5 + } + ], + "originPoint": { + "name": "origine", + "x": 9.5, + "y": 3.5 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "BigAsteroid", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Dynamic", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Box", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 6, + "friction": 0, + "restitution": 0, + "linearDamping": 0, + "angularDamping": 0, + "gravityScale": 0, + "layers": 1, + "masks": 1 + }, + { + "name": "ScreenWrapPhysics", + "type": "ScreenWrap::ScreenWrapPhysics", + "RequiredPhysicsBehavior": "Physics2", + "HorizontalWrapping": true, + "VerticalWrapping": true, + "BorderTop": 0, + "BorderLeft": 0, + "BorderRight": 0, + "BorderBottom": 0, + "TriggerOffset": 35, + "AngularVelocity": 0, + "LinearVelocityX": 0, + "LinearVelocityY": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_big1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 25.5, + "y": 21 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 9, + "y": 0 + }, + { + "x": 37, + "y": 0 + }, + { + "x": 51, + "y": 20 + }, + { + "x": 42, + "y": 37 + }, + { + "x": 15, + "y": 42 + }, + { + "x": 0, + "y": 25 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_big2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 25.5, + "y": 21 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 10, + "y": 4 + }, + { + "x": 34, + "y": 0 + }, + { + "x": 60, + "y": 10 + }, + { + "x": 53, + "y": 34 + }, + { + "x": 17, + "y": 49 + }, + { + "x": 3, + "y": 38 + }, + { + "x": 0, + "y": 23 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_big3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 25.5, + "y": 21 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 17, + "y": 0 + }, + { + "x": 37, + "y": 6 + }, + { + "x": 45, + "y": 21 + }, + { + "x": 33, + "y": 41 + }, + { + "x": 8, + "y": 37 + }, + { + "x": 1, + "y": 29 + }, + { + "x": 0, + "y": 11 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_big4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 25.5, + "y": 21 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 30 + }, + { + "x": 7, + "y": 8 + }, + { + "x": 33, + "y": 0 + }, + { + "x": 49, + "y": 18 + }, + { + "x": 40, + "y": 45 + }, + { + "x": 15, + "y": 48 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "MediumAsteroid", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Dynamic", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 6, + "friction": 0, + "restitution": 0, + "linearDamping": 0, + "angularDamping": 0, + "gravityScale": 0, + "layers": 1, + "masks": 1 + }, + { + "name": "ScreenWrapPhysics", + "type": "ScreenWrap::ScreenWrapPhysics", + "RequiredPhysicsBehavior": "Physics2", + "HorizontalWrapping": true, + "VerticalWrapping": true, + "BorderTop": 0, + "BorderLeft": 0, + "BorderRight": 0, + "BorderBottom": 0, + "TriggerOffset": 15, + "AngularVelocity": 0, + "LinearVelocityX": 0, + "LinearVelocityY": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_med1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 11, + "y": 11 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 7, + "y": 0 + }, + { + "x": 20, + "y": 2 + }, + { + "x": 22, + "y": 14 + }, + { + "x": 11, + "y": 22 + }, + { + "x": 4, + "y": 18 + }, + { + "x": 0, + "y": 9 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_med3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 11, + "y": 11 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 3 + }, + { + "x": 16, + "y": 0 + }, + { + "x": 23, + "y": 9 + }, + { + "x": 15, + "y": 20 + }, + { + "x": 7, + "y": 19 + }, + { + "x": 0, + "y": 13 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "SmallAsteroid", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Dynamic", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 6, + "friction": 0, + "restitution": 0, + "linearDamping": 0, + "angularDamping": 0, + "gravityScale": 0, + "layers": 1, + "masks": 1 + }, + { + "name": "ScreenWrapPhysics", + "type": "ScreenWrap::ScreenWrapPhysics", + "RequiredPhysicsBehavior": "Physics2", + "HorizontalWrapping": true, + "VerticalWrapping": true, + "BorderTop": 0, + "BorderLeft": 0, + "BorderRight": 0, + "BorderBottom": 0, + "TriggerOffset": 8, + "AngularVelocity": 0, + "LinearVelocityX": 0, + "LinearVelocityY": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_small1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 7, + "y": 7 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 4, + "y": 0 + }, + { + "x": 12, + "y": 1 + }, + { + "x": 14, + "y": 9 + }, + { + "x": 6, + "y": 14 + }, + { + "x": 2, + "y": 11 + }, + { + "x": 0, + "y": 6 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "meteorBrown_small2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 7, + "y": 7 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 4, + "y": 12 + }, + { + "x": 0, + "y": 8 + }, + { + "x": 2, + "y": 2 + }, + { + "x": 10, + "y": 0 + }, + { + "x": 15, + "y": 6 + }, + { + "x": 10, + "y": 13 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "LifeBar", + "type": "TiledUnitsBar::TiledUnitsBar", + "variant": "Life bar", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Flash", + "type": "Flash::Flash", + "HalfPeriodTime": 0.1, + "IsFlashing": false, + "FlashDuration": 0 + } + ], + "content": { + "MaxValue": 3, + "UnitWidth": 36, + "ShowBackground": false + }, + "childrenContent": { + "Background": { + "bottomMargin": 0, + "height": 26, + "leftMargin": 0, + "rightMargin": 0, + "texture": "assets\\playerLife3_empty.png", + "tiled": true, + "topMargin": 0, + "width": 108 + }, + "Bar": { + "height": 26, + "texture": "assets\\playerLife3_empty.png", + "width": 36 + }, + "FillBar": { + "height": 26, + "texture": "assets\\playerLife3_red.png", + "width": 36 + } + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": true, + "name": "GameOver", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [ + { + "effectType": "Glitch", + "name": "Effect", + "doubleParameters": { + "animationFrequency": 8, + "blueX": 8, + "blueY": -4, + "direction": 0, + "fillMode": 0, + "greenX": 8, + "greenY": -4, + "minSize": 8, + "offset": 16, + "redX": 2, + "redY": 2, + "sampleSize": 50, + "slices": 2 + }, + "stringParameters": {}, + "booleanParameters": { + "average": true + } + } + ], + "behaviors": [], + "string": "Game Over", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "characterSize": 120, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": true, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Game Over", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 120, + "color": "255;255;255" + } + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 10, + "emitterForceMin": 10, + "flow": 45, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "DeathShipParticle", + "particleAlpha1": 255, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 75, + "particleAngle2": 75, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 3, + "particleLifeTimeMin": 3, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 40, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 2, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 1, + "textureParticleName": "playerShip3_red.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 10, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 60, + "emitterForceMin": 30, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "DeathDebrisParticle", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 100, + "particleColor1": "255;255;255", + "particleColor2": "100;100;100", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 100, + "particleLifeTimeMax": 2.5, + "particleLifeTimeMin": 0.5, + "particleRed1": 255, + "particleRed2": 100, + "particleSize1": 100, + "particleSize2": 20, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 3, + "rendererParam2": 1, + "rendererType": "Point", + "tank": 20, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 50, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 60, + "emitterForceMin": 40, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "DebrisHuge", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 20, + "particleAngle2": 200, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 0.5, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 100, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 2, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 3, + "textureParticleName": "meteorBrown_med1.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 3, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 60, + "emitterForceMin": 40, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "DebrisMedium", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 20, + "particleAngle2": 200, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 0.5, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 100, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 2, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 2, + "textureParticleName": "meteorBrown_small1.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 3, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 60, + "emitterForceMin": 40, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "DebrisSmall", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 20, + "particleAngle2": 200, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 0.5, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 50, + "particleSize2": 50, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 2, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 2, + "textureParticleName": "meteorBrown_small1.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 3, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "BulletHit", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 245, + "particleBlue2": 129, + "particleColor1": "113;231;245", + "particleColor2": "129;129;129", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 231, + "particleGreen2": 129, + "particleLifeTimeMax": 0.5, + "particleLifeTimeMin": 0.5, + "particleRed1": 113, + "particleRed2": 129, + "particleSize1": 100, + "particleSize2": 150, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 5, + "rendererParam2": 1, + "rendererType": "Point", + "tank": 1, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 300, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "BulletFlash", + "particleAlpha1": 204, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 245, + "particleBlue2": 129, + "particleColor1": "113;231;245", + "particleColor2": "129;129;129", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 231, + "particleGreen2": 129, + "particleLifeTimeMax": 0.5, + "particleLifeTimeMin": 0.5, + "particleRed1": 113, + "particleRed2": 129, + "particleSize1": 100, + "particleSize2": 150, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 5, + "rendererParam2": 1, + "rendererType": "Point", + "tank": 1, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 1, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "StarBackground", + "particleAlpha1": 80, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 7, + "particleLifeTimeMin": 5, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 20, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 2, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": -1, + "textureParticleName": "star1.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 800, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": false, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 20, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "MotionTrail", + "particleAlpha1": 100, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 1, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 10, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 10, + "rendererParam2": 5, + "rendererType": "Point", + "tank": -1, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "TutorialText", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "A/W/D or Arrows To Move.\nSpaceBar To Shoot.", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "characterSize": 30, + "color": { + "b": 143, + "g": 143, + "r": 143 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "A/W/D or Arrows To Move.\nSpaceBar To Shoot.", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 30, + "color": "143;143;143" + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "ContinueText", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Press any key to continue", + "font": "PTSans-Bold.ttf", + "textAlignment": "center", + "characterSize": 30, + "color": { + "b": 143, + "g": 143, + "r": 143 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Press any key to continue", + "font": "PTSans-Bold.ttf", + "textAlignment": "center", + "verticalTextAlignment": "top", + "characterSize": 30, + "color": "143;143;143" + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "RightButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "Right", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Left arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 40, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "LeftButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "Left", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Left arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 40, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "TopButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "Top", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Top arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 40, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "FireButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "Fire", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.02500000037252903, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Fire round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 40, + "y": 40 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Player" + }, + { + "objectName": "Bullet" + }, + { + "objectName": "BigAsteroid" + }, + { + "objectName": "EndingDialog" + }, + { + "objectName": "MediumAsteroid" + }, + { + "objectName": "SmallAsteroid" + }, + { + "objectName": "LifeBar" + }, + { + "folderName": "Text", + "children": [ + { + "objectName": "ContinueText" + }, + { + "objectName": "TutorialText" + }, + { + "objectName": "GameOver" + } + ] + }, + { + "folderName": "ParticleEffects", + "children": [ + { + "objectName": "DeathDebrisParticle" + }, + { + "objectName": "DeathShipParticle" + }, + { + "objectName": "DebrisHuge" + }, + { + "objectName": "DebrisMedium" + }, + { + "objectName": "DebrisSmall" + }, + { + "objectName": "BulletHit" + }, + { + "objectName": "BulletFlash" + }, + { + "objectName": "StarBackground" + }, + { + "objectName": "MotionTrail" + } + ] + }, + { + "folderName": "MobileControls", + "children": [ + { + "objectName": "FireButton" + }, + { + "objectName": "TopButton" + }, + { + "objectName": "LeftButton" + }, + { + "objectName": "RightButton" + } + ] + } + ] + }, + "events": [ + { + "colorB": 155, + "colorG": 155, + "colorR": 155, + "creationTime": 0, + "folded": true, + "name": "Gameplay", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The screen wraping is done by behaviors that are setup in the objects configuration." + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Beginning of scene", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GamePlaying\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"MultiTouchControls\"", + "0", + "0" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "TutorialText", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Give some variety to the asteroid field." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "BigAsteroid", + "Animation", + "=", + "Random(3)" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "MediumAsteroid", + "Animation", + "=", + "Random(1)" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "SmallAsteroid", + "Animation", + "=", + "Random(1)" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Asteroid", + "=", + "Random(360)" + ] + }, + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Asteroid", + "+", + "RandomInRange(-32, 32)", + "+", + "RandomInRange(-32, 32)" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Game playing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GamePlaying\"" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Motion trail", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When a forward input method is pressed, it creates the motion trail behind the player." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MotionTrail", + "0", + "0", + "\"\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "MotionTrail", + "=", + "Player.PointX(\"MotionTrail\")", + "=", + "Player.PointY(\"MotionTrail\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "w" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Up" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "TopButton", + "MultitouchButton", + "" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ParticleSystem::StartEmission" + }, + "parameters": [ + "MotionTrail" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "KeyPressed" + }, + "parameters": [ + "", + "w" + ] + }, + { + "type": { + "inverted": true, + "value": "KeyPressed" + }, + "parameters": [ + "", + "Up" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "TopButton", + "MultitouchButton", + "" + ] + }, + { + "type": { + "value": "SceneInstancesCount" + }, + "parameters": [ + "TopArrowRoundButton", + "TopButton", + "=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ParticleSystem::StopEmission" + }, + "parameters": [ + "MotionTrail" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Player movement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "w" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Up" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "TopButton", + "MultitouchButton", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics2::ApplyPolarForce" + }, + "parameters": [ + "Player", + "Physics2", + "Player.Angle()", + "4.5", + "Player.X()", + "Player.Y()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "a" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "LeftButton", + "MultitouchButton", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "Player", + "Physics2", + "-0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "d" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "", + "Right" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "RightButton", + "MultitouchButton", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "Player", + "Physics2", + "0.5" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Asteroid splitting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Split asteroids in 2 smaller asteroids." + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "BigAsteroid", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Bullet", + "BigAsteroid", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Explosion.wav", + "", + "60", + "RandomFloatInRange(0.9, 1)" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "DebrisHuge", + "BigAsteroid.X()", + "BigAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BulletHit", + "Bullet.PointX(\"BulletHit\")", + "Bullet.PointY(\"BulletHit\")", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "BigAsteroid", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Bullet", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MediumAsteroid", + "BigAsteroid.X()", + "BigAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "MediumAsteroid", + "=", + "Random(360)" + ] + }, + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "MediumAsteroid", + "BigAsteroid", + "15", + "Bullet.Angle() - 90" + ] + }, + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "MediumAsteroid", + "Physics2", + "RandomFloatInRange(-0.1, 0.1)" + ] + }, + { + "type": { + "value": "Physics2::ApplyPolarForce" + }, + "parameters": [ + "MediumAsteroid", + "Physics2", + "Bullet.Angle() + RandomFloatInRange(-60, 0)", + "5", + "MediumAsteroid.Physics2::MassCenterX()", + "MediumAsteroid.Physics2::MassCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MediumAsteroid", + "BigAsteroid.X()", + "BigAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "MediumAsteroid", + "=", + "Random(360)" + ] + }, + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "MediumAsteroid", + "BigAsteroid", + "15", + "Bullet.Angle() + 90" + ] + }, + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "MediumAsteroid", + "Physics2", + "RandomFloatInRange(-0.1, 0.1)" + ] + }, + { + "type": { + "value": "Physics2::ApplyPolarForce" + }, + "parameters": [ + "MediumAsteroid", + "Physics2", + "Bullet.Angle() + RandomFloatInRange(0, 60)", + "5", + "MediumAsteroid.Physics2::MassCenterX()", + "MediumAsteroid.Physics2::MassCenterY()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "MediumAsteroid", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Bullet", + "MediumAsteroid", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Explosion.wav", + "", + "55", + "RandomFloatInRange(1, 1.1)" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "DebrisMedium", + "MediumAsteroid.X()", + "MediumAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BulletHit", + "Bullet.PointX(\"BulletHit\")", + "Bullet.PointY(\"BulletHit\")", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "MediumAsteroid", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Bullet", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SmallAsteroid", + "BigAsteroid.X()", + "BigAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "SmallAsteroid", + "=", + "Random(360)" + ] + }, + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "SmallAsteroid", + "MediumAsteroid", + "8", + "Bullet.Angle() - 90" + ] + }, + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "SmallAsteroid", + "Physics2", + "RandomFloatInRange(-0.1, 0.1)" + ] + }, + { + "type": { + "value": "Physics2::ApplyPolarForce" + }, + "parameters": [ + "SmallAsteroid", + "Physics2", + "Bullet.Angle() + RandomFloatInRange(-60, 0)", + "2", + "SmallAsteroid.Physics2::MassCenterX()", + "SmallAsteroid.Physics2::MassCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SmallAsteroid", + "MediumAsteroid.X()", + "MediumAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "SmallAsteroid", + "=", + "Random(360)" + ] + }, + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "SmallAsteroid", + "MediumAsteroid", + "8", + "Bullet.Angle() + 90" + ] + }, + { + "type": { + "value": "Physics2::ApplyTorque" + }, + "parameters": [ + "SmallAsteroid", + "Physics2", + "RandomFloatInRange(-0.1, 0.1)" + ] + }, + { + "type": { + "value": "Physics2::ApplyPolarForce" + }, + "parameters": [ + "SmallAsteroid", + "Physics2", + "Bullet.Angle() + RandomFloatInRange(0, 60)", + "2", + "SmallAsteroid.Physics2::MassCenterX()", + "SmallAsteroid.Physics2::MassCenterY()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Smallest asteroids are destryed when hit." + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "SmallAsteroid", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Bullet", + "SmallAsteroid", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Explosion.wav", + "", + "50", + "RandomFloatInRange(1.1, 1.2)" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "DebrisSmall", + "SmallAsteroid.X()", + "SmallAsteroid.Y()", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BulletHit", + "Bullet.PointX(\"BulletHit\")", + "Bullet.PointY(\"BulletHit\")", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "SmallAsteroid", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Bullet", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Player health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "CameraShake::SetLayerTranslationAmplitude" + }, + "parameters": [ + "", + "1", + "1", + "\"\"", + "" + ] + }, + { + "type": { + "value": "CameraShake::SetLayerRotationAmplitude" + }, + "parameters": [ + "", + "1", + "\"\"", + "" + ] + }, + { + "type": { + "value": "CameraShake::SetLayerZoomAmplitude" + }, + "parameters": [ + "", + "1.01", + "\"\"", + "" + ] + }, + { + "type": { + "value": "CameraShake::SetDefaultShakingFrequency" + }, + "parameters": [ + "", + "10", + "\"\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Getting hurt" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Physics2::Collision" + }, + "parameters": [ + "Player", + "Physics2", + "Asteroid", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Bump.wav", + "", + "60", + "RandomFloatInRange(0.9, 1.1)" + ] + }, + { + "type": { + "value": "CameraShake::ShakeCamera" + }, + "parameters": [ + "", + "1", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Flash::Flash::Flash" + }, + "parameters": [ + "Player", + "Flash", + "1.5", + "" + ] + }, + { + "type": { + "value": "Flash::Flash::Flash" + }, + "parameters": [ + "LifeBar", + "Flash", + "1.5", + "" + ] + }, + { + "type": { + "value": "Health::Health::Hit" + }, + "parameters": [ + "Player", + "Health", + "1", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "LifeBar", + "=", + "Player.Health::Health()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Player", + "Health", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ParticleSystem::StopEmission" + }, + "parameters": [ + "MotionTrail" + ] + }, + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GameOverAnimation\"" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SceneInstancesCount(Bullet)", + "!=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "3" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "\"UI\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraCenterX(\"UI\")", + "=", + "CameraCenterY(\"UI\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Game over", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GameOverAnimation\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The particule DeathShipParticle has the same image as Player. It does a \"going to the void\" animation." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Death.wav", + "", + "50", + "1" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "DeathShipParticle", + "Player.X()", + "Player.Y()", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "DeathDebrisParticle", + "Player.X()", + "Player.Y()", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "DeathShipParticle", + "=", + "Player.Angle()" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Player", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "BuiltinExternalLayouts::CreateObjectsFromExternalLayout" + }, + "parameters": [ + "", + "\"GameOver\"", + "0", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "TutorialText" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "ContinueText" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "2" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "ContinueText", + "" + ] + }, + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GameOverWaitKey\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "State", + "=", + "\"GameOverWaitKey\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "AnyKeyReleased" + }, + "parameters": [ + "" + ] + }, + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"PlayScene\"", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Fire bullets", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Button press to fire a bullet" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReadyToShoot" + }, + "parameters": [ + "Player", + "FireBullet", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyFromTextPressed" + }, + "parameters": [ + "", + "\"Space\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "FireButton", + "MultitouchButton", + "" + ] + } + ] + } + ], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After firing a bullet" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::HasJustFired" + }, + "parameters": [ + "Player", + "FireBullet", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Bullet", + "=", + "Player.ZOrder() - 2" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "LaserFire.wav", + "", + "40", + "RandomFloatInRange(0.9, 1.1)" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BulletFlash", + "Player.PointX(\"BulletFlash\")", + "Player.PointY(\"BulletFlash\")", + "" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "BulletFlash", + "=", + "Player.Angle() + 90" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "BulletFlash", + "=", + "Player.ZOrder() - 1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 7414480, + "ambientLightColorG": 6024160, + "ambientLightColorR": 8052624, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 7296784, + "ambientLightColorG": 6025824, + "ambientLightColorR": 9298368, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "MobileControls", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flash", + "type": "Flash::Flash" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "gravityX": 0, + "gravityY": 9.8, + "scaleX": 100, + "scaleY": 100 + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "ScreenWrapPhysics", + "type": "ScreenWrap::ScreenWrapPhysics" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Fire bullets", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/extensions/fire-bullet/details", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWJ1bGxldCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNCwyMkgxMFYyMUgxNFYyMk0xMywxMFY3SDExVjEwTDEwLDExLjVWMjBIMTRWMTEuNUwxMywxME0xMiwyQzEyLDIgMTEsMyAxMSw1VjZIMTNWNUMxMyw1IDEzLDMgMTIsMloiIC8+PC9zdmc+", + "name": "FireBullet", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/bullet.svg", + "shortDescription": "Fire bullets, manage ammo, reloading and overheating.", + "version": "0.9.1", + "description": [ + "This extension allows objects to fire bullets. To use it, add the behavior to the object that will shoot, then use the provided action to launch another object as the bullet.", + "", + "The properties of the behavior can be used to customize:", + "- Cooldown between shots", + "- Firing multiple bullets at a time ([open the project online](https://editor.gdevelop.io/?project=example://fire-bullet))", + "- Ammo management", + "- Overheat", + "", + "It can be used for:", + "- Twin-stick shooters ([open the project online](https://editor.gdevelop.io/?project=example://conviction-of-gun-dude-desktop))", + "- Shoot'em up ([open the project online](https://editor.gdevelop.io/?project=example://space-shooter))", + "", + "A simple example shows how to make firing patterns ([open the project online](https://editor.gdevelop.io/?project=example://firing-patterns))." + ], + "origin": { + "identifier": "FireBullet", + "name": "gdevelop-extension-store" + }, + "tags": [ + "fire", + "bullet", + "spawn", + "firerate", + "reload", + "weapon", + "ranged", + "ammo", + "overheat" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "2OwwM8ToR9dx9RJ2sAKTcrLmCB92", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Fire bullets, manage ammo, reloading, and overheating. Once added to your object that must shoot, use the behavior action in your events to fire another object as a bullet.", + "fullName": "Fire bullets", + "name": "FireBullet", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.FiringCooldown\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "=", + "StartingAmmo" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "=", + "ShotsPerReload" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Take a shot (if triggered)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Creators can use the \"FireBullet\" action multiple times in a frame and it will be counted as a single \"shot\"." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HasJustFired", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HasJustFired", + "False", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.FiringCooldown\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalShotsFired", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Ammo", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "UnlimitedAmmo", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "=", + "max(0, AmmoQuantity - 1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShotsPerReload", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "-", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "AutomaticReloading", + "True", + "" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::ReloadAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Overheat", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HeatIncreasePerShot", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HeatLevel", + "+", + "HeatIncreasePerShot" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "OverheatDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.OverheatDuration\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reload", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when reload is completed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"", + ">=", + "ReloadDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalReloadsCompleted", + "+", + "1" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ReloadInProgress", + "False", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "=", + "ShotsPerReload" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only reload the amount of ammo available" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "=", + "min(ShotsPerReload, AmmoQuantity)" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Cooling", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "HeatLevel", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ExponentialCoolingRate", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HeatLevel", + "=", + "max(0, HeatLevel - TimeDelta() * ExponentialCoolingRate * HeatLevel)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "LinearCoolingRate", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HeatLevel", + "=", + "max(0, HeatLevel - TimeDelta() * LinearCoolingRate)" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Fire bullets toward an object.", + "fullName": "Fire bullets toward an object", + "functionType": "Action", + "name": "FireTowardObject", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward _PARAM5_ with speed _PARAM6_ px/s", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::Fire" + }, + "parameters": [ + "Object", + "Behavior", + "XPosition", + "YPosition", + "Bullet", + "Object.AngleToObject(TargetObject)", + "Speed", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectListOrEmptyIfJustDeclared" + }, + { + "description": "Target object", + "name": "TargetObject", + "type": "objectList" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fire bullets toward a position.", + "fullName": "Fire bullets toward a position", + "functionType": "Action", + "name": "FireTowardPosition", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward position _PARAM5_;_PARAM6_ with speed _PARAM7_ px/s", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::Fire" + }, + "parameters": [ + "Object", + "Behavior", + "XPosition", + "YPosition", + "Bullet", + "Object.AngleToPosition(TargetXPosition, TargetYPosition)", + "Speed", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectListOrEmptyIfJustDeclared" + }, + { + "description": "Target X position", + "name": "TargetXPosition", + "type": "expression" + }, + { + "description": "Target Y position", + "name": "TargetYPosition", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fire bullets in the direction of a given angle.", + "fullName": "Fire bullets toward an angle", + "functionType": "Action", + "name": "Fire", + "sentence": "Fire _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, toward angle _PARAM5_ and speed _PARAM6_ px/s", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReadyToShoot" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HasJustFired", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "BulletQuantity", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "XPosition", + "YPosition", + "Bullet", + "Angle", + "Speed", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "BulletQuantity", + ">", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "BulletQuantity", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::FiringArc" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "360", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MultiShotAngle", + "=", + "Angle + lerp(-FiringArc / 2, FiringArc / 2, BulletIndex / (BulletQuantity - 1)) " + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When firing in a full circle, prevent first and last bullet from using the same angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::FiringArc" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "360", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MultiShotAngle", + "=", + "Angle + lerp(-FiringArc / 2, FiringArc / 2, BulletIndex / BulletQuantity) " + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::FireSingleBullet" + }, + "parameters": [ + "Object", + "Behavior", + "XPosition", + "YPosition", + "Bullet", + "MultiShotAngle", + "Speed", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BulletIndex", + "+", + "1" + ] + } + ] + } + ] + } + ], + "variables": [ + { + "folded": true, + "name": "MultiShotAngle", + "type": "number", + "value": 0 + }, + { + "name": "BulletIndex", + "type": "number", + "value": 0 + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectListOrEmptyIfJustDeclared" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Fire a single bullet. This is only meant to be used inside the \"Fire bullet\" action.", + "fullName": "Fire a single bullet", + "functionType": "Action", + "group": "Firing", + "name": "FireSingleBullet", + "private": true, + "sentence": "Fire a single bullet _PARAM4_ from _PARAM0_, at position _PARAM2_; _PARAM3_, with angle _PARAM5_ and speed _PARAM6_ px/s", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Fire a single bullet", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Create bullet" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Bullet", + "XPosition", + "YPosition", + "BulletLayer" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move bullet (apply angle and bullet speed variances)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "RandomizedAngle", + "=", + "Angle + RandomInRange(-AngleVariance, AngleVariance)" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "Bullet", + "RandomizedAngle", + "Speed + RandomInRange(-BulletSpeedVariance, BulletSpeedVariance)", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Rotate newly created bullet, if needed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "RotateBullet", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Bullet", + "=", + "RandomizedAngle" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update statistics" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalBulletsCreated", + "+", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "X position, where to create the bullet", + "name": "XPosition", + "type": "expression" + }, + { + "description": "Y position, where to create the bullet", + "name": "YPosition", + "type": "expression" + }, + { + "description": "The bullet object", + "name": "Bullet", + "type": "objectListOrEmptyIfJustDeclared" + }, + { + "description": "Angle of the bullet, in degrees", + "name": "Angle", + "type": "expression" + }, + { + "description": "Speed of the bullet, in pixels per second", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reload ammo.", + "fullName": "Reload ammo", + "functionType": "Action", + "name": "ReloadAmmo", + "sentence": "Reload ammo on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ReloadInProgress", + "True", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has just fired something.", + "fullName": "Has just fired", + "functionType": "Condition", + "group": "Firing", + "name": "HasJustFired", + "sentence": "_PARAM0_ has just fired", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HasJustFired", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if bullet rotates to match trajectory.", + "fullName": "Is bullet rotation enabled", + "functionType": "Condition", + "group": "Firing", + "name": "BulletRotationEnabled", + "sentence": "Bullet rotation enabled on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "RotateBullet", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the firing arc (in degrees) where bullets are shot. Bullets are evenly spaced out inside the firing arc.", + "fullName": "Firing arc", + "functionType": "ExpressionAndCondition", + "group": "Multi-Fire", + "name": "FiringArc", + "sentence": "the firing arc", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FiringArc" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FiringArc", + "name": "SetFiringArcOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FiringArc", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Firing arc (degrees) Range: 0 to 360", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the firing arc (in degrees) where bullets will be shot. Bullets will be evenly spaced out inside the firing arc.", + "fullName": "Set firing arc (deprecated)", + "functionType": "Action", + "group": "Multi-Fire", + "name": "SetFiringArc", + "private": true, + "sentence": "Set firing arc of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetFiringArcOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Firing arc (degrees) Range: 0 to 360", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the angle variance (in degrees) applied to each bullet.", + "fullName": "Angle variance", + "functionType": "ExpressionAndCondition", + "group": "Firing variance", + "name": "AngleVariance", + "sentence": "the angle variance", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "AngleVariance" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "AngleVariance", + "name": "SetAngleVarianceOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AngleVariance", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle variance (in degrees) applied to each bullet.", + "fullName": "Set angle variance (deprecated)", + "functionType": "Action", + "group": "Firing", + "name": "SetAngleVariance", + "private": true, + "sentence": "Set angle variance of _PARAM0_ to _PARAM2_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetAngleVarianceOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the bullet speed variance (pixels per second) applied to each bullet.", + "fullName": "Bullet speed variance", + "functionType": "ExpressionAndCondition", + "group": "Firing variance", + "name": "BulletSpeedVariance", + "sentence": "the bullet speed variance", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BulletSpeedVariance" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "BulletSpeedVariance", + "name": "SetBulletSpeedVarianceOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BulletSpeedVariance", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the speed variance (pixels per second) applied to each bullet.", + "fullName": "Set bullet speed variance (deprecated)", + "functionType": "Action", + "group": "Multi-Fire", + "name": "SetBulletSpeedVariance", + "private": true, + "sentence": "Set bullet speed variance of _PARAM0_ to _PARAM2_ pixels per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetBulletSpeedVarianceOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Angle variance (degrees) Range: 0 to 180", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the number of bullets shot every time the \"fire bullet\" action is used.", + "fullName": "Bullets per shot", + "functionType": "ExpressionAndCondition", + "group": "Multi-Fire", + "name": "BulletQuantity", + "sentence": "the number of bullets per shot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BulletQuantity" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "BulletQuantity", + "name": "SetBulletQuantityOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BulletQuantity", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Bullets", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of bullets shot every time the \"fire bullet\" action is used.", + "fullName": "Set number of bullets per shot (deprecated)", + "functionType": "Action", + "group": "Multi-Fire", + "name": "SetBulletQuantity", + "private": true, + "sentence": "Set number of bullets per shot of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetBulletQuantityOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Bullets", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the layer that bullets are created on.", + "fullName": "Set bullet layer", + "functionType": "Action", + "group": "Firing", + "name": "SetBulletLayer", + "sentence": "Set the layer used to create bullets fired by _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "BulletLayer", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Layer", + "name": "Value", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Enable bullet rotation.", + "fullName": "Enable (or disable) bullet rotation", + "functionType": "Action", + "group": "Firing", + "name": "SetRotateBullet", + "sentence": "Enable bullet rotation on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "RotateBullet", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "RotateBullet", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Rotate bullet to match trajetory", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable unlimited ammo.", + "fullName": "Enable (or disable) unlimited ammo", + "functionType": "Action", + "group": "Ammo", + "name": "SetUnlimitedAmmo", + "sentence": "Enable unlimited ammo on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "UnlimitedAmmo", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "UnlimitedAmmo", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Unlimited ammo", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "the firing cooldown (in seconds) also known as rate of fire.", + "fullName": "Firing cooldown", + "functionType": "ExpressionAndCondition", + "group": "Firing", + "name": "Cooldown", + "sentence": "the firing cooldown", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FireCooldown" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Cooldown", + "name": "SetCooldownOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FireCooldown", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Cooldown in seconds", + "name": "NewCooldown", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the firing cooldown, which changes the rate of fire.", + "fullName": "Set firing cooldown (deprecated)", + "functionType": "Action", + "group": "Firing", + "name": "SetCooldown", + "private": true, + "sentence": "Set the fire rate of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetCooldownOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Cooldown in seconds", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the reload duration (in seconds).", + "fullName": "Reload duration", + "functionType": "ExpressionAndCondition", + "group": "Reload", + "name": "ReloadDuration", + "sentence": "the reload duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ReloadDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ReloadDuration", + "name": "SetReloadDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ReloadDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Reload duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration to reload ammo.", + "fullName": "Set reload duration (deprecated)", + "functionType": "Action", + "group": "Reload", + "name": "SetReloadDuration", + "private": true, + "sentence": "Set the reload duration of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetReloadDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Reload duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the overheat duration (in seconds). When an object is overheated, it can't fire for this duration.", + "fullName": "Overheat duration", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "OverheatDuration", + "sentence": "the overheat duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "OverheatDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OverheatDuration", + "name": "SetOverheatDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OverheatDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Overheat duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration after becoming overheated.", + "fullName": "Set overheat duration (deprecated)", + "functionType": "Action", + "group": "Overheat", + "name": "SetOverheatDuration", + "private": true, + "sentence": "Set the overheat duration of _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetOverheatDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Overheat duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the ammo quantity.", + "fullName": "Ammo quantity", + "functionType": "ExpressionAndCondition", + "group": "Ammo", + "name": "AmmoQuantity", + "sentence": "the ammo quantity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "AmmoQuantity" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "AmmoQuantity", + "name": "SetAmmoQuantityOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "=", + "max(0, Value)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the quantity of ammo.", + "fullName": "Set ammo quantity (deprecated)", + "functionType": "Action", + "group": "Ammo", + "name": "SetAmmoQuantity", + "private": true, + "sentence": "Set the ammo quantity of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetAmmoQuantityOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Value)", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the heat increase per shot.", + "fullName": "Heat increase per shot", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "HeatIncreasePerShot", + "sentence": "the heat increase per shot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HeatIncreasePerShot" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HeatIncreasePerShot", + "name": "SetHeatPerShotOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HeatIncreasePerShot", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat increase per shot (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the heat increase per shot.", + "fullName": "Set heat increase per shot (deprecated)", + "functionType": "Action", + "group": "Overheat", + "name": "SetHeatPerShot", + "private": true, + "sentence": "Set the heat increase of _PARAM0_ to _PARAM2_ per shot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetHeatPerShotOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat increase per shot (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the max ammo.", + "fullName": "Max ammo", + "functionType": "ExpressionAndCondition", + "group": "Ammo", + "name": "MaxAmmo", + "sentence": "the max ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxAmmo" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxAmmo", + "name": "SetMaxAmmoOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxAmmo", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxAmmo", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "=", + "min(MaxAmmo, AmmoQuantity)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Max ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the max ammo.", + "fullName": "Set max ammo (deprecated)", + "functionType": "Action", + "group": "Ammo", + "name": "SetMaxAmmo", + "private": true, + "sentence": "Set the max ammo of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetMaxAmmoOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Max ammo", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total shots fired.", + "fullName": "Reset total shots fired", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalShotsFired", + "sentence": "Reset total shots fired by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalShotsFired", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total bullets created.", + "fullName": "Reset total bullets created", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalBulletsCreated", + "sentence": "Reset total bullets created by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalBulletsCreated", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset total reloads completed.", + "fullName": "Reset total reloads completed", + "functionType": "Action", + "group": "Stats", + "name": "ResetTotalReloadsCompleted", + "sentence": "Reset total reloads completed by _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TotalReloadsCompleted", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the number of shots per reload.", + "fullName": "Shots per reload", + "functionType": "ExpressionAndCondition", + "group": "Reload", + "name": "ShotsPerReload", + "sentence": "the shots per reload", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShotsPerReload" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShotsPerReload", + "name": "SetShotsPerReloadOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsPerReload", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + ">", + "ShotsPerReload" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "=", + "ShotsPerReload" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Shots per reload", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of shots per reload.", + "fullName": "Set shots per reload (deprecated)", + "functionType": "Action", + "group": "Reload", + "name": "SetShotsPerReload", + "private": true, + "sentence": "Set the shots per reload of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetShotsPerReloadOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Shots per reload", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automatic reloading.", + "fullName": "Enable (or disable) automatic reloading", + "functionType": "Action", + "group": "Reload", + "name": "SetAutomaticReload", + "sentence": "Enable automatic reloading on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AutomaticReloading", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AutomaticReloading", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable automatic reloading", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "the linear cooling rate (per second).", + "fullName": "Linear cooling rate", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "LinearCoolingRate", + "sentence": "the linear cooling rate", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "LinearCoolingRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "LinearCoolingRate", + "name": "SetLinearCoolingRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LinearCoolingRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat cooling rate (per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the linear rate of cooling.", + "fullName": "Set linear cooling rate (deprecated)", + "functionType": "Action", + "group": "Overheat", + "name": "SetLinearCoolingRate", + "private": true, + "sentence": "Set the linear cooling rate of _PARAM0_ to _PARAM2_ per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetLinearCoolingRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Heat cooling rate (per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the exponential cooling rate, per second.", + "fullName": "Exponential cooling rate", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "ExponentialCoolingRate", + "sentence": "the exponential cooling rate", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ExponentialCoolingRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ExponentialCoolingRate", + "name": "SetExponentialCoolingRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ExponentialCoolingRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Exponential cooling rate", + "name": "Value", + "supplementaryInformation": "[\"Exponential\",\"Linear\"]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the exponential rate of cooling.", + "fullName": "Set exponential cooling rate (deprecated)", + "functionType": "Action", + "group": "Overheat", + "name": "SetExponentialCoolingRate", + "private": true, + "sentence": "Set the exponential cooling rate of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::SetExponentialCoolingRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Exponential cooling rate", + "name": "Value", + "supplementaryInformation": "[\"Exponential\",\"Linear\"]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Increase ammo quantity.", + "fullName": "Increase ammo", + "functionType": "Action", + "name": "IncreaseAmmo", + "sentence": "Increase ammo of _PARAM0_ by _PARAM2_ shots", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "+", + "AmmoGained" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Ammo is set, do not exceed the value" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxAmmo", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "=", + "min(MaxAmmo, AmmoQuantity)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "AutomaticReloading", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "FireBullet::FireBullet::ReloadAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + }, + { + "description": "Ammo gained", + "name": "AmmoGained", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Layer that bullets are created on.", + "fullName": "Bullet layer", + "functionType": "StringExpression", + "group": "Multi-Fire", + "name": "BulletLayer", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "BulletLayer" + ] + } + ] + } + ], + "expressionType": { + "type": "layer" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the heat level (range: 0 to 1).", + "fullName": "Heat level", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "HeatLevel", + "sentence": "the heat level", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "min(1, HeatLevel)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Total shots fired (multi-bullet shots are considered one shot).", + "fullName": "Shots fired", + "functionType": "Expression", + "group": "Stats", + "name": "TotalShotsFired", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TotalShotsFired" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Total bullets created.", + "fullName": "Bullets created", + "functionType": "Expression", + "group": "Stats", + "name": "TotalBulletsCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TotalBulletsCreated" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reloads completed.", + "fullName": "Reloads completed", + "functionType": "Expression", + "group": "Stats", + "name": "TotalReloadsCompleted", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TotalReloadsCompleted" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the remaining shots before the next reload is required.", + "fullName": "Shots before next reload", + "functionType": "ExpressionAndCondition", + "group": "Reload", + "name": "ShotsBeforeNextReload", + "sentence": "the remaining shots (before the next reload)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShotsBeforeNextReload" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the remaining duration before the cooldown will permit a bullet to be fired, in seconds.", + "fullName": "Duration before cooldown end", + "functionType": "ExpressionAndCondition", + "group": "Firing", + "name": "CooldownTimeLeft", + "sentence": "the remaining duration before the cooldown end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, FireCooldown - Object.ObjectTimerElapsedTime(\"__FireBullet.FiringCooldown\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the remaining duration before the overheat penalty ends, in seconds.", + "fullName": "Duration before overheat end", + "functionType": "ExpressionAndCondition", + "group": "Overheat", + "name": "OverheatTimeLeft", + "sentence": "the remaining duration before the overheat end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.OverheatDuration\"", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, OverheatDuration - Object.ObjectTimerElapsedTime(\"__FireBullet.OverheatDuration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the remaining duration before the reload finishes, in seconds.", + "fullName": "Duration before the reload finishes", + "functionType": "ExpressionAndCondition", + "group": "Reload", + "name": "ReloadTimeLeft", + "sentence": "the remaining duration before the reload finishes", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__FireBullet.ReloadingTimer\"", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, ReloadDuration - Object.ObjectTimerElapsedTime(\"__FireBullet.ReloadingTimer\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is currently performing an ammo reload.", + "fullName": "Is ammo reloading in progress", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadInProgress", + "sentence": "_PARAM0_ is reloading ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ReloadInProgress", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is ready to shoot.", + "fullName": "Is ready to shoot", + "functionType": "Condition", + "group": "Firing", + "name": "IsReadyToShoot", + "sentence": "_PARAM0_ is ready to shoot", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HasJustFired", + "True", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BehaviorActivated" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOutOfAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadNeeded" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsReloadInProgress" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsFiringCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsOverheated" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if automatic reloading is enabled.", + "fullName": "Is automatic reloading enabled", + "functionType": "Condition", + "group": "Reload", + "name": "IsAutomaticReloadingEnabled", + "sentence": "Automatic reloading is enabled on_PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "AutomaticReloading", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if ammo is unlimited.", + "fullName": "Is ammo unlimited", + "functionType": "Condition", + "group": "Ammo", + "name": "IsUnlimitedAmmo", + "sentence": "_PARAM0_ has unlimited ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "UnlimitedAmmo", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object has no ammo available.", + "fullName": "Is out of ammo", + "functionType": "Condition", + "group": "Ammo", + "name": "IsOutOfAmmo", + "sentence": "_PARAM0_ is out of ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "FireBullet::FireBullet::IsUnlimitedAmmo" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "AmmoQuantity", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object needs to reload ammo.", + "fullName": "Is a reload needed", + "functionType": "Condition", + "group": "Reload", + "name": "IsReloadNeeded", + "sentence": "_PARAM0_ needs to reload ammo", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shots per reload must not be \"0\"" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShotsPerReload", + ">", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShotsBeforeNextReload", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if object is overheated.", + "fullName": "Is overheated", + "functionType": "Condition", + "group": "Overheat", + "name": "IsOverheated", + "sentence": "_PARAM0_ is overheated", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HeatLevel", + ">=", + "1" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::OverheatTimeLeft()", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if firing cooldown is active.", + "fullName": "Is firing cooldown active", + "functionType": "Condition", + "group": "Firing", + "name": "IsFiringCooldownActive", + "sentence": "Firing cooldown is active on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CooldownTimeLeft()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FireBullet::FireBullet", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Firing cooldown", + "description": "Objects cannot shoot while firing cooldown is active.", + "name": "FireCooldown" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "HasJustFired" + }, + { + "value": "true", + "type": "Boolean", + "label": "Rotate bullets to match their trajectory", + "name": "RotateBullet" + }, + { + "value": "45", + "type": "Number", + "unit": "DegreeAngle", + "label": "Firing arc", + "description": "Multi-Fire bullets will be evenly spaced inside the firing arc", + "group": "Multi-Fire", + "name": "FiringArc" + }, + { + "value": "1", + "type": "Number", + "label": "Number of bullets created at once", + "description": "Multi-Fire bullets will be evenly spaced inside the firing arc", + "group": "Multi-Fire", + "name": "BulletQuantity" + }, + { + "value": "0", + "type": "Number", + "unit": "DegreeAngle", + "label": "Angle variance", + "description": "Make imperfect aim (between 0 and 180 degrees).", + "group": "Firing variance", + "advanced": true, + "name": "AngleVariance" + }, + { + "value": "0", + "type": "Number", + "unit": "PixelSpeed", + "label": "Bullet speed variance", + "description": "Bullet speed will be adjusted by a random value within this range.", + "group": "Firing variance", + "advanced": true, + "name": "BulletSpeedVariance" + }, + { + "value": "0", + "type": "Number", + "label": "Ammo quantity (current)", + "hidden": true, + "name": "AmmoQuantity" + }, + { + "value": "0", + "type": "Number", + "label": "Shots per reload ", + "description": "Use 0 to disable reloading.", + "group": "Reload", + "advanced": true, + "name": "ShotsPerReload" + }, + { + "value": "1", + "type": "Number", + "unit": "Second", + "label": "Reloading duration", + "description": "Objects cannot shoot while reloading is in progress.", + "group": "Reload", + "advanced": true, + "name": "ReloadDuration" + }, + { + "value": "0", + "type": "Number", + "label": "Max ammo ", + "group": "Ammo", + "advanced": true, + "name": "MaxAmmo" + }, + { + "value": "0", + "type": "Number", + "label": "Shots before next reload", + "hidden": true, + "name": "ShotsBeforeNextReload" + }, + { + "value": "0", + "type": "Number", + "label": "Total shots fired", + "description": "Regardless of how many bullets are created, only 1 shot will be counted per frame", + "hidden": true, + "name": "TotalShotsFired" + }, + { + "value": "0", + "type": "Number", + "label": "Total bullets created", + "hidden": true, + "name": "TotalBulletsCreated" + }, + { + "value": "0", + "type": "Number", + "label": "Starting ammo", + "group": "Ammo", + "advanced": true, + "name": "StartingAmmo" + }, + { + "value": "0", + "type": "Number", + "label": "Total reloads completed", + "hidden": true, + "name": "TotalReloadsCompleted" + }, + { + "value": "true", + "type": "Boolean", + "label": "Unlimited ammo", + "group": "Ammo", + "advanced": true, + "name": "UnlimitedAmmo" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ReloadInProgress" + }, + { + "value": "0", + "type": "Number", + "label": "Heat increase per shot (between 0 and 1)", + "description": " Object is overheated when Heat reaches 1.", + "group": "Overheat", + "advanced": true, + "name": "HeatIncreasePerShot" + }, + { + "value": "0", + "type": "Number", + "label": "Heat level (Range: 0 to 1)", + "hidden": true, + "name": "HeatLevel" + }, + { + "value": "true", + "type": "Boolean", + "label": "Reload automatically", + "group": "Reload", + "advanced": true, + "name": "AutomaticReloading" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Overheat duration", + "description": "Object cannot shoot while overheat duration is active.", + "group": "Overheat", + "advanced": true, + "name": "OverheatDuration" + }, + { + "value": "0.1", + "type": "Number", + "label": "Linear cooling rate (per second)", + "group": "Overheat", + "advanced": true, + "name": "LinearCoolingRate" + }, + { + "value": "0.3", + "type": "Number", + "label": "Exponential cooling rate (per second)", + "description": "Happens faster when heat is high and slower when heat is low.", + "group": "Overheat", + "extraInformation": [ + "Linear", + "Exponential" + ], + "advanced": true, + "name": "ExponentialCoolingRate" + }, + { + "value": "", + "type": "String", + "label": "Layer the bullets are created on", + "description": "Base layer by default.", + "group": "Shooting configuration", + "hidden": true, + "name": "BulletLayer" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "RandomizedAngle" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Resource bar (separated units)", + "gdevelopVersion": ">=5.5.230", + "helpPath": "/objects/resource-bar", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWRvdHMtaG9yaXpvbnRhbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNiwxMkEyLDIgMCAwLDEgMTgsMTBBMiwyIDAgMCwxIDIwLDEyQTIsMiAwIDAsMSAxOCwxNEEyLDIgMCAwLDEgMTYsMTJNMTAsMTJBMiwyIDAgMCwxIDEyLDEwQTIsMiAwIDAsMSAxNCwxMkEyLDIgMCAwLDEgMTIsMTRBMiwyIDAgMCwxIDEwLDEyTTQsMTJBMiwyIDAgMCwxIDYsMTBBMiwyIDAgMCwxIDgsMTJBMiwyIDAgMCwxIDYsMTRBMiwyIDAgMCwxIDQsMTJaIiAvPjwvc3ZnPg==", + "name": "TiledUnitsBar", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/063e9152cf65bc0f3be2a828afd950c3ecf1b1fc72feefdc2467252fe987dc0f_dots-horizontal.svg", + "shortDescription": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "version": "2.0.0", + "description": [ + "A bar that represents a resource in the game (health, mana, ammo, etc).", + "", + "There are ready-to-use resource bars in the asset-store [resource bars pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=resource-bars-resource-bars)." + ], + "origin": { + "identifier": "TiledUnitsBar", + "name": "gdevelop-extension-store" + }, + "tags": [ + "resource", + "bar", + "health", + "mana", + "shield", + "hearts", + "lives", + "ammo" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "q8ubdigLvIRXLxsJDDTaokO41mc2" + ], + "changelog": [ + { + "version": "2.0.0", + "breaking": "- Resource bars now use \"variants\", allowing easy swapping of their visual aspect. You will have to make some adjustments to existing resource bars in your project. Follow this [migration documentation](https://wiki.gdevelop.io/gdevelop5/objects/custom-objects-prefab-template/migrate-to-variants/) to do these changes." + } + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "left anchor", + "fullName": "Left anchor", + "functionType": "ExpressionAndCondition", + "name": "LeftEdgeAnchor", + "private": true, + "sentence": "Left anchor of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs._TiledUnitsBarExtension = gdjs._TiledUnitsBarExtension || {", + " anchors: [\"None\", \"Min\", \"Max\", \"Proportional\", \"Center\"]", + "}", + "const { anchors } = gdjs._TiledUnitsBarExtension;", + "", + "const object = objects[0];", + "/** @type {gdjs.AnchorRuntimeBehavior} */", + "const anchor = object.getBehavior(eventsFunctionContext.getBehaviorName(\"Anchor\"));", + "eventsFunctionContext.returnValue = anchors[anchor._leftEdgeAnchor] || \"None\";", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "supplementaryInformation": "[\"None\",\"Min\",\"Max\",\"Proportional\",\"Center\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + }, + { + "description": "Anchor", + "name": "Anchor", + "supplementaryInformation": "AnchorBehavior::AnchorBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "left anchor", + "fullName": "Right anchor", + "functionType": "ExpressionAndCondition", + "name": "RightEdgeAnchor", + "private": true, + "sentence": "Right anchor of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs._TiledUnitsBarExtension = gdjs._TiledUnitsBarExtension || {", + " anchors: [\"None\", \"Min\", \"Max\", \"Proportional\", \"Center\"]", + "}", + "const { anchors } = gdjs._TiledUnitsBarExtension;", + "", + "const object = objects[0];", + "/** @type {gdjs.AnchorRuntimeBehavior} */", + "const anchor = object.getBehavior(eventsFunctionContext.getBehaviorName(\"Anchor\"));", + "eventsFunctionContext.returnValue = anchors[anchor._rightEdgeAnchor] || \"None\";", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "supplementaryInformation": "[\"None\",\"Min\",\"Max\",\"Proportional\",\"Center\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + }, + { + "description": "Anchor", + "name": "Anchor", + "supplementaryInformation": "AnchorBehavior::AnchorBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "fullName": "Resource bar", + "name": "ResourceBar", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This is done after the events to allow users to read the previous value at the end of the change." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"", + "<=", + "PreviousHighValueDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::UpdatePreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the value of the object.", + "fullName": "Value", + "functionType": "ExpressionAndCondition", + "name": "Value", + "sentence": "the value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Value", + "name": "SetValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "clamp(Value, 0, MaxValue)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Value", + "<", + "PreviousHighValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Value", + ">=", + "PreviousHighValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::UpdatePreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum value of the object.", + "fullName": "Maximum value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "MaxValue", + "sentence": "the maximum value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxValue", + "name": "SetMaxValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is empty.", + "fullName": "Empty", + "functionType": "Condition", + "name": "IsEmpty", + "sentence": "_PARAM0_ bar is empty", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is full.", + "fullName": "Full", + "functionType": "Condition", + "name": "IsFull", + "sentence": "_PARAM0_ bar is full", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "MaxValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the previous high value of the resource bar before the current change.", + "fullName": "Previous high value", + "functionType": "ExpressionAndCondition", + "name": "PreviousHighValue", + "sentence": "the previous high value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PreviousHighValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Force the previous resource value to update to the current one.", + "fullName": "Update previous value", + "functionType": "Action", + "name": "UpdatePreviousHighValue", + "sentence": "Update the previous resource value of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousHighValue", + "=", + "CurrentValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the previous high value conservation duration (in seconds) of the object.", + "fullName": "Previous high value conservation duration", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "PreviousHighValueDuration", + "sentence": "the previous high value conservation duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PreviousHighValueDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PreviousHighValueDuration", + "name": "SetPreviousHighValueDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousHighValueDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the resource value is changing.", + "fullName": "Value is changing", + "functionType": "Condition", + "name": "IsChanging", + "sentence": "_PARAM0_ value is changing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::PreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "CurrentValue", + "" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"", + "<=", + "PreviousHighValueDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Value", + "name": "CurrentValue" + }, + { + "value": "3", + "type": "Number", + "label": "Maximum value", + "name": "MaxValue" + }, + { + "value": "", + "type": "Number", + "label": "Previous high value", + "hidden": true, + "name": "PreviousHighValue" + }, + { + "value": "1", + "type": "Number", + "label": "Previous high value conservation duration (in seconds)", + "name": "PreviousHighValueDuration" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 96, + "areaMaxY": 32, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "ResourceBar", + "description": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "fullName": "Resource bar (separated units)", + "isInnerAreaFollowingParentSize": true, + "isUsingLegacyInstancesRenderer": false, + "name": "TiledUnitsBar", + "objects": [ + { + "assetStoreId": "", + "height": 32, + "name": "FillBar", + "texture": "", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 4, + "leftEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 4, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "ResourceBar", + "type": "TiledUnitsBar::ResourceBar", + "Value": 1, + "MaxValue": 3, + "PreviousValue": 0 + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Bar", + "texture": "", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 4, + "leftEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 4, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Background", + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "FillBar" + }, + { + "objectName": "Bar" + }, + { + "objectName": "Background" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 32, + "layer": "", + "name": "Background", + "persistentUuid": "b13e773c-6941-4f67-b198-030f29c8b679", + "width": 96, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "layer": "", + "name": "Bar", + "persistentUuid": "caf6fdad-096d-4247-b23b-6cc1a89ce9f8", + "width": 90, + "x": 3, + "y": 3, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "layer": "", + "name": "FillBar", + "persistentUuid": "4b784a8f-dbae-4d8b-a287-628642416d10", + "width": 60, + "x": 3, + "y": 3, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This allows to detect a change of \"intial value\" on hot reload." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousInitialValue", + "=", + "InitialValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass the configuration to the behavior (MaxValue must be set before Value)." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetMaxValue" + }, + "parameters": [ + "Object", + "=", + "MaxValue", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "InitialValue", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetUnitWidth" + }, + "parameters": [ + "Object", + "=", + "UnitWidth", + "Object.PropertyMaxValue()" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetMaxValue" + }, + "parameters": [ + "Object", + "=", + "MaxValue", + "Object.PropertyMaxValue()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "InitialValue", + "!=", + "PreviousInitialValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousInitialValue", + "=", + "InitialValue" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "InitialValue", + "Object.PropertyInitialValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the value of the object.", + "fullName": "Value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar", + "name": "Value", + "sentence": "the value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FillBar.ResourceBar::Value()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Value", + "name": "SetValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The value is clamped by the behavior. This is why Object.Value() is used instead of Value directly." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::SetValue" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=", + "Value", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::UpdateBarWidth" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum value of the object.", + "fullName": "Maximum value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "MaxValue", + "sentence": "the maximum value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FillBar.ResourceBar::MaxValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxValue", + "name": "SetMaxValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::SetMaxValue" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=", + "Value", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "Object.Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is empty.", + "fullName": "Empty", + "functionType": "Condition", + "group": "Resource bar", + "name": "IsEmpty", + "sentence": "_PARAM0_ bar is empty", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::IsEmpty" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is full.", + "fullName": "Full", + "functionType": "Condition", + "group": "Resource bar", + "name": "IsFull", + "sentence": "_PARAM0_ bar is full", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::IsFull" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the unit width of the object. How much pixels to show for a value of 1.", + "fullName": "Unit width", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "UnitWidth", + "private": true, + "sentence": "the unit width", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "UnitWidth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "UnitWidth", + "name": "SetUnitWidth", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UnitWidth", + "=", + "Value" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::UpdateBarWidth" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Update the bar width.", + "fullName": "Bar width", + "functionType": "Action", + "name": "UpdateBarWidth", + "private": true, + "sentence": "Update the bar width of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "NewWidth", + "=", + "Object.MaxValue() * UnitWidth" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Center\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Center\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Bar", + "-", + "(NewWidth - Bar.Width()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Bar", + "-", + "NewWidth - Bar.Width()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "Bar", + "Resizable", + "=", + "NewWidth" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "FillBar", + "Resizable", + "=", + "Object.Value() * UnitWidth" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "FillBar", + "=", + "Bar.X()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "FillBar", + "=", + "Bar.X() + Bar.Width() - FillBar.Width()" + ] + } + ] + } + ], + "variables": [ + { + "name": "NewWidth", + "type": "number", + "value": 0 + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "3", + "type": "Number", + "unit": "Dimensionless", + "label": "Maximum value", + "name": "MaxValue" + }, + { + "value": "3", + "type": "Number", + "unit": "Dimensionless", + "label": "Initial value", + "name": "InitialValue" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "It's used to detect a change at hot reload.", + "hidden": true, + "name": "PreviousInitialValue" + }, + { + "value": "24", + "type": "Number", + "unit": "Pixel", + "label": "Unit width", + "description": "How much pixels to show for a value of 1.", + "name": "UnitWidth" + } + ], + "variants": [ + { + "areaMaxX": 108, + "areaMaxY": 26, + "areaMaxZ": 1, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "name": "Life bar", + "objects": [ + { + "assetStoreId": "", + "height": 32, + "name": "FillBar", + "texture": "assets\\playerLife3_red.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "leftEdgeAnchor": 1, + "rightEdgeAnchor": 2, + "bottomEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "ResourceBar", + "type": "TiledUnitsBar::ResourceBar", + "Value": 1, + "MaxValue": 3, + "PreviousValue": 0 + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Bar", + "texture": "assets\\playerLife3_empty.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "leftEdgeAnchor": 1, + "rightEdgeAnchor": 2, + "bottomEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Background", + "rightMargin": 0, + "texture": "assets\\playerLife3_empty.png", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "FillBar" + }, + { + "objectName": "Bar" + }, + { + "objectName": "Background" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "keepRatio": true, + "layer": "", + "name": "Bar", + "persistentUuid": "caf6fdad-096d-4247-b23b-6cc1a89ce9f8", + "width": 107, + "x": 0, + "y": 0, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "layer": "", + "name": "FillBar", + "persistentUuid": "4b784a8f-dbae-4d8b-a287-628642416d10", + "width": 108, + "x": 0, + "y": 0, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ] + } + ] + } + ] + }, + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.8.3", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual", + "platformer", + "platform", + "top-down" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [ + { + "name": "Controllers", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "Buttons", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "State", + "type": "string", + "value": "Idle" + } + ] + } + ] + }, + { + "name": "Joystick", + "type": "structure", + "children": [] + } + ] + } + ] + } + ], + "eventsFunctions": [ + { + "fullName": "Accelerated speed", + "functionType": "Expression", + "name": "AcceleratedSpeed", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "CurrentSpeed" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "<", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "-", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "+", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(0, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(0, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "clamp(AcceleratedSpeed, -SpeedMax, SpeedMax)" + ] + } + ] + } + ], + "variables": [ + { + "name": "AcceleratedSpeed", + "type": "number", + "value": 0 + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Current speed", + "name": "CurrentSpeed", + "type": "expression" + }, + { + "description": "Targeted speed", + "name": "TargetedSpeed", + "type": "expression" + }, + { + "description": "Max speed", + "name": "SpeedMax", + "type": "expression" + }, + { + "description": "Acceleration", + "name": "Acceleration", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "ButtonState" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone", + "=", + "DeadZoneRadius" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "", + "name": "Coucou", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the force of multitouch contoller stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier)) / (1 - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Stick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "XFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "YFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a new touch has started on the right or left side of the screen.", + "fullName": "New touch on a screen side", + "functionType": "Condition", + "group": "Multitouch Joystick", + "name": "HasTouchStartedOnScreenSide", + "sentence": "A new touch has started on the _PARAM2_ side of the screen on _PARAM1_'s layer", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + "<", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + ">=", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch joystick", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "objectList" + }, + { + "description": "Screen side", + "name": "Side", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "DeadZoneRadius", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, JoystickForce - DeadZoneRadius) / (1 - DeadZoneRadius)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickForce", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickForce", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "", + "name": "Parameter", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "JoystickAngle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickAngle", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickAngle", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ControllerIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ControllerIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "JoystickIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "JoystickIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DeadZoneRadius" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DeadZoneRadius", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Force the joystick into the pressing state.", + "fullName": "Force start pressing", + "functionType": "Action", + "name": "ForceStartPressing", + "sentence": "Force start pressing _PARAM0_ with touch identifier: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Touch identifier", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "False", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer())", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer())" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Radius", + ">", + "DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer()), TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer()))" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "ControllerIdentifier", + "ButtonIdentifier", + "ButtonState", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "hidden": true, + "name": "IsReleased" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Triggering circle radius", + "description": "This circle adds up to the object collision mask.", + "name": "Radius" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D platformer multitouch controller mapper", + "name": "Platformer3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SetForwardAngle" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "=", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier) + CameraAngle(Object.Layer())" + ] + }, + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "-90", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Platformer3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D shooter multitouch controller mapper", + "name": "Shooter3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control camera rotations with a multitouch controller.", + "fullName": "First person camera multitouch controller mapper", + "name": "FirstPersonMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "TODO It's probably a bad idea to rotate the object around Y." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedZ", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedZ, SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, CameraStick) * HorizontalRotationSpeedMax, HorizontalRotationSpeedMax, HorizontalRotationAcceleration, HorizontalRotationDeceleration)" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "CurrentRotationSpeedZ * TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedY", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedY, SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, CameraStick) * VerticalRotationSpeedMax, VerticalRotationSpeedMax, VerticalRotationAcceleration, VerticalRotationDeceleration)" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "+", + "CurrentRotationSpeedY * TimeDelta()" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "=", + "clamp(Object.Object3D::RotationY(), VerticalAngleMin, VerticalAngleMax)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper::LookFromObjectEyes" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera to look though _PARAM1_ eyes. The object must look to the right when all its angles are 0 and the top of its head be toward Z+.", + "fullName": "Look through object eyes", + "functionType": "Action", + "group": "Layers and cameras", + "name": "LookFromObjectEyes", + "private": true, + "sentence": "Move the camera to look though _PARAM0_ eyes", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Object", + "", + "Object.Layer()", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraZ" + }, + "parameters": [ + "", + "=", + "Object.Object3D::Z() + Object.Object3D::Depth() + OffsetZ", + "", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationX" + }, + "parameters": [ + "", + "=", + "- Object.Object3D::RotationY() + 90", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationY" + }, + "parameters": [ + "", + "=", + "Object.Object3D::RotationX()", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "SetCameraAngle" + }, + "parameters": [ + "", + "=", + "Object.Angle() + 90", + "Object.Layer()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum horizontal rotation speed of the object.", + "fullName": "Maximum horizontal rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationSpeedMax", + "sentence": "the maximum horizontal rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationSpeedMax", + "name": "SetHorizontalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation acceleration of the object.", + "fullName": "Horizontal rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationAcceleration", + "sentence": "the horizontal rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationAcceleration", + "name": "SetHorizontalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation deceleration of the object.", + "fullName": "Horizontal rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationDeceleration", + "sentence": "the horizontal rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationDeceleration", + "name": "SetHorizontalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical rotation speed of the object.", + "fullName": "Maximum vertical rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationSpeedMax", + "sentence": "the maximum vertical rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationSpeedMax", + "name": "SetVerticalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation acceleration of the object.", + "fullName": "Vertical rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationAcceleration", + "sentence": "the vertical rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationAcceleration", + "name": "SetVerticalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation deceleration of the object.", + "fullName": "Vertical rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationDeceleration", + "sentence": "the vertical rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationDeceleration", + "name": "SetVerticalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the minimum vertical camera angle of the object.", + "fullName": "Minimum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMin", + "sentence": "the minimum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMin" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMin", + "name": "SetVerticalAngleMin", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMin", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical camera angle of the object.", + "fullName": "Maximum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMax", + "sentence": "the maximum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMax", + "name": "SetVerticalAngleMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the z position offset of the object.", + "fullName": "Z position offset", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper position configuration", + "name": "OffsetZ", + "sentence": "the z position offset", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "OffsetZ" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetZ", + "name": "SetOffsetZ", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OffsetZ", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D capability", + "extraInformation": [ + "Scene3D::Base3DBehavior" + ], + "name": "Object3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Camera joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "CameraStick" + }, + { + "value": "180", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Horizontal rotation", + "name": "HorizontalRotationSpeedMax" + }, + { + "value": "360", + "type": "Number", + "label": "Rotation acceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationAcceleration" + }, + { + "value": "720", + "type": "Number", + "label": "Rotation deceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationDeceleration" + }, + { + "value": "120", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Vertical rotation", + "name": "VerticalRotationSpeedMax" + }, + { + "value": "240", + "type": "Number", + "label": "Rotation acceleration", + "group": "Vertical rotation", + "name": "VerticalRotationAcceleration" + }, + { + "value": "480", + "type": "Number", + "label": "Rotation deceleration", + "group": "Vertical rotation", + "name": "VerticalRotationDeceleration" + }, + { + "value": "-90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Minimum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMin" + }, + { + "value": "90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Maximum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMax" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Z position offset", + "group": "Position", + "name": "OffsetZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Z", + "hidden": true, + "name": "CurrentRotationSpeedZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Y", + "hidden": true, + "name": "CurrentRotationSpeedY" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics car with a multitouch controller.", + "fullName": "3D car multitouch controller mapper", + "name": "PhysicsCar3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SteerJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateSteeringStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, \"Primary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SpeedJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateAcceleratorStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "-SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, \"Secondary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "HandBrakeButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateHandBrakeKey" + }, + "parameters": [ + "Object", + "PhysicsCar3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PhysicsCar3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics car", + "extraInformation": [ + "Physics3D::PhysicsCar3D" + ], + "name": "PhysicsCar3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Steer joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SteerJoystickIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Speed joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SpeedJoystickIdentifier" + }, + { + "value": "B", + "type": "String", + "label": "Hand brake button name", + "group": "Controls", + "name": "HandBrakeButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "sign(SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsPressed" + }, + "parameters": [ + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "no", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "False", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "ControllerIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "DeadZoneRadius", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Show the joystick until it is released.", + "fullName": "Show and start pressing", + "functionType": "Action", + "name": "TeleportAndPress", + "sentence": "Show _PARAM0_ at the cursor position and start pressing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "Object.ParentTouchX(StartedTouchOrMouseId(0))", + "=", + "Object.ParentTouchY(StartedTouchOrMouseId(0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "yes", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::ForceStartPressing" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "StartedTouchOrMouseId(0)", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchX(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchY(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick is pressed.", + "fullName": "Stick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Stick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the strick force (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "ExpressionAndCondition", + "name": "StickForceX", + "sentence": "the stick X force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "ExpressionAndCondition", + "name": "StickForceY", + "sentence": "the stick Y force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (from -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the stick is pointing towards (from -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ParentOrigin" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ShouldBeHiddenWhenReleased" + } + ], + "variants": [] + } + ] + }, + { + "author": "Tristan Rhodes (tristan@victrisgames.com), Entropy", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Screen wrap", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vbml0b3Itc2NyZWVuc2hvdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik05LDZINVYxMEg3VjhIOU0xOSwxMEgxN1YxMkgxNVYxNEgxOU0yMSwxNkgzVjRIMjFNMjEsMkgzQzEuODksMiAxLDIuODkgMSw0VjE2QTIsMiAwIDAsMCAzLDE4SDEwVjIwSDhWMjJIMTZWMjBIMTRWMThIMjFBMiwyIDAgMCwwIDIzLDE2VjRDMjMsMi44OSAyMi4xLDIgMjEsMiIgLz48L3N2Zz4=", + "name": "ScreenWrap", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/monitor-screenshot.svg", + "shortDescription": "Teleport object when it moves off the screen and immediately appear on the opposite side while maintaining speed and trajectory.", + "version": "0.3.2", + "description": [ + "The teleport happens when the center point of the object crosses a border (this can be adjusted with an offset).", + "By default, the borders of the wrapping area match the screen size, but they can also be changed.", + "", + "The Asteroid-like example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://space-asteroids))." + ], + "origin": { + "identifier": "ScreenWrap", + "name": "gdevelop-extension-store" + }, + "tags": [ + "screen", + "wrap", + "teleport", + "asteroids" + ], + "authorIds": [ + "q8ubdigLvIRXLxsJDDTaokO41mc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", + "fullName": "Screen Wrap", + "name": "ScreenWrap", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize variables (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "BorderBottom", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetBottomBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowHeight()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "BorderRight", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetRightBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowWidth()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 5, + "colorG": 117, + "colorR": 65, + "creationTime": 0, + "name": "ScreenWrap", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object to opposite side (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "BorderLeft - (Object.Width()/2) - TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "BorderRight - (Object.Width()/2) + TriggerOffset" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "BorderRight - (Object.Width()/2) + TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "BorderLeft - (Object.Width()/2) - TriggerOffset" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "BorderTop - (Object.Height()/2) - TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "BorderBottom - (Object.Height()/2) + TriggerOffset" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "BorderBottom - (Object.Height()/2) + TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "BorderTop - (Object.Height()/2) - TriggerOffset" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the left and right borders.", + "fullName": "Is horizontal wrapping", + "functionType": "Condition", + "name": "IsHorizontalWrapping", + "sentence": "_PARAM0_ is horizontal wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the top and bottom borders.", + "fullName": "Is vertical wrapping", + "functionType": "Condition", + "name": "IsVerticalWrapping", + "sentence": "_PARAM0_ is vertical wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the left and right borders.", + "fullName": "Enable horizontal wrapping", + "functionType": "Action", + "name": "EnableHorizontalWrapping", + "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableHorizontalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the top and bottom borders.", + "fullName": "Enable vertical wrapping", + "functionType": "Action", + "name": "EnableVerticalWrapping", + "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "EnableVerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableVerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableVerticalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Top border (Y position).", + "fullName": "Top border", + "functionType": "Expression", + "name": "BorderTop", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderTop" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Left border (X position).", + "fullName": "Left border", + "functionType": "Expression", + "name": "BorderLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderLeft" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Right border (X position).", + "fullName": "Right border", + "functionType": "Expression", + "name": "BorderRight", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderRight" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Bottom border (Y position).", + "fullName": "Bottom border", + "functionType": "Expression", + "name": "BorderBottom", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderBottom" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Number of pixels past the center where the object teleports and appears.", + "fullName": "Trigger offset", + "functionType": "Expression", + "name": "TriggerOffset", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TriggerOffset" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set top border (Y position).", + "fullName": "Set top border", + "functionType": "Action", + "name": "SetTopBorder", + "sentence": "Set _PARAM0_ top border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderTop", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Top border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set left border (X position).", + "fullName": "Set left border", + "functionType": "Action", + "name": "SetLeftBorder", + "sentence": "Set _PARAM0_ left border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderLeft", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Left border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set bottom border (Y position).", + "fullName": "Set bottom border", + "functionType": "Action", + "name": "SetBottomBorder", + "sentence": "Set _PARAM0_ bottom border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderBottom", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Bottom border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set right border (X position).", + "fullName": "Set right border", + "functionType": "Action", + "name": "SetRightBorder", + "sentence": "Set _PARAM0_ right border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderRight", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Right border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set trigger offset (pixels).", + "fullName": "Set trigger offset", + "functionType": "Action", + "name": "SetTriggerOffset", + "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TriggerOffset", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "SetScreen Offset Leaving Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Horizontal wrapping", + "name": "HorizontalWrapping" + }, + { + "value": "true", + "type": "Boolean", + "label": "Vertical wrapping", + "name": "VerticalWrapping" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Top border of wrapped area (Y)", + "name": "BorderTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Left border of wrapped area (X)", + "name": "BorderLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Right border of wrapped area (X)", + "description": "If blank, the value will be the scene width.", + "name": "BorderRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Bottom border of wrapped area (Y)", + "description": "If blank, the value will be scene height.", + "name": "BorderBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Number of pixels past the center where the object teleports and appears", + "name": "TriggerOffset" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", + "fullName": "Screen Wrap (physics objects)", + "name": "ScreenWrapPhysics", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize variables (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "BorderBottom", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetBottomBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowHeight()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "BorderRight", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SetRightBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowWidth()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 5, + "colorG": 117, + "colorR": 65, + "creationTime": 0, + "name": "ScreenWrap", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object to opposite side (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::IsHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Velocity is saved because Physics2 resets objects velocities when they are moved from the outside of the extension." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "BorderLeft - (Object.Width()/2) - TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "BorderRight - (Object.Width()/2) + TriggerOffset" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "BorderRight - (Object.Width()/2) + TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "BorderLeft - (Object.Width()/2) - TriggerOffset" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::IsVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "BorderTop - (Object.Height()/2) - TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "BorderBottom - (Object.Height()/2) + TriggerOffset" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "BorderBottom - (Object.Height()/2) + TriggerOffset" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::SaveCurrentVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "BorderTop - (Object.Height()/2) - TriggerOffset" + ] + }, + { + "type": { + "value": "ScreenWrap::ScreenWrapPhysics::ApplySavedVelocities" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the left and right borders.", + "fullName": "Is horizontal wrapping", + "functionType": "Condition", + "name": "IsHorizontalWrapping", + "sentence": "_PARAM0_ is horizontal wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the top and bottom borders.", + "fullName": "Is vertical wrapping", + "functionType": "Condition", + "name": "IsVerticalWrapping", + "sentence": "_PARAM0_ is vertical wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the left and right borders.", + "fullName": "Enable horizontal wrapping", + "functionType": "Action", + "name": "EnableHorizontalWrapping", + "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HorizontalWrapping", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableHorizontalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the top and bottom borders.", + "fullName": "Enable vertical wrapping", + "functionType": "Action", + "name": "EnableVerticalWrapping", + "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "EnableVerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableVerticalWrapping", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "VerticalWrapping", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableVerticalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Top border (Y position).", + "fullName": "Top border", + "functionType": "Expression", + "name": "BorderTop", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderTop" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Left border (X position).", + "fullName": "Left border", + "functionType": "Expression", + "name": "BorderLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderLeft" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Right border (X position).", + "fullName": "Right border", + "functionType": "Expression", + "name": "BorderRight", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderRight" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Bottom border (Y position).", + "fullName": "Bottom border", + "functionType": "Expression", + "name": "BorderBottom", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "BorderBottom" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Number of pixels past the center where the object teleports and appears.", + "fullName": "Trigger offset", + "functionType": "Expression", + "name": "TriggerOffset", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TriggerOffset" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set top border (Y position).", + "fullName": "Set top border", + "functionType": "Action", + "name": "SetTopBorder", + "sentence": "Set _PARAM0_ top border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderTop", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Top border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set left border (X position).", + "fullName": "Set left border", + "functionType": "Action", + "name": "SetLeftBorder", + "sentence": "Set _PARAM0_ left border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderLeft", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Left border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set bottom border (Y position).", + "fullName": "Set bottom border", + "functionType": "Action", + "name": "SetBottomBorder", + "sentence": "Set _PARAM0_ bottom border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderBottom", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Bottom border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set right border (X position).", + "fullName": "Set right border", + "functionType": "Action", + "name": "SetRightBorder", + "sentence": "Set _PARAM0_ right border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "BorderRight", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "Right border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set trigger offset (pixels).", + "fullName": "Set trigger offset", + "functionType": "Action", + "name": "SetTriggerOffset", + "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TriggerOffset", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + }, + { + "description": "SetScreen Offset Leaving Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Save current velocity values.", + "fullName": "Save current velocity values", + "functionType": "Action", + "name": "SaveCurrentVelocities", + "sentence": "Save current velocity values of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AngularVelocity", + "=", + "Object.RequiredPhysicsBehavior::AngularVelocity()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LinearVelocityX", + "=", + "Object.RequiredPhysicsBehavior::LinearVelocityX()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "LinearVelocityY", + "=", + "Object.RequiredPhysicsBehavior::LinearVelocityY()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply saved velocity values.", + "fullName": "Apply saved velocity values", + "functionType": "Action", + "name": "ApplySavedVelocities", + "sentence": "Apply saved velocity values of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Physics2::AngularVelocity" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "AngularVelocity" + ] + }, + { + "type": { + "value": "Physics2::LinearVelocityX" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "LinearVelocityX" + ] + }, + { + "type": { + "value": "Physics2::LinearVelocityY" + }, + "parameters": [ + "Object", + "RequiredPhysicsBehavior", + "=", + "LinearVelocityY" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrapPhysics", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Physics Behavior", + "extraInformation": [ + "Physics2::Physics2Behavior" + ], + "name": "RequiredPhysicsBehavior" + }, + { + "value": "true", + "type": "Boolean", + "label": "Horizontal wrapping", + "name": "HorizontalWrapping" + }, + { + "value": "true", + "type": "Boolean", + "label": "Vertical wrapping", + "name": "VerticalWrapping" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Top border of wrapped area (Y)", + "name": "BorderTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Left border of wrapped area (X)", + "name": "BorderLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Right border of wrapped area (X)", + "description": "If blank, the value will be the scene width.", + "name": "BorderRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Bottom border of wrapped area (Y)", + "description": "If blank, the value will be scene height.", + "name": "BorderBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Number of pixels past the center where the object teleports and appears", + "name": "TriggerOffset" + }, + { + "value": "0", + "type": "Number", + "label": "Angular Velocity", + "hidden": true, + "name": "AngularVelocity" + }, + { + "value": "0", + "type": "Number", + "label": "Linear Velocity X", + "hidden": true, + "name": "LinearVelocityX" + }, + { + "value": "0", + "type": "Number", + "label": "Linear Velocity Y", + "hidden": true, + "name": "LinearVelocityY" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "westboy31, Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Camera shake", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXZlY3Rvci1kaWZmZXJlbmNlLWFiIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTMsMUMxLjg5LDEgMSwxLjg5IDEsM1Y1SDNWM0g1VjFIM003LDFWM0gxMFYxSDdNMTIsMVYzSDE0VjVIMTZWM0MxNiwxLjg5IDE1LjExLDEgMTQsMUgxMk0xLDdWMTBIM1Y3SDFNMTQsN0MxNCw3IDE0LDExLjY3IDE0LDE0QzExLjY3LDE0IDcsMTQgNywxNEM3LDE0IDcsMTggNywyMEM3LDIxLjExIDcuODksMjIgOSwyMkgyMEMyMS4xMSwyMiAyMiwyMS4xMSAyMiwyMFY5QzIyLDcuODkgMjEuMTEsNyAyMCw3QzE4LDcgMTQsNyAxNCw3TTE2LDlIMjBWMjBIOVYxNkgxNEMxNS4xMSwxNiAxNiwxNS4xMSAxNiwxNFY5TTEsMTJWMTRDMSwxNS4xMSAxLjg5LDE2IDMsMTZINVYxNEgzVjEySDFaIiAvPjwvc3ZnPg==", + "name": "CameraShake", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/vector-difference-ab.svg", + "shortDescription": "Shake layer cameras.", + "version": "3.2.0", + "description": [ + "Shake layer cameras with translation, rotation and zoom.", + "", + "- Short shaking can be used to give impact (explosion, hit)", + "- Shaking can go indefinitely to set an ambiance (engine vibration, earthquake, pulsing)", + "- Low frequency shaking allows to simulate slow moving objects (ship rocking back and forth)", + "", + "Release notes:", + "- Version 3.0.0", + " - No adaptation of the game events is needed.", + " - It fixes an issue when used with scrolling, the amplitude will feel bigger in this case.", + " - The shaking relies on noise which could feel a bit different.", + " - This extension can no longer do impulses. For this, another extension \"Camera impulse\" can be used." + ], + "origin": { + "identifier": "CameraShake", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "camera", + "effect", + "screen", + "shake" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "m4hBMBTUilft4s1V4FQQPakVDGx1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [ + { + "folded": true, + "name": "DefaultFrequency", + "type": "number", + "value": 12 + }, + { + "folded": true, + "name": "DefaultAmplitudeX", + "type": "number", + "value": 4 + }, + { + "folded": true, + "name": "DefaultAmplitudeY", + "type": "number", + "value": 4 + }, + { + "folded": true, + "name": "DefaultAmplitudeAngle", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "DefaultAmplitudeZoom", + "type": "number", + "value": 1 + }, + { + "folded": true, + "name": "Duration", + "type": "number", + "value": 0 + }, + { + "name": "Layers", + "type": "structure", + "children": [] + }, + { + "name": "Layer", + "type": "structure", + "children": [ + { + "name": "AmplitudeAngle", + "type": "number", + "value": 0 + }, + { + "name": "AmplitudeX", + "type": "number", + "value": 0 + }, + { + "name": "AmplitudeY", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "AmplitudeZoom", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "CameraDeltaAngle", + "type": "number", + "value": 0 + }, + { + "name": "CameraDeltaX", + "type": "number", + "value": 0 + }, + { + "name": "CameraDeltaY", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "CameraDeltaZoom", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "Frequency", + "type": "number", + "value": 0 + } + ] + }, + { + "folded": true, + "name": "LayerName", + "type": "string", + "value": "" + }, + { + "folded": true, + "name": "Time", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "StartEaseDuration", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "StopEaseDuration", + "type": "number", + "value": 0 + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onSceneLoaded", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "CameraShake::SetLayerShakable" + }, + "parameters": [ + "", + "", + "\"\"", + "" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Step time counters." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Time", + "+", + "TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraShake::IsShaking" + }, + "parameters": [ + "", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Time", + "<", + "StartEaseDuration" + ] + }, + { + "type": { + "inverted": true, + "value": "NumberVariable" + }, + "parameters": [ + "Time", + ">", + "Duration - StopEaseDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EaseFactor", + "=", + "clamp(Time / StartEaseDuration, 0, 1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Time", + ">", + "Duration - StopEaseDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EaseFactor", + "=", + "clamp((Duration - Time) / StopEaseDuration, 0, 1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::ForEachChildVariable", + "iterableVariableName": "Layers", + "valueIteratorVariableName": "Layer", + "keyIteratorVariableName": "LayerName", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Layer.Shakable", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "ActualLayerName", + "=", + "LayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "ActualLayerName", + "=", + "\"\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use user defined default values when there is no layer specific value set." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "CameraShake::SetFrequency" + }, + "parameters": [ + "", + "DefaultFrequency", + "\"\"", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeX", + "=", + "DefaultAmplitudeX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeY", + "=", + "DefaultAmplitudeY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeAngle", + "=", + "DefaultAmplitudeAngle" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeZoom", + "=", + "DefaultAmplitudeZoom" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaX", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaY", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaAngle", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaZoom", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VariableChildExists2" + }, + "parameters": [ + "Layer", + "\"Frequency\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "CameraShake::SetFrequency" + }, + "parameters": [ + "", + "Layer.Frequency", + "\"\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VariableChildExists2" + }, + "parameters": [ + "Layer", + "\"AmplitudeX\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeX", + "=", + "Layer.AmplitudeX" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VariableChildExists2" + }, + "parameters": [ + "Layer", + "\"AmplitudeY\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeY", + "=", + "Layer.AmplitudeY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VariableChildExists2" + }, + "parameters": [ + "Layer", + "\"AmplitudeAngle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeAngle", + "=", + "Layer.AmplitudeAngle" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VariableChildExists2" + }, + "parameters": [ + "Layer", + "\"AmplitudeZoom\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AmplitudeZoom", + "=", + "Layer.AmplitudeZoom" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shake the layer camera.\nSave the camera displacement to revert it in onScenePostEvents." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "AmplitudeX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaX", + "=", + "CameraShake::Noise2d(\"\", TimeFromStart(), 1000) * AmplitudeX * EaseFactor" + ] + }, + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "+", + "Layers[LayerName].CameraDeltaX", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "AmplitudeY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaY", + "=", + "CameraShake::Noise2d(\"\", TimeFromStart(), 2000) * AmplitudeY * EaseFactor" + ] + }, + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "+", + "Layers[LayerName].CameraDeltaY", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "AmplitudeAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaAngle", + "=", + "CameraShake::Noise2d(\"\", TimeFromStart(), 3000) * AmplitudeAngle * EaseFactor" + ] + }, + { + "type": { + "value": "SetCameraAngle" + }, + "parameters": [ + "", + "+", + "Layers[LayerName].CameraDeltaAngle", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "AmplitudeZoom", + "!=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].CameraDeltaZoom", + "=", + "pow(AmplitudeZoom, CameraShake::Noise2d(\"\", TimeFromStart(), 4000) * EaseFactor)" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "CameraZoom(ActualLayerName, 0) * Layers[LayerName].CameraDeltaZoom", + "ActualLayerName", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "variables": [ + { + "folded": true, + "name": "AmplitudeX", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "AmplitudeY", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "AmplitudeAngle", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "AmplitudeZoom", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "EaseFactor", + "type": "number", + "value": 1 + }, + { + "folded": true, + "name": "ActualLayerName", + "type": "string", + "value": "" + } + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onScenePreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Revert the shaking." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraShake::IsShaking" + }, + "parameters": [ + "", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::ForEachChildVariable", + "iterableVariableName": "Layers", + "valueIteratorVariableName": "Layer", + "keyIteratorVariableName": "LayerName", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Layer.Shakable", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDeltaX", + "=", + "Layer.CameraDeltaX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDeltaY", + "=", + "Layer.CameraDeltaY" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDeltaAngle", + "=", + "Layer.CameraDeltaAngle" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CameraDeltaZoom", + "=", + "Layer.CameraDeltaZoom" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "ActualLayerName", + "=", + "LayerName" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "ActualLayerName", + "=", + "\"\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraDeltaX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterX" + }, + "parameters": [ + "", + "-", + "CameraDeltaX", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraDeltaY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraCenterY" + }, + "parameters": [ + "", + "-", + "CameraDeltaY", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraDeltaAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraAngle" + }, + "parameters": [ + "", + "-", + "CameraDeltaAngle", + "ActualLayerName", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CameraDeltaZoom", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "CameraZoom(ActualLayerName) / CameraDeltaZoom", + "ActualLayerName", + "0" + ] + } + ] + } + ] + } + ], + "variables": [ + { + "folded": true, + "name": "ActualLayerName", + "type": "string", + "value": "" + }, + { + "folded": true, + "name": "CameraDeltaX", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "CameraDeltaY", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "CameraDeltaAngle", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "CameraDeltaZoom", + "type": "number", + "value": 0 + } + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Shake the camera on layers chosen with configuration actions.", + "fullName": "Shake camera", + "functionType": "Action", + "name": "ShakeCamera", + "sentence": "Shake camera for _PARAM1_ seconds with _PARAM2_ seconds of easing to start and _PARAM3_ seconds to stop", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Time", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "NewDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StartEaseDuration", + "=", + "NewStartEaseDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StopEaseDuration", + "=", + "NewStopEaseDuration" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Duration", + "<", + "StartEaseDuration + StopEaseDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StartEaseDuration", + "=", + "StartEaseDuration * Duration / (StartEaseDuration + StopEaseDuration)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StopEaseDuration", + "=", + "StopEaseDuration * Duration / (StartEaseDuration + StopEaseDuration)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Duration (in seconds)", + "name": "NewDuration", + "type": "expression" + }, + { + "description": "Ease duration to start (in seconds)", + "name": "NewStartEaseDuration", + "type": "expression" + }, + { + "description": "Ease duration to stop (in seconds)", + "name": "NewStopEaseDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Shake the camera on the specified layer, using one or more ways to shake (position, angle, zoom). This action is deprecated. Please use the other one with the same name.", + "fullName": "Shake camera (deprecated)", + "functionType": "Action", + "name": "CameraShake", + "private": true, + "sentence": "Shake camera on _PARAM3_ layer for _PARAM5_ seconds. Use an amplitude of _PARAM1_px on X axis and _PARAM2_px on Y axis, angle rotation amplitude _PARAM6_ degrees, and zoom amplitude _PARAM7_ percent. Wait _PARAM8_ seconds between shakes. Keep shaking until stopped: _PARAM9_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Camera Shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ClearVariableChildren" + }, + "parameters": [ + "Layers" + ] + }, + { + "type": { + "value": "CameraShake::SetLayerShakable" + }, + "parameters": [ + "", + "", + "NewLayer", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Time", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "Layer", + "=", + "NewLayer" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "NewDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StartEaseDuration", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StopEaseDuration", + "=", + "NewDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeX", + "=", + "abs(AmplitudeX)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeY", + "=", + "abs(AmplitudeY)" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeAngle", + "=", + "AmplitudeAngle" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeZoom", + "=", + "1 + AmplitudeZoom / 100" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "ShakePeriod", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultFrequency", + "=", + "1 / ShakePeriod" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "ShakePeriod", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultFrequency", + "=", + "1 / 0.08" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShakeForever", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "1234567890" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "NewDuration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "0.5" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Amplitude of shaking on the X axis (in pixels)", + "name": "AmplitudeX", + "type": "expression" + }, + { + "description": "Amplitude of shaking on the Y axis (in pixels)", + "name": "AmplitudeY", + "type": "expression" + }, + { + "description": "Layer (base layer if empty)", + "name": "NewLayer", + "type": "layer" + }, + { + "description": "Camera index (Default: 0)", + "name": "Camera", + "type": "expression" + }, + { + "description": "Duration (in seconds) (Default: 0.5)", + "name": "NewDuration", + "type": "expression" + }, + { + "description": "Angle rotation amplitude (in degrees) (For example: 2)", + "name": "AmplitudeAngle", + "type": "expression" + }, + { + "description": "Zoom factor amplitude", + "name": "AmplitudeZoom", + "type": "expression" + }, + { + "description": "Period between shakes (in seconds) (Default: 0.08)", + "name": "ShakePeriod", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Start shaking the camera indefinitely.", + "fullName": "Start camera shaking", + "functionType": "Action", + "name": "StartShaking", + "sentence": "Start shaking the camera with _PARAM1_ seconds of easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Time", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "1234567890" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StartEaseDuration", + "=", + "EaseDuration" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Ease duration (in seconds)", + "name": "EaseDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking the camera.", + "fullName": "Stop camera shaking", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking the camera with _PARAM1_ seconds of easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Time", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Duration", + "=", + "EaseDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StopEaseDuration", + "=", + "EaseDuration" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Ease duration (in seconds)", + "name": "EaseDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Mark a layer as shakable.", + "fullName": "Shakable layer", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetLayerShakable", + "sentence": "Mark the layer: _PARAM2_ as shakable: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "NewLayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "NewLayerName", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Shakable", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Layers[LayerName].Shakable", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Shakable", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Layers[LayerName].Shakable", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "defaultValue": "yes", + "description": "Shakable", + "name": "Shakable", + "optional": true, + "type": "yesorno" + }, + { + "description": "Layer", + "name": "NewLayerName", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera is shaking.", + "fullName": "Camera is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "Camera is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Time", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Change the translation amplitude of the shaking (in pixels).", + "fullName": "Layer translation amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetLayerTranslationAmplitude", + "sentence": "Change the translation amplitude of the shaking to _PARAM1_; _PARAM2_ (layer: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "NewLayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "NewLayerName", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].AmplitudeX", + "=", + "AmplitudeX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].AmplitudeY", + "=", + "AmplitudeY" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Amplitude of shaking on the X axis (in pixels)", + "name": "AmplitudeX", + "type": "expression" + }, + { + "description": "Amplitude of shaking on the Y axis (in pixels)", + "name": "AmplitudeY", + "type": "expression" + }, + { + "description": "Layer", + "name": "NewLayerName", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Change the rotation amplitude of the shaking (in degrees).", + "fullName": "Layer rotation amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetLayerRotationAmplitude", + "sentence": "Change the rotation amplitude of the shaking to _PARAM1_ degrees (layer: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "NewLayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "NewLayerName", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].AmplitudeAngle", + "=", + "AmplitudeAngle" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle (in degree)", + "name": "AmplitudeAngle", + "type": "expression" + }, + { + "description": "NewLayerName", + "name": "NewLayerName", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Change the zoom factor amplitude of the shaking. The shaking will zoom and unzoom by this factor (for instance 1.0625 is a valid value).", + "fullName": "Layer zoom amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetLayerZoomAmplitude", + "sentence": "Change the zoom factor amplitude of the shaking to _PARAM1_ (layer: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "NewLayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "NewLayerName", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].AmplitudeZoom", + "=", + "AmplitudeZoom" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Zoom factor", + "name": "AmplitudeZoom", + "type": "expression" + }, + { + "description": "NewLayerName", + "name": "NewLayerName", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of back and forth per seconds.", + "fullName": "Layer shaking frequency", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetLayerShakingFrequency", + "sentence": "Change the shaking frequency to _PARAM1_ (layer: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "NewLayerName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "NewLayerName", + "=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "LayerName", + "=", + "\"__BaseLayer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Layers[LayerName].Frequency", + "=", + "Frequency" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Frequency", + "name": "Frequency", + "type": "expression" + }, + { + "description": "NewLayerName", + "name": "NewLayerName", + "type": "layer" + } + ], + "objectGroups": [] + }, + { + "description": "Change the default translation amplitude of the shaking (in pixels).", + "fullName": "Default translation amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetDefaultTranslationAmplitude", + "sentence": "Change the default translation amplitude of the shaking to _PARAM1_; _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeX", + "=", + "AmplitudeX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeY", + "=", + "AmplitudeY" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Amplitude of shaking on the X axis (in pixels)", + "name": "AmplitudeX", + "type": "expression" + }, + { + "description": "Amplitude of shaking on the Y axis (in pixels)", + "name": "AmplitudeY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the default rotation amplitude of the shaking (in degrees).", + "fullName": "Default rotation amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetDefaultRotationAmplitude", + "sentence": "Change the default rotation amplitude of the shaking to _PARAM1_ degrees", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeAngle", + "=", + "AmplitudeAngle" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle (in degree)", + "name": "AmplitudeAngle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the default zoom factor amplitude of the shaking. The shaking will zoom and unzoom by this factor (for instance 1.0625 is a valid value).", + "fullName": "Default zoom amplitude", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetDefaultZoomAmplitude", + "sentence": "Change the default zoom factor amplitude of the shaking to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultAmplitudeZoom", + "=", + "AmplitudeZoom" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Zoom factor", + "name": "AmplitudeZoom", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the default number of back and forth per seconds.", + "fullName": "Default shaking frequency", + "functionType": "Action", + "group": "Camera shake configuration", + "name": "SetDefaultShakingFrequency", + "sentence": "Change the default shaking frequency to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DefaultFrequency", + "=", + "Frequency" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Frequency", + "name": "Frequency", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onFirstSceneLoaded", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "if (gdjs._cameraShakeExtension) {", + " return;", + "}", + "", + "/** Noise generator manager. */", + "class NoiseManager {", + " /**", + " * Create the manager of noise generators.", + " */", + " constructor() {", + " this.seed = gdjs.randomInRange(1, Number.MAX_SAFE_INTEGER);", + " /** @type {Map} */", + " this.generators = new Map();", + " }", + "", + " /**", + " * @param name {string}", + " * @return {NoiseGenerator}", + " */", + " getGenerator(name) {", + " let generator = this.generators.get(name);", + " if (!generator) {", + " generator = new NoiseGenerator(name + this.seed);", + " this.generators.set(name, generator);", + " }", + " return generator;", + " }", + "", + " /**", + " * @param seed {number}", + " */", + " setSeed(seed) {", + " this.seed = seed;", + " this.generators.forEach(generator => generator.setSeed(name + this.seed));", + " }", + "", + " /**", + " * @param name {string}", + " */", + " deleteGenerator(name) {", + " this.generators.delete(name);", + " }", + "", + " /**", + " */", + " deleteAllGenerators() {", + " this.generators.clear();", + " }", + "}", + "", + "/** Noise generator with octaves. */", + "class NoiseGenerator {", + " /**", + " * Create a noise generator with a seed.", + " * @param seed {string}", + " */", + " constructor(seed) {", + " this.simplexNoise = new SimplexNoise(seed);", + " this.frequency = 1;", + " this.octaves = 1;", + " this.persistence = 0.5;", + " this.lacunarity = 2;", + " this.xLoopPeriod = 0;", + " this.yLoopPeriod = 0;", + " }", + "", + " /**", + " * @param seed {string}", + " */", + " setSeed(seed) {", + " this.simplexNoise = new SimplexNoise(seed);", + " }", + "", + " /**", + " * @param x {float}", + " * @param y {float}", + " * @param z {float} optionnal", + " * @param w {float} optionnal", + " * @return {float}", + " */", + " noise(x, y, z, w) {", + " if (this.xLoopPeriod && this.yLoopPeriod) {", + " const circleRatioX = 2 * Math.PI / this.xLoopPeriod;", + " const circleRatioY = 2 * Math.PI / this.yLoopPeriod;", + " const angleX = circleRatioX * x;", + " const angleY = circleRatioY * y;", + " x = Math.cos(angleX) / circleRatioX;", + " y = Math.sin(angleX) / circleRatioX;", + " z = Math.cos(angleY) / circleRatioY;", + " w = Math.sin(angleY) / circleRatioY;", + " }", + " else if (this.xLoopPeriod) {", + " const circleRatio = 2 * Math.PI / this.xLoopPeriod;", + " const angleX = circleRatio * x;", + " w = z;", + " z = y;", + " x = Math.cos(angleX) / circleRatio;", + " y = Math.sin(angleX) / circleRatio;", + " }", + " else if (this.yLoopPeriod) {", + " const circleRatio = 2 * Math.PI / this.xLoopPeriod;", + " const angleX = circleRatio * x;", + " w = z;", + " // Make the circle perimeter equals to the looping period", + " // to keep the same perceived frequency with or without looping.", + " y = Math.cos(angleX) / circleRatio;", + " z = Math.sin(angleX) / circleRatio;", + " }", + " let noiseFunction = this.simplexNoise.noise4D.bind(this.simplexNoise);", + " if (z === undefined) {", + " noiseFunction = this.simplexNoise.noise2D.bind(this.simplexNoise);", + " }", + " else if (w === undefined) {", + " noiseFunction = this.simplexNoise.noise3D.bind(this.simplexNoise);", + " }", + " let frequency = this.frequency;", + " let noiseSum = 0;", + " let amplitudeSum = 0;", + " let amplitude = 1;", + " for (let i = 0; i < this.octaves; i++) {", + " noiseSum += noiseFunction(x * frequency, y * frequency, z * frequency, w * frequency) * amplitude;", + " amplitudeSum += Math.abs(amplitude);", + " amplitude *= this.persistence;", + " frequency *= this.lacunarity;", + " }", + " return noiseSum / amplitudeSum;", + " }", + "}", + "", + "/*", + "A fast javascript implementation of simplex noise by Jonas Wagner", + "https://github.com/jwagner/simplex-noise.js", + "", + "Based on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.", + "Which is based on example code by Stefan Gustavson (stegu@itn.liu.se).", + "With Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).", + "Better rank ordering method by Stefan Gustavson in 2012.", + "", + " Copyright (c) 2021 Jonas Wagner", + "", + " 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.", + " */", + "", + "const F2 = 0.5 * (Math.sqrt(3.0) - 1.0);", + "const G2 = (3.0 - Math.sqrt(3.0)) / 6.0;", + "const F3 = 1.0 / 3.0;", + "const G3 = 1.0 / 6.0;", + "const F4 = (Math.sqrt(5.0) - 1.0) / 4.0;", + "const G4 = (5.0 - Math.sqrt(5.0)) / 20.0;", + "const grad3 = new Float32Array([1, 1, 0,", + " -1, 1, 0,", + " 1, -1, 0,", + " -1, -1, 0,", + " 1, 0, 1,", + " -1, 0, 1,", + " 1, 0, -1,", + " -1, 0, -1,", + " 0, 1, 1,", + " 0, -1, 1,", + " 0, 1, -1,", + " 0, -1, -1]);", + "const grad4 = new Float32Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,", + " 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,", + " 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,", + " -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,", + " 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,", + " -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,", + " 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0,", + " -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]);", + "", + "", + "/**", + " * Builds a random permutation table.", + " * This is exported only for (internal) testing purposes.", + " * Do not rely on this export.", + " * @param {() => number} random", + " * @private", + " */", + "function buildPermutationTable(random) {", + " const p = new Uint8Array(256);", + " for (let i = 0; i < 256; i++) {", + " p[i] = i;", + " }", + " for (let i = 0; i < 255; i++) {", + " const r = i + ~~(random() * (256 - i));", + " const aux = p[i];", + " p[i] = p[r];", + " p[r] = aux;", + " }", + " return p;", + "}", + "", + "/*", + "The ALEA PRNG and masher code used by simplex-noise.js", + "is based on code by Johannes Baagøe, modified by Jonas Wagner.", + "See alea.md for the full license.", + "@param {string|number} seed", + "*/", + "function alea(seed) {", + " let s0 = 0;", + " let s1 = 0;", + " let s2 = 0;", + " let c = 1;", + " const mash = masher();", + " s0 = mash(' ');", + " s1 = mash(' ');", + " s2 = mash(' ');", + " s0 -= mash(seed);", + " if (s0 < 0) {", + " s0 += 1;", + " }", + " s1 -= mash(seed);", + " if (s1 < 0) {", + " s1 += 1;", + " }", + " s2 -= mash(seed);", + " if (s2 < 0) {", + " s2 += 1;", + " }", + " return function () {", + " const t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32", + " s0 = s1;", + " s1 = s2;", + " return s2 = t - (c = t | 0);", + " };", + "}", + "", + "function masher() {", + " let n = 0xefc8249d;", + " return function (data) {", + " data = data.toString();", + " for (let i = 0; i < data.length; i++) {", + " n += data.charCodeAt(i);", + " let h = 0.02519603282416938 * n;", + " n = h >>> 0;", + " h -= n;", + " h *= n;", + " n = h >>> 0;", + " h -= n;", + " n += h * 0x100000000; // 2^32", + " }", + " return (n >>> 0) * 2.3283064365386963e-10; // 2^-32", + " };", + "}", + "", + "/** Deterministic simplex noise generator suitable for 2D, 3D and 4D spaces. */", + "class SimplexNoise {", + " /**", + " * Creates a new `SimplexNoise` instance.", + " * This involves some setup. You can save a few cpu cycles by reusing the same instance.", + " * @param {(() => number)|string|number} randomOrSeed A random number generator or a seed (string|number).", + " * Defaults to Math.random (random irreproducible initialization).", + " */", + " constructor(randomOrSeed) {", + " if (randomOrSeed === void 0) { randomOrSeed = Math.random; }", + " const random = typeof randomOrSeed == 'function' ? randomOrSeed : alea(randomOrSeed);", + " this.p = buildPermutationTable(random);", + " this.perm = new Uint8Array(512);", + " this.permMod12 = new Uint8Array(512);", + " for (let i = 0; i < 512; i++) {", + " this.perm[i] = this.p[i & 255];", + " this.permMod12[i] = this.perm[i] % 12;", + " }", + " }", + "", + " /**", + " * Samples the noise field in 2 dimensions", + " * @param {number} x", + " * @param {number} y", + " * @returns a number in the interval [-1, 1]", + " */", + " noise2D(x, y) {", + " const permMod12 = this.permMod12;", + " const perm = this.perm;", + " let n0 = 0; // Noise contributions from the three corners", + " let n1 = 0;", + " let n2 = 0;", + " // Skew the input space to determine which simplex cell we're in", + " const s = (x + y) * F2; // Hairy factor for 2D", + " const i = Math.floor(x + s);", + " const j = Math.floor(y + s);", + " const t = (i + j) * G2;", + " const X0 = i - t; // Unskew the cell origin back to (x,y) space", + " const Y0 = j - t;", + " const x0 = x - X0; // The x,y distances from the cell origin", + " const y0 = y - Y0;", + " // For the 2D case, the simplex shape is an equilateral triangle.", + " // Determine which simplex we are in.", + " let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords", + " if (x0 > y0) {", + " i1 = 1;", + " j1 = 0;", + " } // lower triangle, XY order: (0,0)->(1,0)->(1,1)", + " else {", + " i1 = 0;", + " j1 = 1;", + " } // upper triangle, YX order: (0,0)->(0,1)->(1,1)", + " // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and", + " // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where", + " // c = (3-sqrt(3))/6", + " const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords", + " const y1 = y0 - j1 + G2;", + " const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords", + " const y2 = y0 - 1.0 + 2.0 * G2;", + " // Work out the hashed gradient indices of the three simplex corners", + " const ii = i & 255;", + " const jj = j & 255;", + " // Calculate the contribution from the three corners", + " let t0 = 0.5 - x0 * x0 - y0 * y0;", + " if (t0 >= 0) {", + " const gi0 = permMod12[ii + perm[jj]] * 3;", + " t0 *= t0;", + " n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient", + " }", + " let t1 = 0.5 - x1 * x1 - y1 * y1;", + " if (t1 >= 0) {", + " const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;", + " t1 *= t1;", + " n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);", + " }", + " let t2 = 0.5 - x2 * x2 - y2 * y2;", + " if (t2 >= 0) {", + " const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;", + " t2 *= t2;", + " n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);", + " }", + " // Add contributions from each corner to get the final noise value.", + " // The result is scaled to return values in the interval [-1,1].", + " return 70.0 * (n0 + n1 + n2);", + " }", + "", + " /**", + " * Samples the noise field in 3 dimensions", + " * @param {number} x", + " * @param {number} y", + " * @param {number} z", + " * @returns a number in the interval [-1, 1]", + " */", + " noise3D(x, y, z) {", + " const permMod12 = this.permMod12;", + " const perm = this.perm;", + " let n0, n1, n2, n3; // Noise contributions from the four corners", + " // Skew the input space to determine which simplex cell we're in", + " const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D", + " const i = Math.floor(x + s);", + " const j = Math.floor(y + s);", + " const k = Math.floor(z + s);", + " const t = (i + j + k) * G3;", + " const X0 = i - t; // Unskew the cell origin back to (x,y,z) space", + " const Y0 = j - t;", + " const Z0 = k - t;", + " const x0 = x - X0; // The x,y,z distances from the cell origin", + " const y0 = y - Y0;", + " const z0 = z - Z0;", + " // For the 3D case, the simplex shape is a slightly irregular tetrahedron.", + " // Determine which simplex we are in.", + " let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords", + " let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords", + " if (x0 >= y0) {", + " if (y0 >= z0) {", + " i1 = 1;", + " j1 = 0;", + " k1 = 0;", + " i2 = 1;", + " j2 = 1;", + " k2 = 0;", + " } // X Y Z order", + " else if (x0 >= z0) {", + " i1 = 1;", + " j1 = 0;", + " k1 = 0;", + " i2 = 1;", + " j2 = 0;", + " k2 = 1;", + " } // X Z Y order", + " else {", + " i1 = 0;", + " j1 = 0;", + " k1 = 1;", + " i2 = 1;", + " j2 = 0;", + " k2 = 1;", + " } // Z X Y order", + " }", + " else { // x0 y0)", + " rankx++;", + " else", + " ranky++;", + " if (x0 > z0)", + " rankx++;", + " else", + " rankz++;", + " if (x0 > w0)", + " rankx++;", + " else", + " rankw++;", + " if (y0 > z0)", + " ranky++;", + " else", + " rankz++;", + " if (y0 > w0)", + " ranky++;", + " else", + " rankw++;", + " if (z0 > w0)", + " rankz++;", + " else", + " rankw++;", + " // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.", + " // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0;", + " const j1 = ranky >= 3 ? 1 : 0;", + " const k1 = rankz >= 3 ? 1 : 0;", + " const l1 = rankw >= 3 ? 1 : 0;", + " // The integer offsets for the third simplex corner", + " const i2 = rankx >= 2 ? 1 : 0;", + " const j2 = ranky >= 2 ? 1 : 0;", + " const k2 = rankz >= 2 ? 1 : 0;", + " const l2 = rankw >= 2 ? 1 : 0;", + " // The integer offsets for the fourth simplex corner", + " const i3 = rankx >= 1 ? 1 : 0;", + " const j3 = ranky >= 1 ? 1 : 0;", + " const k3 = rankz >= 1 ? 1 : 0;", + " const l3 = rankw >= 1 ? 1 : 0;", + " // The fifth corner has all coordinate offsets = 1, so no need to compute that.", + " const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords", + " const y1 = y0 - j1 + G4;", + " const z1 = z0 - k1 + G4;", + " const w1 = w0 - l1 + G4;", + " const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords", + " const y2 = y0 - j2 + 2.0 * G4;", + " const z2 = z0 - k2 + 2.0 * G4;", + " const w2 = w0 - l2 + 2.0 * G4;", + " const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords", + " const y3 = y0 - j3 + 3.0 * G4;", + " const z3 = z0 - k3 + 3.0 * G4;", + " const w3 = w0 - l3 + 3.0 * G4;", + " const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords", + " const y4 = y0 - 1.0 + 4.0 * G4;", + " const z4 = z0 - 1.0 + 4.0 * G4;", + " const w4 = w0 - 1.0 + 4.0 * G4;", + " // Work out the hashed gradient indices of the five simplex corners", + " const ii = i & 255;", + " const jj = j & 255;", + " const kk = k & 255;", + " const ll = l & 255;", + " // Calculate the contribution from the five corners", + " let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;", + " if (t0 < 0)", + " n0 = 0.0;", + " else {", + " const gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;", + " t0 *= t0;", + " n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);", + " }", + " let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;", + " if (t1 < 0)", + " n1 = 0.0;", + " else {", + " const gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;", + " t1 *= t1;", + " n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);", + " }", + " let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;", + " if (t2 < 0)", + " n2 = 0.0;", + " else {", + " const gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;", + " t2 *= t2;", + " n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);", + " }", + " let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;", + " if (t3 < 0)", + " n3 = 0.0;", + " else {", + " const gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;", + " t3 *= t3;", + " n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);", + " }", + " let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;", + " if (t4 < 0)", + " n4 = 0.0;", + " else {", + " const gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;", + " t4 *= t4;", + " n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);", + " }", + " // Sum up and scale the result to cover the range [-1,1]", + " return 27.0 * (n0 + n1 + n2 + n3 + n4);", + " };", + "}", + "", + "gdjs._cameraShakeExtension = {", + " noiseManager: new NoiseManager(),", + "};", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Generate a number from 2 dimensional simplex noise.", + "fullName": "2D noise", + "functionType": "Expression", + "name": "Noise2d", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "const x = eventsFunctionContext.getArgument(\"X\");\r", + "const y = eventsFunctionContext.getArgument(\"Y\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).noise(x, y);" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + }, + { + "description": "X coordinate", + "name": "X", + "type": "expression" + }, + { + "description": "Y coordinate", + "name": "Y", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Generate a number from 3 dimensional simplex noise.", + "fullName": "3D noise", + "functionType": "Expression", + "name": "Noise3d", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "const x = eventsFunctionContext.getArgument(\"X\");\r", + "const y = eventsFunctionContext.getArgument(\"Y\");\r", + "const z = eventsFunctionContext.getArgument(\"Z\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).noise(x, y, z);" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + }, + { + "description": "X coordinate", + "name": "X", + "type": "expression" + }, + { + "description": "Y coordinate", + "name": "Y", + "type": "expression" + }, + { + "description": "Z coordinate", + "name": "Z", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Generate a number from 4 dimensional simplex noise.", + "fullName": "4D noise", + "functionType": "Expression", + "name": "Noise4d", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "const x = eventsFunctionContext.getArgument(\"X\");\r", + "const y = eventsFunctionContext.getArgument(\"Y\");\r", + "const z = eventsFunctionContext.getArgument(\"Z\");\r", + "const w = eventsFunctionContext.getArgument(\"W\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).noise(x, y, z, w);" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + }, + { + "description": "X coordinate", + "name": "X", + "type": "expression" + }, + { + "description": "Y coordinate", + "name": "Y", + "type": "expression" + }, + { + "description": "Z coordinate", + "name": "Z", + "type": "expression" + }, + { + "description": "W coordinate", + "name": "W", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Create a noise generator with default settings (frequency = 1, octaves = 1, persistence = 0.5, lacunarity = 2).", + "fullName": "Create a noise generator", + "functionType": "Action", + "name": "Create", + "private": true, + "sentence": "Create a noise generator named _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name);" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete a noise generator and loose its settings.", + "fullName": "Delete a noise generator", + "functionType": "Action", + "name": "Delete", + "private": true, + "sentence": "Delete _PARAM1_ noise generator", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.deleteGenerator(name);" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Delete all noise generators and loose their settings.", + "fullName": "Delete all noise generators", + "functionType": "Action", + "name": "DeleteAll", + "private": true, + "sentence": "Delete all noise generators", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "gdjs._cameraShakeExtension.noiseManager.deleteAllGenerators();", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "The seed is a number used to generate the random noise. Setting the same seed will result in the same random noise generation. It's for example useful to generate the same world, by saving this seed value and reusing it later to generate again a world.", + "fullName": "Noise seed", + "functionType": "Action", + "name": "SetSeed", + "private": true, + "sentence": "Change the noise seed to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "gdjs._cameraShakeExtension.noiseManager.setSeed(eventsFunctionContext.getArgument(\"Seed\"));", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Seed", + "longDescription": "15 digits numbers maximum", + "name": "Seed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the looping period on X used for noise generation. The noise will wrap-around on X.", + "fullName": "Noise looping period on X", + "functionType": "Action", + "name": "SetLoopPeriodX", + "private": true, + "sentence": "Change the looping period on X of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).xLoopPeriod = eventsFunctionContext.getArgument(\"LoopPeriod\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Looping period on X", + "name": "LoopPeriod", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change the looping period on Y used for noise generation. The noise will wrap-around on Y.", + "fullName": "Noise looping period on Y", + "functionType": "Action", + "name": "SetLoopPeriodY", + "private": true, + "sentence": "Change the looping period on Y of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).yLoopPeriod = eventsFunctionContext.getArgument(\"LoopPeriod\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Looping period on Y", + "name": "LoopPeriod", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change the base frequency used for noise generation. A lower frequency will zoom in the noise.", + "fullName": "Noise base frequency", + "functionType": "Action", + "name": "SetFrequency", + "private": true, + "sentence": "Change the noise frequency of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).frequency = eventsFunctionContext.getArgument(\"Frequency\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Frequency", + "name": "Frequency", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change the number of octaves used for noise generation. It can be seen as layers of noise with different zoom.", + "fullName": "Noise octaves", + "functionType": "Action", + "name": "SetOctaves", + "private": true, + "sentence": "Change the number of noise octaves of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).octaves = eventsFunctionContext.getArgument(\"Octaves\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Octaves", + "name": "Octaves", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change the persistence used for noise generation. At its default value \"0.5\", it halves the noise amplitude at each octave.", + "fullName": "Noise persistence", + "functionType": "Action", + "name": "SetPersistence", + "private": true, + "sentence": "Change the noise persistence of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).persistence = eventsFunctionContext.getArgument(\"Persistence\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Persistence", + "name": "Persistence", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change the lacunarity used for noise generation. At its default value \"2\", it doubles the frequency at each octave.", + "fullName": "Noise lacunarity", + "functionType": "Action", + "name": "SetLacunarity", + "private": true, + "sentence": "Change the noise lacunarity of _PARAM2_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "gdjs._cameraShakeExtension.noiseManager.getGenerator(name).lacunarity = eventsFunctionContext.getArgument(\"Lacunarity\");" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Lacunarity", + "name": "Lacunarity", + "type": "expression" + }, + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "The seed used for noise generation.", + "fullName": "Noise seed", + "functionType": "Expression", + "name": "Seed", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.seed;", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "The base frequency used for noise generation.", + "fullName": "Noise base frequency", + "functionType": "Expression", + "name": "Frequency", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).frequency;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "The number of octaves used for noise generation.", + "fullName": "Noise octaves number", + "functionType": "Expression", + "name": "Octaves", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).octaves;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "The persistence used for noise generation.", + "fullName": "Noise persistence", + "functionType": "Expression", + "name": "Persistence", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).persistence;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "The lacunarity used for noise generation.", + "fullName": "Noise lacunarity", + "functionType": "Expression", + "name": "Lacunarity", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const name = eventsFunctionContext.getArgument(\"Name\");\r", + "\r", + "eventsFunctionContext.returnValue = gdjs._cameraShakeExtension.noiseManager.getGenerator(name).lacunarity;" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Generator name", + "name": "Name", + "type": "string" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] + }, + { + "author": "@4ian, Entropy, VegeTato", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Flash object", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWZsYXNoLW91dGxpbmUiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNNywySDE3TDEzLjUsOUgxN0wxMCwyMlYxNEg3VjJNOSw0VjEySDEyVjE0LjY2TDE0LDExSDEwLjI0TDEzLjc2LDRIOVoiIC8+PC9zdmc+", + "name": "Flash", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/flash-outline.svg", + "shortDescription": "Make an object flash visibility (blink), color tint, object effect, or opacity (fade).", + "version": "1.4.0", + "description": [ + "Make an object flash for a period of time so that it alternates between two different states.", + "Includes the ability to flash visibility (blink), color tint, object effect, or opacity (fade).", + "", + "After adding a behavior to an object, you **trigger the effect** by using the **Flash action**.", + "", + "This can be used to:", + "- Let players know they are invincible after being hit", + "- Catch player attention on the interface (for instance a \"press start\" text)", + "" + ], + "origin": { + "identifier": "Flash", + "name": "gdevelop-extension-store" + }, + "tags": [ + "tween", + "flash", + "blink", + "visible", + "invisible", + "hit", + "damage", + "fade", + "effect", + "color", + "tint" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "q8ubdigLvIRXLxsJDDTaokO41mc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Color tint applied to an object.", + "fullName": "Color tint applied to an object", + "functionType": "ExpressionAndCondition", + "name": "ColorTint", + "private": true, + "sentence": "Color tint applied to _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Return the color string for the tint applied to the object" + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "/** @type {gdjs.SpriteRuntimeObject} */\r", + "const tintedObject = objects[0];\r", + "const tint = tintedObject.getColor();\r", + "eventsFunctionContext.returnValue = tint;" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a color tint is applied to an object.", + "fullName": "Is a color tint applied to an object", + "functionType": "StringExpression", + "name": "IsTinted", + "private": true, + "sentence": "_PARAM1_ is color tinted", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Flash::ColorTint" + }, + "parameters": [ + "", + "=", + "\"255;255;255\"", + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle color tint between the starting tint and a given value.", + "fullName": "Toggle a color tint", + "functionType": "Action", + "name": "ToggleColorTint", + "private": true, + "sentence": "Toggle color tint _PARAM2_ on _PARAM1_", + "events": [ + { + "colorB": 35, + "colorG": 166, + "colorR": 245, + "creationTime": 0, + "name": "Note: This function cannot be \"public\" until it properly handles objects without a starting color tint variable (NULL)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Swap between the starting tint and the given value", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_ColorTintToggled", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::ColorTint" + }, + "parameters": [ + "", + "=", + "Object.VariableString(__FlashColor_StartingTint)", + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "ColorTint" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_ColorTintToggled", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_ColorTintToggled", + "False" + ] + }, + { + "type": { + "inverted": true, + "value": "Flash::ColorTint" + }, + "parameters": [ + "", + "=", + "Object.VariableString(__FlashColor_StartingTint)", + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "Object.VariableString(__FlashColor_StartingTint)" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "objectList" + }, + { + "description": "Color tint", + "name": "ColorTint", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle object visibility.", + "fullName": "Toggle object visibility", + "functionType": "Action", + "name": "ToggleVisibility", + "private": true, + "sentence": "Toggle visibility of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_VisibilityToggled", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Visible" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_VisibilityToggled", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_VisibilityToggled", + "False" + ] + }, + { + "type": { + "inverted": true, + "value": "Visible" + }, + "parameters": [ + "Object" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Make the object flash (blink) for a period of time so it alternates between visible and invisible.", + "fullName": "Flash visibility (blink)", + "name": "Flash", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Alternate states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Timer\"", + ">", + "HalfPeriodTime" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::ToggleVisibility" + }, + "parameters": [ + "", + "Object", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Timer\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop flashing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FlashDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Duration_Timer\"", + ">", + "FlashDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::Flash::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Make an object flash (blink) visibility for a period of time.", + "fullName": "Flash visibility (blink)", + "functionType": "Action", + "name": "Flash", + "sentence": "Make _PARAM0_ flash (blink) for _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Flash::Flash::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::ToggleVisibility" + }, + "parameters": [ + "", + "Object", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Timer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Duration_Timer\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlashDuration", + "=", + "NewFlashDuration" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + }, + { + "description": "Duration of the flashing, in seconds", + "longDescription": "Use \"0\" to keep flashing until stopped.", + "name": "NewFlashDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is flashing visibility.", + "fullName": "Is object flashing visibility", + "functionType": "Condition", + "name": "IsFlashing", + "sentence": "_PARAM0_ is flashing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::Flash::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop flashing visibility (blink) of an object.", + "fullName": "Stop flashing visibility (blink)", + "functionType": "Action", + "name": "Stop", + "sentence": "Stop flashing visibility of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "False", + "" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Timer\"" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Visibility_Duration_Timer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the half period of the object (time the object is invisible).", + "fullName": "Half period", + "functionType": "ExpressionAndCondition", + "group": "Flash visibility (blink) configuration", + "name": "HalfPeriodTime", + "sentence": "the half period (time the object is invisible)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HalfPeriodTime" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HalfPeriodTime", + "name": "SetHalfPeriodTime", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HalfPeriodTime", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::Flash", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Half period ", + "description": "Time that the object is invisible", + "name": "HalfPeriodTime" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsFlashing" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Flash duration", + "description": "Use \"0\" to keep flashing until stopped", + "hidden": true, + "name": "FlashDuration" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Make an object flash a color tint for a period of time.", + "fullName": "Flash color tint", + "name": "FlashColor", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Alternate states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Timer\"", + ">", + "HalfPeriodTime" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Timer\"" + ] + }, + { + "type": { + "value": "Flash::ToggleColorTint" + }, + "parameters": [ + "", + "Object", + "TintColor", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop flashing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FlashDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Duration_Timer\"", + ">", + "FlashDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::FlashColor::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Make an object flash a color tint for a period of time.", + "fullName": "Flash a color tint", + "functionType": "Action", + "name": "Flash", + "sentence": "Make _PARAM0_ flash the color tint _PARAM3_ for _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjetTxt" + }, + "parameters": [ + "Object", + "__FlashColor_StartingTint", + "=", + "Flash::ColorTint(Object)" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Timer\"" + ] + }, + { + "type": { + "value": "Flash::ToggleColorTint" + }, + "parameters": [ + "", + "Object", + "NewColorTint", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Duration_Timer\"" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TintColor", + "=", + "NewColorTint" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlashDuration", + "=", + "NewFlashDuration" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + }, + { + "description": "Duration of the flashing, in seconds", + "longDescription": "Use \"0\" to keep flashing until stopped.", + "name": "NewFlashDuration", + "type": "expression" + }, + { + "description": "Color tint", + "name": "NewColorTint", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is flashing a color tint.", + "fullName": "Is object flashing a color tint", + "functionType": "Condition", + "name": "IsFlashing", + "sentence": "_PARAM0_ is flashing a color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::FlashColor::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop flashing a color tint on an object.", + "fullName": "Stop flashing color tint", + "functionType": "Action", + "name": "Stop", + "sentence": "Stop flashing color tint _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "False", + "" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "Object.VariableString(__FlashColor_StartingTint)" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Timer\"" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Duration_Timer\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the half period (time between flashes) of the object.", + "fullName": "Half period", + "functionType": "ExpressionAndCondition", + "group": "Flash color tint configuration", + "name": "HalfPeriodTime", + "sentence": "the half period (time between flashes)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HalfPeriodTime" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HalfPeriodTime", + "name": "SetHalfPeriodTime", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HalfPeriodTime", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashColor", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Half period", + "description": "Time between flashes", + "name": "HalfPeriodTime" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsFlashing" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Flash duration", + "description": "Use \"0\" to keep flashing until stopped", + "hidden": true, + "name": "FlashDuration" + }, + { + "value": "\"255;255;255\"", + "type": "String", + "label": "Tint color", + "hidden": true, + "name": "TintColor" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Flash opacity smoothly (fade) in a repeating loop.", + "fullName": "Flash opacity smothly (fade)", + "name": "FlashOpacity", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::FlashOpacity::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Alternate states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Tween::HasFinished" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToTargetOpacity\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Tween::AddObjectOpacityTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToStartingOpacity\"", + "StartingOpacity", + "\"easeInOutCubic\"", + "1000 * HalfPeriodTime", + "" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToTargetOpacity\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Tween::HasFinished" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToStartingOpacity\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Tween::AddObjectOpacityTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToTargetOpacity\"", + "TargetOpacity", + "\"easeInOutCubic\"", + "1000 * HalfPeriodTime", + "" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToStartingOpacity\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop flashing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FlashDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Opacity_Duration_Timer\"", + ">", + "FlashDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::FlashOpacity::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Make an object flash opacity smoothly (fade) in a repeating loop.", + "fullName": "Flash the opacity (fade)", + "functionType": "Action", + "name": "Flash", + "sentence": "Make _PARAM0_ flash opacity smoothly to _PARAM4_ in a loop for _PARAM3_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "StartingOpacity", + "=", + "Object.Opacity::Value()" + ] + }, + { + "type": { + "value": "Tween::AddObjectOpacityTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToTargetOpacity\"", + "NewTargetOpacity", + "\"easeInOutCubic\"", + "1000 * HalfPeriodTime", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Opacity_Duration_Timer\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlashDuration", + "=", + "NewFlashDuration" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TargetOpacity", + "=", + "NewTargetOpacity" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + }, + { + "description": "Tween behavior (required)", + "name": "TweenBehavior", + "supplementaryInformation": "Tween::TweenBehavior", + "type": "behavior" + }, + { + "description": "Duration of the flashing, in seconds", + "longDescription": "Use \"0\" to keep flashing until stopped.", + "name": "NewFlashDuration", + "type": "expression" + }, + { + "description": "Target opacity", + "name": "NewTargetOpacity", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is flashing opacity.", + "fullName": "Is object flashing opacity", + "functionType": "Condition", + "name": "IsFlashing", + "sentence": "_PARAM0_ is flashing opacity", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::FlashOpacity::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop flashing opacity of an object.", + "fullName": "Stop flashing opacity", + "functionType": "Action", + "name": "Stop", + "sentence": "Stop flashing opacity of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::FlashOpacity::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "False", + "" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Color_Duration_Timer\"" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToTargetOpacity\"" + ] + }, + { + "type": { + "value": "Tween::RemoveTween" + }, + "parameters": [ + "Object", + "TweenBehavior", + "\"__Flash.ToStartingOpacity\"" + ] + }, + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "Object", + "Opacity", + "=", + "StartingOpacity" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the half period (time between flashes) of the object.", + "fullName": "Half period", + "functionType": "ExpressionAndCondition", + "group": "Flash opacity smothly (fade) configuration", + "name": "HalfPeriodTime", + "sentence": "the half period (time between flashes)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HalfPeriodTime" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HalfPeriodTime", + "name": "SetHalfPeriodTime", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HalfPeriodTime", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashOpacity", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Opacity capability", + "extraInformation": [ + "OpacityCapability::OpacityBehavior" + ], + "name": "Opacity" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween Behavior (required)", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "TweenBehavior" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Half period", + "description": "Time between flashes", + "name": "HalfPeriodTime" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsFlashing" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Flash duration", + "description": "Use \"0\" to keep flashing until stopped", + "hidden": true, + "name": "FlashDuration" + }, + { + "value": "0", + "type": "Number", + "unit": "Dimensionless", + "label": "Target opacity (Range: 0 - 255)", + "description": "Opacity will fade between the starting value and a target value", + "hidden": true, + "name": "TargetOpacity" + }, + { + "value": "", + "type": "Number", + "unit": "Dimensionless", + "label": "Starting opacity", + "description": "Opacity will fade between the starting value and a target value", + "hidden": true, + "name": "StartingOpacity" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Make the object flash an effect for a period of time.", + "fullName": "Flash effect", + "name": "FlashEffect", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::FlashEffect::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Alternate states", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Timer\"", + ">", + "HalfPeriodTime" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Timer\"" + ] + }, + { + "type": { + "value": "Flash::FlashEffect::ToggleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "EffectName", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop flashing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "FlashDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Duration_Timer\"", + ">", + "FlashDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::FlashEffect::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Make an object flash an effect for a period of time.", + "fullName": "Flash an effect", + "functionType": "Action", + "name": "Flash", + "sentence": "Make _PARAM0_ flash the effect _PARAM3_ for _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop flashing existing effects if the effect name changed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Flash::FlashEffect::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "EffectName", + "!=", + "NewEffectName" + ] + } + ], + "actions": [ + { + "type": { + "value": "Flash::FlashEffect::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Flash::FlashEffect::IsFlashing" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::IsEffectEnabled" + }, + "parameters": [ + "Object", + "Effect", + "NewEffectName" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__FlashColor_StartingState", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "EffectCapability::EffectBehavior::IsEffectEnabled" + }, + "parameters": [ + "Object", + "Effect", + "NewEffectName" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__FlashColor_StartingState", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::FlashEffect::ToggleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "NewEffectName", + "" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Timer\"" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Duration_Timer\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlashDuration", + "=", + "NewFlashDuration" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + }, + { + "description": "Duration of the flashing, in seconds", + "longDescription": "Use \"0\" to keep flashing until stopped.", + "name": "NewFlashDuration", + "type": "expression" + }, + { + "description": "Name of effect", + "name": "NewEffectName", + "type": "objectEffectName" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is flashing an effect.", + "fullName": "Is object flashing an effect", + "functionType": "Condition", + "name": "IsFlashing", + "sentence": "_PARAM0_ is flashing an effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Flash::FlashEffect::Stop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop flashing an effect of an object.", + "fullName": "Stop flashing an effect", + "functionType": "Action", + "name": "Stop", + "sentence": "Stop flashing an effect on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsFlashing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsFlashing", + "False", + "" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Timer\"" + ] + }, + { + "type": { + "value": "RemoveObjectTimer" + }, + "parameters": [ + "Object", + "\"Flash_Effect_Duration_Timer\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__FlashEffect_StartingState", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__FlashEffect_StartingState", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the half period (time between flashes) of the object.", + "fullName": "Half period", + "functionType": "ExpressionAndCondition", + "group": "Flash effect configuration", + "name": "HalfPeriodTime", + "sentence": "the half period (time between flashes)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HalfPeriodTime" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HalfPeriodTime", + "name": "SetHalfPeriodTime", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HalfPeriodTime", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle an object effect.", + "fullName": "Toggle an object effect", + "functionType": "Action", + "name": "ToggleEffect", + "private": true, + "sentence": "Toggle effect _PARAM2_ on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_EffectToggled", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::IsEffectEnabled" + }, + "parameters": [ + "Object", + "Effect", + "EffectName" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_EffectToggled", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__Flash_EffectToggled", + "False" + ] + }, + { + "type": { + "inverted": true, + "value": "EffectCapability::EffectBehavior::IsEffectEnabled" + }, + "parameters": [ + "Object", + "Effect", + "EffectName" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Flash::FlashEffect", + "type": "behavior" + }, + { + "description": "Effect name to toggle", + "name": "EffectName", + "type": "objectEffectName" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Half period", + "description": "Time between flashes", + "name": "HalfPeriodTime" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsFlashing" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Flash duration", + "description": "Use \"0\" to keep flashing until stopped", + "hidden": true, + "name": "FlashDuration" + }, + { + "value": "", + "type": "String", + "label": "Name of effect", + "hidden": true, + "name": "EffectName" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Health points and damage", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", + "name": "Health", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", + "shortDescription": "Manage health (life) points, shield and armor.", + "version": "0.4.0", + "description": [ + "Manage health (life) points, shield and armor. ", + "", + "It handles:", + "- Damage cooldown", + "- Health and shield regeneration", + "- Over healing", + "", + "It can be used on:", + "- Players", + "- Enemies", + "- NPCs", + "- Inanimate objects (for insance breakable doors or mining rocks)", + "", + "The top-down RPG example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://top-down-rpg))." + ], + "origin": { + "identifier": "Health", + "name": "gdevelop-extension-store" + }, + "tags": [ + "health", + "life", + "damage", + "hit", + "heal", + "shield", + "regeneration", + "armor" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Manage health (life) points, shield and armor.", + "fullName": "Health", + "name": "Health", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + }, + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Health", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HealthRegenRate", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + "<", + "Object.Behavior::MaxHealth()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "HealthRegenDelay" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "+", + "HealthRegenRate * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "MaxHealth" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset triggers", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "False", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "False", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "False", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shield" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldRegenRate", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "<", + "MaxShieldPoints" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "ShieldRegenDelay" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "+", + "ShieldRegenRate * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + ">", + "MaxShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "MaxShieldPoints" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove shield points if shield expired", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "False", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage to the object. Shield and armor can reduce this damage if enabled.", + "fullName": "Apply damage to an object", + "functionType": "Action", + "group": "Health", + "name": "Hit", + "sentence": "Apply _PARAM2_ points of damage to _PARAM0_ (Damage can be reduced by Shield: _PARAM3_, Armor: _PARAM4_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Incoming damage", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider incoming damage when damage cooldown is not active" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "DamageValue" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Chance to dodge", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "No damage will be applied when dodged" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "RandomFloatInRange(0,1)", + "<", + "ChanceToDodge" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "True", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Damage reduction from Armor", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "UseArmor", + "True", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flat damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "max(0,DamageToBeApplied - FlatDamageReduction)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Percent damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "PercentDamageReduction", + ">", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "*", + "1 - min(1, PercentDamageReduction)" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is active, damage the shield first" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "UseShield", + "True", + "" + ] + }, + { + "type": { + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "True", + "" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is less than shield, subtract damage from shield." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "<=", + "CurrentShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "-", + "DamageToBeApplied" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDamageTaken", + "=", + "DamageToBeApplied" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is greater than shield, conditionally apply excess damage based on property" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "CurrentShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDamageTaken", + "=", + "CurrentShieldPoints" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply excess damage only if shield does not block excess damage" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "-", + "CurrentShieldPoints" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "CurrentHealth - DamageToBeApplied", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points of damage", + "name": "DamageValue", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Shield can reduce damage taken", + "name": "UseShield", + "optional": true, + "type": "yesorno" + }, + { + "defaultValue": "yes", + "description": "Armor can reduce damage taken", + "name": "UseArmor", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "current health points of the object.", + "fullName": "Health points", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "Health", + "sentence": "health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentHealth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the health points of the object. Will not trigger damage cooldown.", + "fullName": "Change health points", + "functionType": "Action", + "group": "Health", + "name": "SetHealth", + "sentence": "Change the health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If MaxHealth is set, prevent health from going above it" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "min(CurrentHealth, MaxHealth)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the health points of the object. Will not trigger damage cooldown.", + "fullName": "Change health points (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCurrentHealth", + "private": true, + "sentence": "Change the health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Heal the object by increasing its health points.", + "fullName": "Heal object", + "functionType": "Action", + "group": "Health", + "name": "Heal", + "sentence": "Heal _PARAM0_ with _PARAM2_ health points", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Heal", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is not set, do not enforce Max Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealToBeApplied", + "=", + "HealValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is set and Overhealing is not allowed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + ">", + "0" + ] + }, + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealToBeApplied", + "=", + "min(HealValue,MaxHealth - CurrentHealth)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perform heal" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "+", + "HealToBeApplied" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update healing trigger" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points to heal (will be added to object health)", + "name": "HealValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum health points of the object.", + "fullName": "Maximum health points", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "MaxHealth", + "sentence": "the maximum health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxHealth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxHealth", + "name": "SetMaxHealthOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxHealth", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure Current Health does not exceed new Max Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "Object.Behavior::MaxHealth()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum health points.", + "fullName": "Maximum health points (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetMaxHealth", + "private": true, + "sentence": "Change the maximum health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxHealthOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the rate of health regeneration (points per second).", + "fullName": "Rate of health regeneration", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "HealthRegenRate", + "sentence": "the rate of health regeneration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealthRegenRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HealthRegenRate", + "name": "SetHealthRegenRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealthRegenRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the rate of health regeneration.", + "fullName": "Rate of health regeneration (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenRate", + "private": true, + "sentence": "Change the rate of health regen of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealthRegenRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the duration of damage cooldown (seconds).", + "fullName": "Damage cooldown", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "DamageCooldownDuration", + "sentence": "the duration of damage cooldown", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DamageCooldown" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DamageCooldownDuration", + "name": "SetCooldownDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageCooldown", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration of damage cooldown (seconds).", + "fullName": "Damage cooldown (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCooldownDuration", + "private": true, + "sentence": "Change the duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetCooldownDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the delay before health regeneration starts after last being hit (seconds).", + "fullName": "Health regeneration delay", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "HealthRegenDelay", + "sentence": "the health regeneration delay", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealthRegenDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HealthRegenDelay", + "name": "SetHealthRegenDelayOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealthRegenDelay", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the delay before health regeneration starts after being hit.", + "fullName": "Health regeneration delay (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenDelay", + "private": true, + "sentence": "Change the health regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealthRegenDelayOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the chance to dodge incoming damage (range: 0 to 1).", + "fullName": "Dodge chance", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "ChanceToDodge", + "sentence": "the chance to dodge incoming damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ChanceToDodge" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ChanceToDodge", + "name": "SetChanceToDodgeOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ChanceToDodge", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Chance to dodge (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the chance to dodge incoming damage.", + "fullName": "Chance to dodge incoming damage (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetChanceToDodge", + "private": true, + "sentence": "Change the chance to dodge on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetChanceToDodgeOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Chance to dodge (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the flat damage reduction from the armor. Incoming damage is reduced by this value.", + "fullName": "Armor flat damage reduction", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "FlatDamageReduction", + "sentence": "the armor flat damage reduction", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FlatDamageReduction" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FlatDamageReduction", + "name": "SetFlatDamageReductionOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlatDamageReduction", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Flat reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the flat damage reduction from armor. Incoming damage is reduced by this value.", + "fullName": "Flat damage reduction from armor (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetFlatDamageReduction", + "private": true, + "sentence": "Change the flat damage reduction from armor on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetFlatDamageReductionOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Flat reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the percent damage reduction from armor (range: 0 to 1).", + "fullName": "Armor percent damage reduction", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "PercentDamageReduction", + "sentence": "the armor percent damage reduction", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PercentDamageReduction" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PercentDamageReduction", + "name": "SetPercentDamageReductionOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PercentDamageReduction", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Percent damage reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percent damage reduction from armor. Range: 0 to 1.", + "fullName": "Percent damage reduction from armor (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetPercentDamageReduction", + "private": true, + "sentence": "Change the percent damage reduction from armor on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPercentDamageReductionOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Percent damage reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Allow heals to increase health above max health. Regeneration will not exceed max health.", + "fullName": "Allow over-healing", + "functionType": "Action", + "group": "Health configuration", + "name": "AllowOverHealing", + "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Allow over-healing", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as hit at least once.", + "fullName": "Mark object as hit at least once", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHitAtLeastOnce", + "private": true, + "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Hit at least once", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as just damaged.", + "fullName": "Mark object as just damaged", + "functionType": "Action", + "group": "Health configuration", + "name": "SetJustDamaged", + "private": true, + "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Just damaged", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Trigger damage cooldown.", + "fullName": "Trigger damage cooldown", + "functionType": "Action", + "group": "Health", + "name": "TriggerDamageCooldown", + "sentence": "Trigger the damage cooldown on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark that the object was hit at least once (used for initial state of damage cooldown)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::HitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has been hit at least once.", + "fullName": "Object has been hit at least once", + "functionType": "Condition", + "group": "Health", + "name": "HitAtLeastOnce", + "private": true, + "sentence": "_PARAM0_ has been hit at least once", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This condition is used to prevent \"damage cooldown\" from being active when the game starts." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if health was just damaged previously in the events.", + "fullName": "Is health just damaged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDamaged", + "sentence": "Health has just been damaged on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object was just healed previously in the events.", + "fullName": "Is just healed", + "functionType": "Condition", + "group": "Health", + "name": "IsJustHealed", + "sentence": "_PARAM0_ has just been healed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if damage cooldown is active. Object and shield cannot be damaged while this is active.", + "fullName": "Is damage cooldown active", + "functionType": "Condition", + "group": "Health", + "name": "IsDamageCooldownActive", + "sentence": "Damage cooldown on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageCooldown", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + "<", + "DamageCooldown" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time before damage cooldown ends (seconds).", + "fullName": "Time remaining in damage cooldown", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "DamageCooldownRemaining", + "sentence": "the time before damage cooldown end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,DamageCooldown - Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is considered dead (no health points).", + "fullName": "Is dead", + "functionType": "Condition", + "group": "Health", + "name": "IsDead", + "sentence": "_PARAM0_ is dead", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time since last taken hit (seconds).", + "fullName": "Time since last hit", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "TimeSinceLastHit", + "sentence": "the time since last taken hit on health", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the health damage taken from most recent hit.", + "fullName": "Health damage taken from most recent hit", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "PreviousDamageTaken", + "sentence": "the health damage taken from most recent hit", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DamageToBeApplied" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "MaxShield", + "sentence": "the maximum shield points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxShieldPoints" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxShield", + "name": "SetMaxShieldOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxShieldPoints", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum shield points of the object.", + "fullName": "Maximum shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShield", + "private": true, + "sentence": "Change the maximum shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxShieldOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change maximum shield points.", + "fullName": "Max shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShieldPoints", + "private": true, + "sentence": "Change the maximum shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxShieldOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the current shield points of the object.", + "fullName": "Shield points", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "ShieldPoints", + "sentence": "the shield points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentShieldPoints" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldPoints", + "name": "SetShieldPointsOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change current shield points. Will not trigger damage cooldown.", + "fullName": "Shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldPoints", + "private": true, + "sentence": "Change current shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldPointsOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the rate of shield regeneration (points per second).", + "fullName": "Rate of shield regeneration", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldRegenRate", + "sentence": "the rate of shield regeneration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldRegenRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldRegenRate", + "name": "SetShieldRegenRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldRegenRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration rate (points per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of shield regeneration.", + "fullName": "Shield regeneration rate (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenRate", + "private": true, + "sentence": "Change the shield regeneration rate of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldRegenRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration rate (points per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the delay before shield regeneration starts after being hit (seconds).", + "fullName": "Shield regeneration delay", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldRegenDelay", + "sentence": "the shield regeneration delay", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldRegenDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldRegenDelay", + "name": "SetShieldRegenDelayOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldRegenDelay", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before shield regeneration starts after being hit.", + "fullName": "Shield regeneration delay (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenDelay", + "private": true, + "sentence": "Change the shield regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldRegenDelayOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the duration of the shield (seconds). A value of \"0\" means the shield is permanent.", + "fullName": "Duration of shield", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldDuration", + "sentence": "the duration of the shield", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldDuration", + "name": "SetShieldDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of shield. Use \"0\" to make shield permanent.", + "fullName": "Duration of shield (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldDuration", + "private": true, + "sentence": "Change the duration of shield on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Renew shield duration to it's full value.", + "fullName": "Renew shield duration", + "functionType": "Action", + "group": "Shield", + "name": "RenewShieldDuration", + "sentence": "Renew the shield duration on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Activate the shield by setting the shield points and renewing the shield duration (optional).", + "fullName": "Activate shield", + "functionType": "Action", + "group": "Shield", + "name": "ActivateShield", + "sentence": "Activate the shield on _PARAM0_ with _PARAM2_ points (Renew shield duration: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "ShieldPoints" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxShieldPoints", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "min(ShieldPoints,Object.Behavior::MaxShield())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "RenewShieldDuration", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "ShieldPoints", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Renew shield duration", + "name": "RenewShieldDuration", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) blocking excess damage when shield breaks.", + "fullName": "Block excess damage when shield breaks", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldBlockExcessDamage", + "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Block excess damage", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield was just damaged previously in the events.", + "fullName": "Is shield just damaged", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldJustDamaged", + "sentence": "Shield on _PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if incoming damage was just dodged.", + "fullName": "Damage was just dodged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDodged", + "sentence": "_PARAM0_ just dodged incoming damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield is active (based on shield points and duration).", + "fullName": "Is shield active", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldActive", + "sentence": "Shield on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't check the timer when duration is zero (or negative)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"", + "<", + "ShieldDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time before the shield duration ends (seconds).", + "fullName": "Time before shield duration ends", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "ShieldTimeRemaining", + "sentence": "the time before the shield duration end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,ShieldDuration - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the shield damage taken from most recent hit.", + "fullName": "Shield damage taken from most recent hit", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "PreviousDamageToShield", + "sentence": "the shield damage taken from most recent hit", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldDamageTaken" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the health points gained from previous heal.", + "fullName": "Health points gained from previous heal", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "PreviousHealAmount", + "sentence": "the health points gained from previous heal", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealToBeApplied" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "label": "Starting health", + "group": "Health", + "name": "Health" + }, + { + "value": "0", + "type": "Number", + "label": "Current health (life) points", + "group": "Health", + "hidden": true, + "name": "CurrentHealth" + }, + { + "value": "100", + "type": "Number", + "label": "Maximum health", + "description": "Use 0 for no maximum.", + "group": "Health", + "name": "MaxHealth" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Damage cooldown", + "group": "Health", + "name": "DamageCooldown" + }, + { + "value": "", + "type": "Boolean", + "label": "Allow heals to increase health above max health (regen will never exceed max health)", + "group": "Health", + "advanced": true, + "name": "AllowOverHealing" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "IsHealthJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Damage to health from the previous incoming damage", + "group": "Health", + "hidden": true, + "name": "DamageToBeApplied" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "HitAtLeastOnce" + }, + { + "value": "0", + "type": "Number", + "label": "Chance to dodge incoming damage (between 0 and 1)", + "description": "When a damage is dodged, no damage is applied.", + "group": "Health", + "advanced": true, + "name": "ChanceToDodge" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "IsJustDodged" + }, + { + "value": "0", + "type": "Number", + "label": "Health points gained from the previous heal", + "group": "Health", + "hidden": true, + "name": "HealToBeApplied" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of health regeneration (points per second)", + "group": "Health regeneration", + "advanced": true, + "name": "HealthRegenRate" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Health regeneration delay ", + "description": "Delay before health regeneration starts after a hit.", + "group": "Health regeneration", + "advanced": true, + "name": "HealthRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsJustHealed" + }, + { + "value": "", + "type": "Number", + "label": "Current shield points", + "group": "Shield", + "hidden": true, + "name": "CurrentShieldPoints" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum shield", + "description": "Leave 0 for unlimited.", + "group": "Shield", + "advanced": true, + "name": "MaxShieldPoints" + }, + { + "value": "5", + "type": "Number", + "unit": "Second", + "label": "Duration of shield", + "description": "Use 0 to make the shield permanent.", + "group": "Shield", + "advanced": true, + "name": "ShieldDuration" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of shield regeneration (points per second)", + "group": "Shield regeneration", + "advanced": true, + "name": "ShieldRegenRate" + }, + { + "value": "", + "type": "Boolean", + "label": "Block excess damage when shield is broken", + "group": "Shield", + "advanced": true, + "name": "BlockExcessDamage" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Shield regeneration delay", + "description": "Delay before shield regeneration starts after a hit.", + "group": "Shield regeneration", + "advanced": true, + "name": "ShieldRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Shield", + "hidden": true, + "name": "IsShieldJustDamaged" + }, + { + "value": "", + "type": "Number", + "label": "Damage to shield from the previous incoming damage", + "group": "Shield", + "hidden": true, + "name": "ShieldDamageTaken" + }, + { + "value": "0", + "type": "Number", + "label": "Flat damage reduction from armor", + "description": "Incoming damages are reduced by this value.", + "group": "Armor", + "advanced": true, + "name": "FlatDamageReduction" + }, + { + "value": "0", + "type": "Number", + "label": "Percentage damage reduction from armor (between 0 and 1)", + "group": "Armor", + "advanced": true, + "name": "PercentDamageReduction" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.1", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "group": "Effects", + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "group": "Effects", + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "group": "Animation", + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "group": "Animation", + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "group": "Effect", + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "group": "Value", + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "group": "Value", + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "group": "Size", + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "group": "Size", + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "group": "Color", + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "group": "Color", + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [ + { + "associatedLayout": "PlayScene", + "name": "GameOver", + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "UI", + "name": "ContinueText", + "persistentUuid": "404b9295-2dff-40f3-9234-5ca8852c628d", + "width": 960, + "x": 0, + "y": 488, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 340.90472412109375, + "customSize": false, + "height": 0, + "layer": "UI", + "name": "GameOver", + "persistentUuid": "7b2a94fc-f5c5-47bf-be8a-7bfec473e87d", + "width": 0, + "x": 210, + "y": 210, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.7291666666666666, + "windowMask": false + } + }, + { + "associatedLayout": "PlayScene", + "name": "MultiTouchControls", + "instances": [ + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "MobileControls", + "name": "LeftButton", + "persistentUuid": "8e22c86e-1d22-43be-a6ed-8e31d521d0c9", + "width": 0, + "x": 84, + "y": 352, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 225, + "customSize": false, + "height": 0, + "layer": "MobileControls", + "name": "RightButton", + "persistentUuid": "196091ae-e157-4d90-90e4-a0bb044f2de5", + "width": 0, + "x": 203, + "y": 460, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": -45, + "customSize": false, + "height": 0, + "layer": "MobileControls", + "name": "TopButton", + "persistentUuid": "4b70b183-aeba-498e-8a03-bf0aa04068c4", + "width": 0, + "x": 759, + "y": 460, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": false, + "height": 0, + "layer": "MobileControls", + "name": "FireButton", + "persistentUuid": "a8da09a2-6c3a-4a3b-896c-c7722ac6bcd0", + "width": 0, + "x": 878, + "y": 352, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "editionSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.9456121752663597, + "windowMask": false + } + } + ] +} \ No newline at end of file diff --git a/templates/healthBar/assets/9patch castle.png b/templates/healthBar/assets/9patch castle.png new file mode 100644 index 0000000..c0350c0 Binary files /dev/null and b/templates/healthBar/assets/9patch castle.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle1.png b/templates/healthBar/assets/BrokenUpIdle1.png new file mode 100644 index 0000000..d078765 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle1.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle10.png b/templates/healthBar/assets/BrokenUpIdle10.png new file mode 100644 index 0000000..f51eb07 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle10.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle11.png b/templates/healthBar/assets/BrokenUpIdle11.png new file mode 100644 index 0000000..f51eb07 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle11.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle2.png b/templates/healthBar/assets/BrokenUpIdle2.png new file mode 100644 index 0000000..a846912 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle2.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle3.png b/templates/healthBar/assets/BrokenUpIdle3.png new file mode 100644 index 0000000..a846912 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle3.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle4.png b/templates/healthBar/assets/BrokenUpIdle4.png new file mode 100644 index 0000000..82fef23 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle4.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle5.png b/templates/healthBar/assets/BrokenUpIdle5.png new file mode 100644 index 0000000..82fef23 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle5.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle6.png b/templates/healthBar/assets/BrokenUpIdle6.png new file mode 100644 index 0000000..a000a41 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle6.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle7.png b/templates/healthBar/assets/BrokenUpIdle7.png new file mode 100644 index 0000000..a000a41 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle7.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle8.png b/templates/healthBar/assets/BrokenUpIdle8.png new file mode 100644 index 0000000..a000a41 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle8.png differ diff --git a/templates/healthBar/assets/BrokenUpIdle9.png b/templates/healthBar/assets/BrokenUpIdle9.png new file mode 100644 index 0000000..a000a41 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpIdle9.png differ diff --git a/templates/healthBar/assets/BrokenUpRun1.png b/templates/healthBar/assets/BrokenUpRun1.png new file mode 100644 index 0000000..563637c Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun1.png differ diff --git a/templates/healthBar/assets/BrokenUpRun10.png b/templates/healthBar/assets/BrokenUpRun10.png new file mode 100644 index 0000000..ffa822c Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun10.png differ diff --git a/templates/healthBar/assets/BrokenUpRun11.png b/templates/healthBar/assets/BrokenUpRun11.png new file mode 100644 index 0000000..4bb1cc5 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun11.png differ diff --git a/templates/healthBar/assets/BrokenUpRun12.png b/templates/healthBar/assets/BrokenUpRun12.png new file mode 100644 index 0000000..4bb1cc5 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun12.png differ diff --git a/templates/healthBar/assets/BrokenUpRun2.png b/templates/healthBar/assets/BrokenUpRun2.png new file mode 100644 index 0000000..dc265b3 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun2.png differ diff --git a/templates/healthBar/assets/BrokenUpRun3.png b/templates/healthBar/assets/BrokenUpRun3.png new file mode 100644 index 0000000..dc265b3 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun3.png differ diff --git a/templates/healthBar/assets/BrokenUpRun4.png b/templates/healthBar/assets/BrokenUpRun4.png new file mode 100644 index 0000000..bfd67ca Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun4.png differ diff --git a/templates/healthBar/assets/BrokenUpRun5.png b/templates/healthBar/assets/BrokenUpRun5.png new file mode 100644 index 0000000..6d0d466 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun5.png differ diff --git a/templates/healthBar/assets/BrokenUpRun6.png b/templates/healthBar/assets/BrokenUpRun6.png new file mode 100644 index 0000000..6d0d466 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun6.png differ diff --git a/templates/healthBar/assets/BrokenUpRun7.png b/templates/healthBar/assets/BrokenUpRun7.png new file mode 100644 index 0000000..63930bc Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun7.png differ diff --git a/templates/healthBar/assets/BrokenUpRun8.png b/templates/healthBar/assets/BrokenUpRun8.png new file mode 100644 index 0000000..8a5b1d7 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun8.png differ diff --git a/templates/healthBar/assets/BrokenUpRun9.png b/templates/healthBar/assets/BrokenUpRun9.png new file mode 100644 index 0000000..8a5b1d7 Binary files /dev/null and b/templates/healthBar/assets/BrokenUpRun9.png differ diff --git a/templates/healthBar/assets/Brown.png b/templates/healthBar/assets/Brown.png new file mode 100644 index 0000000..4925f71 Binary files /dev/null and b/templates/healthBar/assets/Brown.png differ diff --git a/templates/healthBar/assets/DeathSound.wav b/templates/healthBar/assets/DeathSound.wav new file mode 100644 index 0000000..3d613f1 Binary files /dev/null and b/templates/healthBar/assets/DeathSound.wav differ diff --git a/templates/healthBar/assets/Desappearing1.png b/templates/healthBar/assets/Desappearing1.png new file mode 100644 index 0000000..e421315 Binary files /dev/null and b/templates/healthBar/assets/Desappearing1.png differ diff --git a/templates/healthBar/assets/Desappearing2.png b/templates/healthBar/assets/Desappearing2.png new file mode 100644 index 0000000..1f1cf77 Binary files /dev/null and b/templates/healthBar/assets/Desappearing2.png differ diff --git a/templates/healthBar/assets/Desappearing3.png b/templates/healthBar/assets/Desappearing3.png new file mode 100644 index 0000000..11a808e Binary files /dev/null and b/templates/healthBar/assets/Desappearing3.png differ diff --git a/templates/healthBar/assets/Desappearing4.png b/templates/healthBar/assets/Desappearing4.png new file mode 100644 index 0000000..c13686e Binary files /dev/null and b/templates/healthBar/assets/Desappearing4.png differ diff --git a/templates/healthBar/assets/Desappearing5.png b/templates/healthBar/assets/Desappearing5.png new file mode 100644 index 0000000..6d45bd4 Binary files /dev/null and b/templates/healthBar/assets/Desappearing5.png differ diff --git a/templates/healthBar/assets/Desappearing6.png b/templates/healthBar/assets/Desappearing6.png new file mode 100644 index 0000000..13450ed Binary files /dev/null and b/templates/healthBar/assets/Desappearing6.png differ diff --git a/templates/healthBar/assets/Desappearing7.png b/templates/healthBar/assets/Desappearing7.png new file mode 100644 index 0000000..10397b3 Binary files /dev/null and b/templates/healthBar/assets/Desappearing7.png differ diff --git a/templates/healthBar/assets/Fall (32x32).png b/templates/healthBar/assets/Fall (32x32).png new file mode 100644 index 0000000..4af21e6 Binary files /dev/null and b/templates/healthBar/assets/Fall (32x32).png differ diff --git a/templates/healthBar/assets/Flat dark joystick border.png b/templates/healthBar/assets/Flat dark joystick border.png new file mode 100644 index 0000000..5ddd717 Binary files /dev/null and b/templates/healthBar/assets/Flat dark joystick border.png differ diff --git a/templates/healthBar/assets/Flat dark joystick thumb.png b/templates/healthBar/assets/Flat dark joystick thumb.png new file mode 100644 index 0000000..36f5262 Binary files /dev/null and b/templates/healthBar/assets/Flat dark joystick thumb.png differ diff --git a/templates/healthBar/assets/Hit1.png b/templates/healthBar/assets/Hit1.png new file mode 100644 index 0000000..2aea7e7 Binary files /dev/null and b/templates/healthBar/assets/Hit1.png differ diff --git a/templates/healthBar/assets/Hit2.png b/templates/healthBar/assets/Hit2.png new file mode 100644 index 0000000..2aea7e7 Binary files /dev/null and b/templates/healthBar/assets/Hit2.png differ diff --git a/templates/healthBar/assets/Hit3.png b/templates/healthBar/assets/Hit3.png new file mode 100644 index 0000000..bbfb00e Binary files /dev/null and b/templates/healthBar/assets/Hit3.png differ diff --git a/templates/healthBar/assets/Hit4.png b/templates/healthBar/assets/Hit4.png new file mode 100644 index 0000000..f106b83 Binary files /dev/null and b/templates/healthBar/assets/Hit4.png differ diff --git a/templates/healthBar/assets/Hit5.png b/templates/healthBar/assets/Hit5.png new file mode 100644 index 0000000..b2e9180 Binary files /dev/null and b/templates/healthBar/assets/Hit5.png differ diff --git a/templates/healthBar/assets/Hit6.png b/templates/healthBar/assets/Hit6.png new file mode 100644 index 0000000..f106b83 Binary files /dev/null and b/templates/healthBar/assets/Hit6.png differ diff --git a/templates/healthBar/assets/Hit7.png b/templates/healthBar/assets/Hit7.png new file mode 100644 index 0000000..ca260e4 Binary files /dev/null and b/templates/healthBar/assets/Hit7.png differ diff --git a/templates/healthBar/assets/Idle.png b/templates/healthBar/assets/Idle.png new file mode 100644 index 0000000..133f586 Binary files /dev/null and b/templates/healthBar/assets/Idle.png differ diff --git a/templates/healthBar/assets/Jump (32x32).png b/templates/healthBar/assets/Jump (32x32).png new file mode 100644 index 0000000..8417760 Binary files /dev/null and b/templates/healthBar/assets/Jump (32x32).png differ diff --git a/templates/healthBar/assets/Saw1.png b/templates/healthBar/assets/Saw1.png new file mode 100644 index 0000000..1a3c128 Binary files /dev/null and b/templates/healthBar/assets/Saw1.png differ diff --git a/templates/healthBar/assets/Saw2.png b/templates/healthBar/assets/Saw2.png new file mode 100644 index 0000000..6ec99a4 Binary files /dev/null and b/templates/healthBar/assets/Saw2.png differ diff --git a/templates/healthBar/assets/Saw3.png b/templates/healthBar/assets/Saw3.png new file mode 100644 index 0000000..0c9b80f Binary files /dev/null and b/templates/healthBar/assets/Saw3.png differ diff --git a/templates/healthBar/assets/Saw4.png b/templates/healthBar/assets/Saw4.png new file mode 100644 index 0000000..4f704ea Binary files /dev/null and b/templates/healthBar/assets/Saw4.png differ diff --git a/templates/healthBar/assets/Saw5.png b/templates/healthBar/assets/Saw5.png new file mode 100644 index 0000000..cc8c8b7 Binary files /dev/null and b/templates/healthBar/assets/Saw5.png differ diff --git a/templates/healthBar/assets/Saw6.png b/templates/healthBar/assets/Saw6.png new file mode 100644 index 0000000..e8c657e Binary files /dev/null and b/templates/healthBar/assets/Saw6.png differ diff --git a/templates/healthBar/assets/Saw7.png b/templates/healthBar/assets/Saw7.png new file mode 100644 index 0000000..8e40084 Binary files /dev/null and b/templates/healthBar/assets/Saw7.png differ diff --git a/templates/healthBar/assets/Saw8.png b/templates/healthBar/assets/Saw8.png new file mode 100644 index 0000000..9ceb91b Binary files /dev/null and b/templates/healthBar/assets/Saw8.png differ diff --git a/templates/healthBar/assets/SawHit.wav b/templates/healthBar/assets/SawHit.wav new file mode 100644 index 0000000..eb82347 Binary files /dev/null and b/templates/healthBar/assets/SawHit.wav differ diff --git a/templates/healthBar/assets/Tiled Floor Castle.png b/templates/healthBar/assets/Tiled Floor Castle.png new file mode 100644 index 0000000..7844c52 Binary files /dev/null and b/templates/healthBar/assets/Tiled Floor Castle.png differ diff --git a/templates/healthBar/assets/Top arrow button.png b/templates/healthBar/assets/Top arrow button.png new file mode 100644 index 0000000..7e5dc75 Binary files /dev/null and b/templates/healthBar/assets/Top arrow button.png differ diff --git a/templates/healthBar/assets/You Win.png b/templates/healthBar/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/healthBar/assets/You Win.png differ diff --git a/templates/healthBar/game.json b/templates/healthBar/game.json new file mode 100644 index 0000000..41aeedb --- /dev/null +++ b/templates/healthBar/game.json @@ -0,0 +1,28642 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 236, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.healthbartutorial", + "pixelsRounding": true, + "projectUuid": "5aaac4f4-df86-47fe-94e9-3d8b81cf3839", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "health-bar-tutorial", + "version": "1.0.0", + "name": "Health Bar Tutorial", + "description": "", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/BrokenUpIdle1.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpIdle2.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle2.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpIdle3.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpIdle4.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpIdle5.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle5.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpIdle6.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle6.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpIdle7.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle7.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpIdle8.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle8.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpIdle9.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle9.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpIdle10.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle10.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpIdle11.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpIdle11.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun1.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpRun2.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun3.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpRun4.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/BrokenUpRun5.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun5.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun6.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun6.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun7.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun7.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun8.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun8.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun9.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun9.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun10.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun10.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun11.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun11.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/BrokenUpRun12.png", + "kind": "image", + "metadata": "", + "name": "BrokenUpRun12.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Jump (32x32).png", + "kind": "image", + "metadata": "", + "name": "Jump (32x32).png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Fall (32x32).png", + "kind": "image", + "metadata": "", + "name": "Fall (32x32).png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/9patch castle.png", + "kind": "image", + "metadata": "", + "name": "9patch castle.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Hit1.png", + "kind": "image", + "metadata": "", + "name": "Hit1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Hit2.png", + "kind": "image", + "metadata": "", + "name": "Hit2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Hit3.png", + "kind": "image", + "metadata": "", + "name": "Hit3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Hit4.png", + "kind": "image", + "metadata": "", + "name": "Hit4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Hit5.png", + "kind": "image", + "metadata": "", + "name": "Hit5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Hit6.png", + "kind": "image", + "metadata": "", + "name": "Hit6.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Hit7.png", + "kind": "image", + "metadata": "", + "name": "Hit7.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Saw1.png", + "kind": "image", + "metadata": "", + "name": "Saw1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Saw2.png", + "kind": "image", + "metadata": "", + "name": "Saw2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Saw3.png", + "kind": "image", + "metadata": "", + "name": "Saw3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Saw4.png", + "kind": "image", + "metadata": "", + "name": "Saw4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Saw5.png", + "kind": "image", + "metadata": "", + "name": "Saw5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Saw6.png", + "kind": "image", + "metadata": "", + "name": "Saw6.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Saw7.png", + "kind": "image", + "metadata": "", + "name": "Saw7.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Saw8.png", + "kind": "image", + "metadata": "", + "name": "Saw8.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Idle.png", + "kind": "image", + "metadata": "", + "name": "Idle.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Brown.png", + "kind": "image", + "metadata": "", + "name": "Brown.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Desappearing1.png", + "kind": "image", + "metadata": "", + "name": "Desappearing1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Desappearing2.png", + "kind": "image", + "metadata": "", + "name": "Desappearing2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Desappearing3.png", + "kind": "image", + "metadata": "", + "name": "Desappearing3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Desappearing4.png", + "kind": "image", + "metadata": "", + "name": "Desappearing4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Desappearing5.png", + "kind": "image", + "metadata": "", + "name": "Desappearing5.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Desappearing6.png", + "kind": "image", + "metadata": "", + "name": "Desappearing6.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Desappearing7.png", + "kind": "image", + "metadata": "", + "name": "Desappearing7.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/DeathSound.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0.39660610023751985,\\\"sustain\\\":0,\\\"sustainPunch\\\":0,\\\"decay\\\":0.6499094024577599,\\\"tremoloDepth\\\":11,\\\"tremoloFrequency\\\":2.6256280856837515,\\\"frequency\\\":10000,\\\"frequencySweep\\\":-8400,\\\"frequencyDeltaSweep\\\":-1800,\\\"repeatFrequency\\\":3.4000000000000004,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":-15,\\\"frequencyJump2Onset\\\":85,\\\"frequencyJump2Amount\\\":5,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.52,\\\"waveform\\\":\\\"whitenoise\\\",\\\"interpolateNoise\\\":false,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":-5,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":-1,\\\"lowPassCutoff\\\":21100,\\\"lowPassCutoffSweep\\\":1300,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":600,\\\"compression\\\":1.3,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"DeathSound\"},\"localFilePath\":\"assets/DeathSound.wav\"}", + "name": "DeathSound", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/SawHit.wav", + "kind": "audio", + "metadata": "", + "name": "assets\\SawHit.wav", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Flat dark joystick border.png", + "kind": "image", + "metadata": "", + "name": "Flat dark joystick border.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/1db606cabd7372d1494ba5934bc25bcdd72f5a213c4a27509be57c3f4d5aecca_Flat dark joystick border.png", + "name": "Flat dark joystick border.png" + } + }, + { + "file": "assets/Flat dark joystick thumb.png", + "kind": "image", + "metadata": "", + "name": "Flat dark joystick thumb.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/10167ade22c4a6b48324e6c1d1bd6dc74179d7bed0775890903f418b4a05c8a1_Flat dark joystick thumb.png", + "name": "Flat dark joystick thumb.png" + } + }, + { + "file": "assets/Top arrow button.png", + "kind": "image", + "metadata": "", + "name": "Top arrow button.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Flat Dark/e3943e1b23ceb90f00fc5e7c0481c5147b983fdc5397fb3690e102e53ce72d4f_Top arrow button.png", + "name": "Top arrow button.png" + } + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": false, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "Level", + "name": "Level", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.622775034632561, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Traps", + "objects": [ + { + "name": "Trap" + }, + { + "name": "Trap2" + }, + { + "name": "Trap3" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 160, + "layer": "", + "name": "Ground_And_Walls", + "persistentUuid": "0dae8de6-9bdb-4464-86ce-95509c9d3d7b", + "width": 704, + "x": 320, + "y": 416, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Player", + "persistentUuid": "b32caa97-016d-46b8-9861-2780e11d26d0", + "width": 0, + "x": 672, + "y": 409, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 352, + "layer": "", + "name": "Ground_And_Walls", + "persistentUuid": "86597996-bf18-4631-815b-3b7906168845", + "width": 192, + "x": 832, + "y": 64, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 352, + "layer": "", + "name": "Ground_And_Walls", + "persistentUuid": "39caeb0a-7104-4d49-978b-f0fa4a62fb7f", + "width": 192, + "x": 320, + "y": 64, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap", + "persistentUuid": "d8cd3a2e-a3a5-481e-8766-0e866e79d8e7", + "width": 0, + "x": 513, + "y": 256, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap", + "persistentUuid": "5a467690-84ae-4dd9-9a73-8a8ece343d4b", + "width": 0, + "x": 831, + "y": 256, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap2", + "persistentUuid": "5db22c35-3b08-4286-8cd2-e921e3c7fb9b", + "width": 0, + "x": 632, + "y": 416, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap2", + "persistentUuid": "a6d1da2f-9c34-47bb-809b-dbac6180f557", + "width": 0, + "x": 616, + "y": 416, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap2", + "persistentUuid": "8699b211-0089-43af-9046-4a8bcfd4e253", + "width": 0, + "x": 712, + "y": 416, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap2", + "persistentUuid": "ff400d83-b7a4-4982-8ebd-c15c8bdc6495", + "width": 0, + "x": 728, + "y": 416, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 480, + "layer": "", + "name": "Background", + "persistentUuid": "5c5c842b-6db5-4fe7-865c-5ea66fce35e1", + "width": 704, + "x": 320, + "y": 64, + "zOrder": -10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trap3", + "persistentUuid": "e68dfee1-2780-477d-ae81-3e153e23e241", + "width": 0, + "x": 608, + "y": 320, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 160, + "layer": "Joysticks", + "name": "FlatDarkJoystick", + "persistentUuid": "6f189a9b-a19a-41f1-9f48-7f2ae4ab166e", + "width": 160, + "x": 144, + "y": 592, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 160, + "layer": "Joysticks", + "name": "TopArrowButton", + "persistentUuid": "5a47d484-7d61-4c51-b115-80ee688cf600", + "width": 160, + "x": 1088, + "y": 512, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Health", + "type": "Health::Health", + "Health": 3, + "CurrentHealth": 0, + "MaxHealth": 3, + "DamageCooldown": 0.5, + "IsHealthJustDamaged": false, + "HealthRegenRate": 0, + "HealthRegenDelay": 0, + "AllowOverHealing": false, + "HitAtLeastOnce": false, + "IsJustHealed": false, + "CurrentShieldPoints": 0, + "MaxShieldPoints": 0, + "ShieldDuration": 5, + "ShieldRegenRate": 0, + "BlockExcessDamage": false, + "ShieldRegenDelay": 0, + "IsShieldJustDamaged": false, + "ChanceToDodge": 0, + "DamageToBeApplied": 0, + "FlatDamageReduction": 0, + "PercentDamageReduction": 0, + "IsJustDodged": false, + "ShieldDamageTaken": 0, + "HealToBeApplied": 0 + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "EnableAnimationChanges": true, + "EnableHorizontalFlipping": true, + "IdleAnimationName": "idle", + "RunAnimationName": "run", + "JumpAnimationName": "jump", + "FallAnimationName": "fall", + "ClimbAnimationName": "climb", + "PlatformerBehavior": "PlatformerObject" + }, + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "Property": "PlatformerObject", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "JumpButton": "A" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "acceleration": 700, + "gravity": 500, + "jumpSpeed": 300, + "maxFallingSpeed": 350, + "maxSpeed": 125, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 1500, + "ignoreDefaultControls": false, + "jumpSustainTime": 0.2, + "ladderClimbingSpeed": 150, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + } + ], + "animations": [ + { + "name": "idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpIdle11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "BrokenUpRun12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Jump (32x32).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "fall", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Fall (32x32).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "hurt", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Hit1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Hit7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16, + "y": 25 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + }, + { + "name": "dead", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.15, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Desappearing1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Desappearing7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 47.62079833421518, + "y": 55.85234510695927 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 8, + "y": 10 + }, + { + "x": 25, + "y": 10 + }, + { + "x": 25, + "y": 32 + }, + { + "x": 8, + "y": 32 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 16, + "height": 48, + "leftMargin": 16, + "name": "Ground_And_Walls", + "rightMargin": 16, + "texture": "9patch castle.png", + "tiled": true, + "topMargin": 16, + "type": "PanelSpriteObject::PanelSprite", + "width": 48, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Trap", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "RectangleMovement", + "type": "RectangleMovement::RectangleMovement", + "Width": 0, + "Height": 100, + "Clockwise": true, + "HorizontalEdgeDuration": 1, + "VerticalEdgeDuration": 1, + "Left": 1, + "Top": 1, + "Progress": 1, + "OldX": 1, + "OldY": 1, + "Easing": "easeInOutCubic", + "InitialPosition": "Top-left corner", + "ToogleClockwise": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.05, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Saw1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Trap2", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Idle.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 7.5, + "y": 16 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 3, + "y": 9 + }, + { + "x": 12, + "y": 9 + }, + { + "x": 14, + "y": 16 + }, + { + "x": 1, + "y": 16 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Trap3", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "RectangleMovement", + "type": "RectangleMovement::RectangleMovement", + "Width": 128, + "Height": 0, + "Clockwise": true, + "HorizontalEdgeDuration": 1, + "VerticalEdgeDuration": 1, + "Left": 1, + "Top": 1, + "Progress": 1, + "OldX": 1, + "OldY": 1, + "Easing": "easeInOutCubic", + "InitialPosition": "Top-left corner", + "ToogleClockwise": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.05, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Saw1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Saw8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 19, + "y": 19 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 64, + "name": "Background", + "texture": "Brown.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 64, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "e71bd69f896d6c7531b48c65ceb5da25071d4fbdeb518aeceecba8d21f34ed8d", + "name": "FlatDarkJoystick", + "type": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "variant": "", + "variables": [], + "effects": [], + "behaviors": [], + "content": {}, + "childrenContent": { + "Border": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat dark joystick border.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + "Thumb": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat dark joystick thumb.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "9c727020616afdd6ba786b8af206a90481f07db0ca175ed6a4cc5b7e01c66d06", + "name": "TopArrowButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "A", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Top arrow button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Player" + }, + { + "objectName": "Ground_And_Walls" + }, + { + "objectName": "Trap" + }, + { + "objectName": "EndingDialog" + }, + { + "objectName": "Trap2" + }, + { + "objectName": "Trap3" + }, + { + "objectName": "Background" + }, + { + "objectName": "FlatDarkJoystick" + }, + { + "objectName": "TopArrowButton" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set up for health bar" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Player and camera management", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "2", + "", + "" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Background", + "", + "", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "HideLayer" + }, + "parameters": [ + "TopArrowButton", + "\"Joysticks\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Player", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Getting hit by the saw" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Player", + "Traps", + "", + "", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "AnimationName" + }, + "parameters": [ + "Player", + "\"hurt\"" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Player", + "Health", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Player", + "Health", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::Hit" + }, + "parameters": [ + "Player", + "Health", + "1", + "", + "", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsJustDamaged" + }, + "parameters": [ + "Player", + "Health", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "assets\\SawHit.wav", + "", + "100", + "1" + ] + }, + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"hurt\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Platformer behavior" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::AbortJump" + }, + "parameters": [ + "Player", + "PlatformerObject" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerObject", + "" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerCharacterAnimator", + "" + ] + }, + { + "type": { + "value": "AddForceAL" + }, + "parameters": [ + "Player", + "Traps.AngleToPosition(Player.X(), Player.Y())", + "40", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeTimeScale" + }, + "parameters": [ + "", + "0.1" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.02" + ] + }, + { + "type": { + "value": "ChangeTimeScale" + }, + "parameters": [ + "", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Return to normal" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimationName" + }, + "parameters": [ + "Player", + "\"hurt\"" + ] + }, + { + "type": { + "value": "AnimationEnded" + }, + "parameters": [ + "Player" + ] + }, + { + "type": { + "inverted": true, + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Player", + "Health", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Arreter" + }, + "parameters": [ + "Player" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerObject", + "yes" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerCharacterAnimator", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Death" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDead" + }, + "parameters": [ + "Player", + "Health", + "" + ] + }, + { + "type": { + "value": "AnimationName" + }, + "parameters": [ + "Player", + "\"hurt\"" + ] + }, + { + "type": { + "value": "AnimationEnded" + }, + "parameters": [ + "Player" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerObject", + "" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "PlatformerCharacterAnimator", + "" + ] + }, + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Player", + "\"dead\"" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "DeathSound", + "", + "50", + "1.2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "AnimationName" + }, + "parameters": [ + "Player", + "\"dead\"" + ] + }, + { + "type": { + "value": "AnimationEnded" + }, + "parameters": [ + "Player" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Player", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Not" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Layer" + }, + "parameters": [ + "FlatHeartBar", + "\"Interface\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Level\"", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Health::Health::Health" + }, + "parameters": [ + "Player", + "Health", + "<=", + "0", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "SceneInstancesCount(FlatHeartBar)", + ">=", + "1" + ] + }, + { + "type": { + "value": "Layer" + }, + "parameters": [ + "FlatHeartBar", + "\"Interface\"" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "\"Interface\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraCenterX(\"Interface\")", + "=", + "CameraCenterY(\"Interface\")" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 0, + "ambientLightColorG": 8947536, + "ambientLightColorR": 16, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 12194504, + "ambientLightColorG": 6068784, + "ambientLightColorR": 12709544, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Joysticks", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Interface", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Health", + "type": "Health::Health" + }, + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior" + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator" + }, + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior" + }, + { + "name": "RectangleMovement", + "type": "RectangleMovement::RectangleMovement" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.8.3", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual", + "platformer", + "platform", + "top-down" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [ + { + "name": "Controllers", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "Buttons", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "State", + "type": "string", + "value": "Idle" + } + ] + } + ] + }, + { + "name": "Joystick", + "type": "structure", + "children": [] + } + ] + } + ] + } + ], + "eventsFunctions": [ + { + "fullName": "Accelerated speed", + "functionType": "Expression", + "name": "AcceleratedSpeed", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "CurrentSpeed" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "<", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "-", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "+", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(0, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(0, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "clamp(AcceleratedSpeed, -SpeedMax, SpeedMax)" + ] + } + ] + } + ], + "variables": [ + { + "name": "AcceleratedSpeed", + "type": "number", + "value": 0 + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Current speed", + "name": "CurrentSpeed", + "type": "expression" + }, + { + "description": "Targeted speed", + "name": "TargetedSpeed", + "type": "expression" + }, + { + "description": "Max speed", + "name": "SpeedMax", + "type": "expression" + }, + { + "description": "Acceleration", + "name": "Acceleration", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "ButtonState" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone", + "=", + "DeadZoneRadius" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "", + "name": "Coucou", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the force of multitouch contoller stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier)) / (1 - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Stick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "XFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "YFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a new touch has started on the right or left side of the screen.", + "fullName": "New touch on a screen side", + "functionType": "Condition", + "group": "Multitouch Joystick", + "name": "HasTouchStartedOnScreenSide", + "sentence": "A new touch has started on the _PARAM2_ side of the screen on _PARAM1_'s layer", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + "<", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + ">=", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch joystick", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "objectList" + }, + { + "description": "Screen side", + "name": "Side", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "DeadZoneRadius", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, JoystickForce - DeadZoneRadius) / (1 - DeadZoneRadius)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickForce", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickForce", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "", + "name": "Parameter", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "JoystickAngle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickAngle", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickAngle", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ControllerIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ControllerIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "JoystickIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "JoystickIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DeadZoneRadius" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DeadZoneRadius", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Force the joystick into the pressing state.", + "fullName": "Force start pressing", + "functionType": "Action", + "name": "ForceStartPressing", + "sentence": "Force start pressing _PARAM0_ with touch identifier: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Touch identifier", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "False", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer())", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer())" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Radius", + ">", + "DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer()), TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer()))" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "ControllerIdentifier", + "ButtonIdentifier", + "ButtonState", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "hidden": true, + "name": "IsReleased" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Triggering circle radius", + "description": "This circle adds up to the object collision mask.", + "name": "Radius" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D platformer multitouch controller mapper", + "name": "Platformer3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SetForwardAngle" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "=", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier) + CameraAngle(Object.Layer())" + ] + }, + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "-90", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Platformer3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D shooter multitouch controller mapper", + "name": "Shooter3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control camera rotations with a multitouch controller.", + "fullName": "First person camera multitouch controller mapper", + "name": "FirstPersonMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "TODO It's probably a bad idea to rotate the object around Y." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedZ", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedZ, SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, CameraStick) * HorizontalRotationSpeedMax, HorizontalRotationSpeedMax, HorizontalRotationAcceleration, HorizontalRotationDeceleration)" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "CurrentRotationSpeedZ * TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedY", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedY, SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, CameraStick) * VerticalRotationSpeedMax, VerticalRotationSpeedMax, VerticalRotationAcceleration, VerticalRotationDeceleration)" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "+", + "CurrentRotationSpeedY * TimeDelta()" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "=", + "clamp(Object.Object3D::RotationY(), VerticalAngleMin, VerticalAngleMax)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper::LookFromObjectEyes" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera to look though _PARAM1_ eyes. The object must look to the right when all its angles are 0 and the top of its head be toward Z+.", + "fullName": "Look through object eyes", + "functionType": "Action", + "group": "Layers and cameras", + "name": "LookFromObjectEyes", + "private": true, + "sentence": "Move the camera to look though _PARAM0_ eyes", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Object", + "", + "Object.Layer()", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraZ" + }, + "parameters": [ + "", + "=", + "Object.Object3D::Z() + Object.Object3D::Depth() + OffsetZ", + "", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationX" + }, + "parameters": [ + "", + "=", + "- Object.Object3D::RotationY() + 90", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationY" + }, + "parameters": [ + "", + "=", + "Object.Object3D::RotationX()", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "SetCameraAngle" + }, + "parameters": [ + "", + "=", + "Object.Angle() + 90", + "Object.Layer()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum horizontal rotation speed of the object.", + "fullName": "Maximum horizontal rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationSpeedMax", + "sentence": "the maximum horizontal rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationSpeedMax", + "name": "SetHorizontalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation acceleration of the object.", + "fullName": "Horizontal rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationAcceleration", + "sentence": "the horizontal rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationAcceleration", + "name": "SetHorizontalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation deceleration of the object.", + "fullName": "Horizontal rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationDeceleration", + "sentence": "the horizontal rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationDeceleration", + "name": "SetHorizontalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical rotation speed of the object.", + "fullName": "Maximum vertical rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationSpeedMax", + "sentence": "the maximum vertical rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationSpeedMax", + "name": "SetVerticalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation acceleration of the object.", + "fullName": "Vertical rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationAcceleration", + "sentence": "the vertical rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationAcceleration", + "name": "SetVerticalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation deceleration of the object.", + "fullName": "Vertical rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationDeceleration", + "sentence": "the vertical rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationDeceleration", + "name": "SetVerticalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the minimum vertical camera angle of the object.", + "fullName": "Minimum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMin", + "sentence": "the minimum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMin" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMin", + "name": "SetVerticalAngleMin", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMin", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical camera angle of the object.", + "fullName": "Maximum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMax", + "sentence": "the maximum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMax", + "name": "SetVerticalAngleMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the z position offset of the object.", + "fullName": "Z position offset", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper position configuration", + "name": "OffsetZ", + "sentence": "the z position offset", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "OffsetZ" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetZ", + "name": "SetOffsetZ", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OffsetZ", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D capability", + "extraInformation": [ + "Scene3D::Base3DBehavior" + ], + "name": "Object3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Camera joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "CameraStick" + }, + { + "value": "180", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Horizontal rotation", + "name": "HorizontalRotationSpeedMax" + }, + { + "value": "360", + "type": "Number", + "label": "Rotation acceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationAcceleration" + }, + { + "value": "720", + "type": "Number", + "label": "Rotation deceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationDeceleration" + }, + { + "value": "120", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Vertical rotation", + "name": "VerticalRotationSpeedMax" + }, + { + "value": "240", + "type": "Number", + "label": "Rotation acceleration", + "group": "Vertical rotation", + "name": "VerticalRotationAcceleration" + }, + { + "value": "480", + "type": "Number", + "label": "Rotation deceleration", + "group": "Vertical rotation", + "name": "VerticalRotationDeceleration" + }, + { + "value": "-90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Minimum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMin" + }, + { + "value": "90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Maximum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMax" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Z position offset", + "group": "Position", + "name": "OffsetZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Z", + "hidden": true, + "name": "CurrentRotationSpeedZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Y", + "hidden": true, + "name": "CurrentRotationSpeedY" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics car with a multitouch controller.", + "fullName": "3D car multitouch controller mapper", + "name": "PhysicsCar3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SteerJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateSteeringStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, \"Primary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SpeedJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateAcceleratorStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "-SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, \"Secondary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "HandBrakeButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateHandBrakeKey" + }, + "parameters": [ + "Object", + "PhysicsCar3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PhysicsCar3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics car", + "extraInformation": [ + "Physics3D::PhysicsCar3D" + ], + "name": "PhysicsCar3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Steer joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SteerJoystickIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Speed joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SpeedJoystickIdentifier" + }, + { + "value": "B", + "type": "String", + "label": "Hand brake button name", + "group": "Controls", + "name": "HandBrakeButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "sign(SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsPressed" + }, + "parameters": [ + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "no", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "False", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "ControllerIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "DeadZoneRadius", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Show the joystick until it is released.", + "fullName": "Show and start pressing", + "functionType": "Action", + "name": "TeleportAndPress", + "sentence": "Show _PARAM0_ at the cursor position and start pressing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "Object.ParentTouchX(StartedTouchOrMouseId(0))", + "=", + "Object.ParentTouchY(StartedTouchOrMouseId(0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "yes", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::ForceStartPressing" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "StartedTouchOrMouseId(0)", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchX(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchY(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick is pressed.", + "fullName": "Stick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Stick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the strick force (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "ExpressionAndCondition", + "name": "StickForceX", + "sentence": "the stick X force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "ExpressionAndCondition", + "name": "StickForceY", + "sentence": "the stick Y force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (from -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the stick is pointing towards (from -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ParentOrigin" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ShouldBeHiddenWhenReleased" + } + ], + "variants": [] + } + ] + }, + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Platformer character animator", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTIzLDExYzIuMiwwLDQtMS44LDQtNHMtMS44LTQtNC00cy00LDEuOC00LDRTMjAuOCwxMSwyMywxMXoiLz4NCgk8cGF0aCBkPSJNMzAuOCwxMi40Yy0wLjMtMC40LTEtMC41LTEuNC0wLjJsLTIuOSwyLjNjLTAuOCwwLjctMiwwLjYtMi43LTAuMmwtNy45LTcuOWMtMS42LTEuNi00LjEtMS42LTUuNywwTDcuMyw5LjMNCgkJYy0wLjQsMC40LTAuNCwxLDAsMS40czEsMC40LDEuNCwwbDIuOC0yLjhjMC44LTAuOCwyLjEtMC44LDIuOSwwbDEuNiwxLjZMMTEuNiwxNGMtMSwxLTEuNCwyLjMtMS4xLDMuN2MwLjIsMS4xLDAuOSwyLDEuOCwyLjYNCgkJbC0xLjYsMS42Yy0wLjQsMC40LTEsMC40LTEuNCwwbC0zLjYtMy42Yy0wLjQtMC40LTEtMC40LTEuNCwwcy0wLjQsMSwwLDEuNGwzLjYsMy42YzAuNiwwLjYsMS4zLDAuOSwyLjEsMC45czEuNi0wLjMsMi4xLTAuOQ0KCQlsMi4xLTIuMWwyLjUsMWMwLjcsMC4zLDEuMiwxLDEuMiwxLjh2NmMwLDAuNiwwLjQsMSwxLDFzMS0wLjQsMS0xdi02YzAtMS42LTEtMy4xLTIuNS0zLjdsLTEuNy0wLjdsNS4yLTUuMmwxLjQsMS40DQoJCWMwLjgsMC44LDEuOCwxLjIsMi45LDEuMmMwLjksMCwxLjgtMC4zLDIuNS0wLjlsMi45LTIuM0MzMS4xLDEzLjQsMzEuMSwxMi44LDMwLjgsMTIuNHoiLz4NCjwvZz4NCjwvc3ZnPg0K", + "name": "PlatformerCharacterAnimator", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg", + "shortDescription": "Change animations and horizontal flipping of a platformer character automatically.", + "version": "1.2.0", + "description": [ + "Automatically change the animations and horizontal flipping of a platformer character based on movement and interaction with platform objects.", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer))." + ], + "origin": { + "identifier": "PlatformerCharacterAnimator", + "name": "gdevelop-extension-store" + }, + "tags": [ + "animation", + "platformer", + "platform", + "flip" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Change animations and horizontal flipping of a platformer character automatically.", + "fullName": "Platformer character animator", + "name": "PlatformerCharacterAnimator", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalFlipping", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableAnimationChanges", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "JumpAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FallAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "RunAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "ClimbAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onActivate", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableHorizontalFlipping", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "EnableAnimationChanges", + "True", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "JumpAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FallAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "RunAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "ClimbAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated animation changes a platformer character. Disabling animation changes is useful to play custom animations.", + "fullName": "Enable (or disable) automated animation changes", + "functionType": "Action", + "name": "EnableChangingAnimations", + "sentence": "Enable automated animation changes on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "EnableAnimationChanges", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "EnableAnimationChanges", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Change animations automatically", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated horizontal flipping of a platform character.", + "fullName": "Enable (or disable) automated horizontal flipping", + "functionType": "Action", + "name": "EnableHorizontalFlipping", + "sentence": "Enable automated horizontal flipping on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "EnableHorizontalFlipping", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "EnableHorizontalFlipping", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable horizontal flipping", + "name": "Value", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Idle\" animation name. Do not use quotation marks.", + "fullName": "\"Idle\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetIdleAnimationName", + "sentence": "Set \"Idle\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Move\" animation name. Do not use quotation marks.", + "fullName": "\"Move\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetMoveAnimationName", + "sentence": "Set \"Move\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "RunAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Jump\" animation name. Do not use quotation marks.", + "fullName": "\"Jump\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetJumpAnimationName", + "sentence": "Set \"Jump\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "JumpAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Fall\" animation name. Do not use quotation marks.", + "fullName": "\"Fall\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetFallAnimationName", + "sentence": "Set \"Fall\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FallAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Climb\" animation name. Do not use quotation marks.", + "fullName": "\"Climb\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetClimbAnimationName", + "sentence": "Set \"Climb\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "ClimbAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Enable animation changes", + "name": "EnableAnimationChanges" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable horizontal flipping", + "name": "EnableHorizontalFlipping" + }, + { + "value": "Idle", + "type": "String", + "label": "\"Idle\" animation name ", + "group": "Animation names", + "name": "IdleAnimationName" + }, + { + "value": "Run", + "type": "String", + "label": "\"Run\" animation name", + "group": "Animation names", + "name": "RunAnimationName" + }, + { + "value": "Jump", + "type": "String", + "label": "\"Jump\" animation name", + "group": "Animation names", + "name": "JumpAnimationName" + }, + { + "value": "Fall", + "type": "String", + "label": "\"Fall\" animation name", + "group": "Animation names", + "name": "FallAnimationName" + }, + { + "value": "Climb", + "type": "String", + "label": "\"Climb\" animation name", + "group": "Animation names", + "name": "ClimbAnimationName" + }, + { + "value": "", + "type": "Behavior", + "label": "Platformer character", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerBehavior" + }, + { + "value": "", + "type": "Behavior", + "label": "Animatable capacity", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Flippable capacity", + "extraInformation": [ + "FlippableCapability::FlippableBehavior" + ], + "name": "Flippable" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian", + "category": "Game mechanic", + "extensionNamespace": "", + "fullName": "Health points and damage", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWhlYXJ0LWhhbGYtZnVsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDVDMTUsNSAxMy41OCw1LjkxIDEzLDcuMlYxNy43NEMxNy4yNSwxMy44NyAyMCwxMS4yIDIwLDguNUMyMCw2LjUgMTguNSw1IDE2LjUsNU0xNi41LDNDMTkuNTgsMyAyMiw1LjQxIDIyLDguNUMyMiwxMi4yNyAxOC42LDE1LjM2IDEzLjQ1LDIwLjAzTDEyLDIxLjM1TDEwLjU1LDIwLjAzQzUuNCwxNS4zNiAyLDEyLjI3IDIsOC41QzIsNS40MSA0LjQyLDMgNy41LDNDOS4yNCwzIDEwLjkxLDMuODEgMTIsNS4wOEMxMy4wOSwzLjgxIDE0Ljc2LDMgMTYuNSwzWiIgLz48L3N2Zz4=", + "name": "Health", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/heart-half-full.svg", + "shortDescription": "Manage health (life) points, shield and armor.", + "version": "0.4.0", + "description": [ + "Manage health (life) points, shield and armor. ", + "", + "It handles:", + "- Damage cooldown", + "- Health and shield regeneration", + "- Over healing", + "", + "It can be used on:", + "- Players", + "- Enemies", + "- NPCs", + "- Inanimate objects (for insance breakable doors or mining rocks)", + "", + "The top-down RPG example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://top-down-rpg))." + ], + "origin": { + "identifier": "Health", + "name": "gdevelop-extension-store" + }, + "tags": [ + "health", + "life", + "damage", + "hit", + "heal", + "shield", + "regeneration", + "armor" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "xpwUwByyImTDcHEqDUqfyg0oRBt1", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Manage health (life) points, shield and armor.", + "fullName": "Health", + "name": "Health", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + }, + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Health", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "HealthRegenRate", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + "<", + "Object.Behavior::MaxHealth()" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "HealthRegenDelay" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "+", + "HealthRegenRate * TimeDelta()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "MaxHealth" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset triggers", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "False", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "False", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "False", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "Shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Regeneration", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Shield" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldRegenRate", + "!=", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "<", + "MaxShieldPoints" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + ">", + "ShieldRegenDelay" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "+", + "ShieldRegenRate * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Correct any values above maximum limits" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + ">", + "MaxShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "MaxShieldPoints" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Remove shield points if shield expired", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Reset damage trigger", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "False", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Apply damage to the object. Shield and armor can reduce this damage if enabled.", + "fullName": "Apply damage to an object", + "functionType": "Action", + "group": "Health", + "name": "Hit", + "sentence": "Apply _PARAM2_ points of damage to _PARAM0_ (Damage can be reduced by Shield: _PARAM3_, Armor: _PARAM4_)", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Incoming damage", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Only consider incoming damage when damage cooldown is not active" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "DamageValue" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Chance to dodge", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "No damage will be applied when dodged" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "RandomFloatInRange(0,1)", + "<", + "ChanceToDodge" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "True", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Damage reduction from Armor", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "UseArmor", + "True", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flat damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "max(0,DamageToBeApplied - FlatDamageReduction)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Percent damage reduction", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "PercentDamageReduction", + ">", + "0" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "*", + "1 - min(1, PercentDamageReduction)" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to shield", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If shield is active, damage the shield first" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "UseShield", + "True", + "" + ] + }, + { + "type": { + "value": "Health::Health::IsShieldActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "True", + "" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is less than shield, subtract damage from shield." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "<=", + "CurrentShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "-", + "DamageToBeApplied" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDamageTaken", + "=", + "DamageToBeApplied" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If damage is greater than shield, conditionally apply excess damage based on property" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "CurrentShieldPoints" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDamageTaken", + "=", + "CurrentShieldPoints" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Apply excess damage only if shield does not block excess damage" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + "-", + "CurrentShieldPoints" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply damage to health", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageToBeApplied", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetJustDamaged" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + }, + { + "type": { + "value": "Health::Health::TriggerDamageCooldown" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetCurrentHealth" + }, + "parameters": [ + "Object", + "Behavior", + "CurrentHealth - DamageToBeApplied", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points of damage", + "name": "DamageValue", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Shield can reduce damage taken", + "name": "UseShield", + "optional": true, + "type": "yesorno" + }, + { + "defaultValue": "yes", + "description": "Armor can reduce damage taken", + "name": "UseArmor", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "current health points of the object.", + "fullName": "Health points", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "Health", + "sentence": "health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentHealth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the health points of the object. Will not trigger damage cooldown.", + "fullName": "Change health points", + "functionType": "Action", + "group": "Health", + "name": "SetHealth", + "sentence": "Change the health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If MaxHealth is set, prevent health from going above it" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "min(CurrentHealth, MaxHealth)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the health points of the object. Will not trigger damage cooldown.", + "fullName": "Change health points (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCurrentHealth", + "private": true, + "sentence": "Change the health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealth" + }, + "parameters": [ + "Object", + "Behavior", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "New health value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Heal the object by increasing its health points.", + "fullName": "Heal object", + "functionType": "Action", + "group": "Health", + "name": "Heal", + "sentence": "Heal _PARAM0_ with _PARAM2_ health points", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Heal", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is not set, do not enforce Max Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealToBeApplied", + "=", + "HealValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If Max Health is set and Overhealing is not allowed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxHealth", + ">", + "0" + ] + }, + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealToBeApplied", + "=", + "min(HealValue,MaxHealth - CurrentHealth)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perform heal" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "+", + "HealToBeApplied" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update healing trigger" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Points to heal (will be added to object health)", + "name": "HealValue", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum health points of the object.", + "fullName": "Maximum health points", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "MaxHealth", + "sentence": "the maximum health points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxHealth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxHealth", + "name": "SetMaxHealthOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxHealth", + "=", + "Value" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure Current Health does not exceed new Max Health" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + ">", + "Object.Behavior::MaxHealth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentHealth", + "=", + "Object.Behavior::MaxHealth()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the object maximum health points.", + "fullName": "Maximum health points (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetMaxHealth", + "private": true, + "sentence": "Change the maximum health of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxHealthOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum health", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the rate of health regeneration (points per second).", + "fullName": "Rate of health regeneration", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "HealthRegenRate", + "sentence": "the rate of health regeneration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealthRegenRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HealthRegenRate", + "name": "SetHealthRegenRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealthRegenRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the rate of health regeneration.", + "fullName": "Rate of health regeneration (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenRate", + "private": true, + "sentence": "Change the rate of health regen of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealthRegenRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Rate of regen", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the duration of damage cooldown (seconds).", + "fullName": "Damage cooldown", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "DamageCooldownDuration", + "sentence": "the duration of damage cooldown", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DamageCooldown" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DamageCooldownDuration", + "name": "SetCooldownDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DamageCooldown", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the duration of damage cooldown (seconds).", + "fullName": "Damage cooldown (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetCooldownDuration", + "private": true, + "sentence": "Change the duration of damage cooldown on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetCooldownDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Duration of damage cooldown (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the delay before health regeneration starts after last being hit (seconds).", + "fullName": "Health regeneration delay", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "HealthRegenDelay", + "sentence": "the health regeneration delay", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealthRegenDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HealthRegenDelay", + "name": "SetHealthRegenDelayOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HealthRegenDelay", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the delay before health regeneration starts after being hit.", + "fullName": "Health regeneration delay (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHealthRegenDelay", + "private": true, + "sentence": "Change the health regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetHealthRegenDelayOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the chance to dodge incoming damage (range: 0 to 1).", + "fullName": "Dodge chance", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "ChanceToDodge", + "sentence": "the chance to dodge incoming damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ChanceToDodge" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ChanceToDodge", + "name": "SetChanceToDodgeOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ChanceToDodge", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Chance to dodge (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the chance to dodge incoming damage.", + "fullName": "Chance to dodge incoming damage (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetChanceToDodge", + "private": true, + "sentence": "Change the chance to dodge on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetChanceToDodgeOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Chance to dodge (Range: 0 to 1)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the flat damage reduction from the armor. Incoming damage is reduced by this value.", + "fullName": "Armor flat damage reduction", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "FlatDamageReduction", + "sentence": "the armor flat damage reduction", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FlatDamageReduction" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FlatDamageReduction", + "name": "SetFlatDamageReductionOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FlatDamageReduction", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Flat reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the flat damage reduction from armor. Incoming damage is reduced by this value.", + "fullName": "Flat damage reduction from armor (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetFlatDamageReduction", + "private": true, + "sentence": "Change the flat damage reduction from armor on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetFlatDamageReductionOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Flat reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the percent damage reduction from armor (range: 0 to 1).", + "fullName": "Armor percent damage reduction", + "functionType": "ExpressionAndCondition", + "group": "Health configuration", + "name": "PercentDamageReduction", + "sentence": "the armor percent damage reduction", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PercentDamageReduction" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PercentDamageReduction", + "name": "SetPercentDamageReductionOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PercentDamageReduction", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Percent damage reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percent damage reduction from armor. Range: 0 to 1.", + "fullName": "Percent damage reduction from armor (deprecated)", + "functionType": "Action", + "group": "Health configuration", + "name": "SetPercentDamageReduction", + "private": true, + "sentence": "Change the percent damage reduction from armor on _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetPercentDamageReductionOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Percent damage reduction from armor", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Allow heals to increase health above max health. Regeneration will not exceed max health.", + "fullName": "Allow over-healing", + "functionType": "Action", + "group": "Health configuration", + "name": "AllowOverHealing", + "sentence": "Allow over-healing on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "AllowOverHealing", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Allow over-healing", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as hit at least once.", + "fullName": "Mark object as hit at least once", + "functionType": "Action", + "group": "Health configuration", + "name": "SetHitAtLeastOnce", + "private": true, + "sentence": "Mark _PARAM0_ as hit at least once: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Hit at least once", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Mark object as just damaged.", + "fullName": "Mark object as just damaged", + "functionType": "Action", + "group": "Health configuration", + "name": "SetJustDamaged", + "private": true, + "sentence": "Mark _PARAM0_ as just damaged: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Just damaged", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Trigger damage cooldown.", + "fullName": "Trigger damage cooldown", + "functionType": "Action", + "group": "Health", + "name": "TriggerDamageCooldown", + "sentence": "Trigger the damage cooldown on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Mark that the object was hit at least once (used for initial state of damage cooldown)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Health::Health::HitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::SetHitAtLeastOnce" + }, + "parameters": [ + "Object", + "Behavior", + "yes", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object has been hit at least once.", + "fullName": "Object has been hit at least once", + "functionType": "Condition", + "group": "Health", + "name": "HitAtLeastOnce", + "private": true, + "sentence": "_PARAM0_ has been hit at least once", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This condition is used to prevent \"damage cooldown\" from being active when the game starts." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if health was just damaged previously in the events.", + "fullName": "Is health just damaged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDamaged", + "sentence": "Health has just been damaged on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsHealthJustDamaged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object was just healed previously in the events.", + "fullName": "Is just healed", + "functionType": "Condition", + "group": "Health", + "name": "IsJustHealed", + "sentence": "_PARAM0_ has just been healed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsJustHealed", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if damage cooldown is active. Object and shield cannot be damaged while this is active.", + "fullName": "Is damage cooldown active", + "functionType": "Condition", + "group": "Health", + "name": "IsDamageCooldownActive", + "sentence": "Damage cooldown on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "HitAtLeastOnce", + "True", + "" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "DamageCooldown", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.TimeSinceLastHit\"", + "<", + "DamageCooldown" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time before damage cooldown ends (seconds).", + "fullName": "Time remaining in damage cooldown", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "DamageCooldownRemaining", + "sentence": "the time before damage cooldown end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Health::Health::IsDamageCooldownActive" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,DamageCooldown - Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is considered dead (no health points).", + "fullName": "Is dead", + "functionType": "Condition", + "group": "Health", + "name": "IsDead", + "sentence": "_PARAM0_ is dead", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentHealth", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time since last taken hit (seconds).", + "fullName": "Time since last hit", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "TimeSinceLastHit", + "sentence": "the time since last taken hit on health", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.ObjectTimerElapsedTime(\"__Health.TimeSinceLastHit\")" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the health damage taken from most recent hit.", + "fullName": "Health damage taken from most recent hit", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "PreviousDamageTaken", + "sentence": "the health damage taken from most recent hit", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DamageToBeApplied" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum shield points of the object.", + "fullName": "Maximum shield points", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "MaxShield", + "sentence": "the maximum shield points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxShieldPoints" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxShield", + "name": "SetMaxShieldOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxShieldPoints", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the maximum shield points of the object.", + "fullName": "Maximum shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShield", + "private": true, + "sentence": "Change the maximum shield of _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxShieldOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Maximum shield", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change maximum shield points.", + "fullName": "Max shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetMaxShieldPoints", + "private": true, + "sentence": "Change the maximum shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetMaxShieldOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the current shield points of the object.", + "fullName": "Shield points", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "ShieldPoints", + "sentence": "the shield points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentShieldPoints" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldPoints", + "name": "SetShieldPointsOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change current shield points. Will not trigger damage cooldown.", + "fullName": "Shield points (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldPoints", + "private": true, + "sentence": "Change current shield points on _PARAM0_ to _PARAM2_ points", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldPointsOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the rate of shield regeneration (points per second).", + "fullName": "Rate of shield regeneration", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldRegenRate", + "sentence": "the rate of shield regeneration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldRegenRate" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldRegenRate", + "name": "SetShieldRegenRateOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldRegenRate", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration rate (points per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change rate of shield regeneration.", + "fullName": "Shield regeneration rate (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenRate", + "private": true, + "sentence": "Change the shield regeneration rate of _PARAM0_ to _PARAM2_ points per second", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldRegenRateOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration rate (points per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the delay before shield regeneration starts after being hit (seconds).", + "fullName": "Shield regeneration delay", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldRegenDelay", + "sentence": "the shield regeneration delay", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldRegenDelay" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldRegenDelay", + "name": "SetShieldRegenDelayOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldRegenDelay", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change delay before shield regeneration starts after being hit.", + "fullName": "Shield regeneration delay (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldRegenDelay", + "private": true, + "sentence": "Change the shield regeneration delay on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldRegenDelayOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Regeneration delay (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the duration of the shield (seconds). A value of \"0\" means the shield is permanent.", + "fullName": "Duration of shield", + "functionType": "ExpressionAndCondition", + "group": "Shield configuration", + "name": "ShieldDuration", + "sentence": "the duration of the shield", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ShieldDuration", + "name": "SetShieldDurationOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ShieldDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change duration of shield. Use \"0\" to make shield permanent.", + "fullName": "Duration of shield (deprecated)", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldDuration", + "private": true, + "sentence": "Change the duration of shield on _PARAM0_ to _PARAM2_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Health::Health::SetShieldDurationOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield duration (seconds)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Renew shield duration to it's full value.", + "fullName": "Renew shield duration", + "functionType": "Action", + "group": "Shield", + "name": "RenewShieldDuration", + "sentence": "Renew the shield duration on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Activate the shield by setting the shield points and renewing the shield duration (optional).", + "fullName": "Activate shield", + "functionType": "Action", + "group": "Shield", + "name": "ActivateShield", + "sentence": "Activate the shield on _PARAM0_ with _PARAM2_ points (Renew shield duration: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "ShieldPoints" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "MaxShieldPoints", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + "=", + "min(ShieldPoints,Object.Behavior::MaxShield())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "RenewShieldDuration", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Health::Health::RenewShieldDuration" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Shield points", + "name": "ShieldPoints", + "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Renew shield duration", + "name": "RenewShieldDuration", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) blocking excess damage when shield breaks.", + "fullName": "Block excess damage when shield breaks", + "functionType": "Action", + "group": "Shield configuration", + "name": "SetShieldBlockExcessDamage", + "sentence": "Shield on _PARAM0_ blocks excess damage when it breaks: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "BlockExcessDamage", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + }, + { + "description": "Block excess damage", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield was just damaged previously in the events.", + "fullName": "Is shield just damaged", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldJustDamaged", + "sentence": "Shield on _PARAM0_ has just been damaged", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsShieldJustDamaged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if incoming damage was just dodged.", + "fullName": "Damage was just dodged", + "functionType": "Condition", + "group": "Health", + "name": "IsJustDodged", + "sentence": "_PARAM0_ just dodged incoming damage", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsJustDodged", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the shield is active (based on shield points and duration).", + "fullName": "Is shield active", + "functionType": "Condition", + "group": "Shield", + "name": "IsShieldActive", + "sentence": "Shield on _PARAM0_ is active", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "To be considered \"active\", a shield must have positive points AND not exceed duration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentShieldPoints", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't check the timer when duration is zero (or negative)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + ">", + "0" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__Health.ShieldDuration\"", + "<", + "ShieldDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the time before the shield duration ends (seconds).", + "fullName": "Time before shield duration ends", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "ShieldTimeRemaining", + "sentence": "the time before the shield duration end", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "ShieldDuration", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0,ShieldDuration - Object.ObjectTimerElapsedTime(\"__Health.ShieldDuration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the shield damage taken from most recent hit.", + "fullName": "Shield damage taken from most recent hit", + "functionType": "ExpressionAndCondition", + "group": "Shield", + "name": "PreviousDamageToShield", + "sentence": "the shield damage taken from most recent hit", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ShieldDamageTaken" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the health points gained from previous heal.", + "fullName": "Health points gained from previous heal", + "functionType": "ExpressionAndCondition", + "group": "Health", + "name": "PreviousHealAmount", + "sentence": "the health points gained from previous heal", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HealToBeApplied" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "Health::Health", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "label": "Starting health", + "group": "Health", + "name": "Health" + }, + { + "value": "0", + "type": "Number", + "label": "Current health (life) points", + "group": "Health", + "hidden": true, + "name": "CurrentHealth" + }, + { + "value": "100", + "type": "Number", + "label": "Maximum health", + "description": "Use 0 for no maximum.", + "group": "Health", + "name": "MaxHealth" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Damage cooldown", + "group": "Health", + "name": "DamageCooldown" + }, + { + "value": "", + "type": "Boolean", + "label": "Allow heals to increase health above max health (regen will never exceed max health)", + "group": "Health", + "advanced": true, + "name": "AllowOverHealing" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "IsHealthJustDamaged" + }, + { + "value": "0", + "type": "Number", + "label": "Damage to health from the previous incoming damage", + "group": "Health", + "hidden": true, + "name": "DamageToBeApplied" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "HitAtLeastOnce" + }, + { + "value": "0", + "type": "Number", + "label": "Chance to dodge incoming damage (between 0 and 1)", + "description": "When a damage is dodged, no damage is applied.", + "group": "Health", + "advanced": true, + "name": "ChanceToDodge" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Health", + "hidden": true, + "name": "IsJustDodged" + }, + { + "value": "0", + "type": "Number", + "label": "Health points gained from the previous heal", + "group": "Health", + "hidden": true, + "name": "HealToBeApplied" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of health regeneration (points per second)", + "group": "Health regeneration", + "advanced": true, + "name": "HealthRegenRate" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Health regeneration delay ", + "description": "Delay before health regeneration starts after a hit.", + "group": "Health regeneration", + "advanced": true, + "name": "HealthRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "IsJustHealed" + }, + { + "value": "", + "type": "Number", + "label": "Current shield points", + "group": "Shield", + "hidden": true, + "name": "CurrentShieldPoints" + }, + { + "value": "0", + "type": "Number", + "label": "Maximum shield", + "description": "Leave 0 for unlimited.", + "group": "Shield", + "advanced": true, + "name": "MaxShieldPoints" + }, + { + "value": "5", + "type": "Number", + "unit": "Second", + "label": "Duration of shield", + "description": "Use 0 to make the shield permanent.", + "group": "Shield", + "advanced": true, + "name": "ShieldDuration" + }, + { + "value": "0", + "type": "Number", + "label": "Rate of shield regeneration (points per second)", + "group": "Shield regeneration", + "advanced": true, + "name": "ShieldRegenRate" + }, + { + "value": "", + "type": "Boolean", + "label": "Block excess damage when shield is broken", + "group": "Shield", + "advanced": true, + "name": "BlockExcessDamage" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Shield regeneration delay", + "description": "Delay before shield regeneration starts after a hit.", + "group": "Shield regeneration", + "advanced": true, + "name": "ShieldRegenDelay" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "group": "Shield", + "hidden": true, + "name": "IsShieldJustDamaged" + }, + { + "value": "", + "type": "Number", + "label": "Damage to shield from the previous incoming damage", + "group": "Shield", + "hidden": true, + "name": "ShieldDamageTaken" + }, + { + "value": "0", + "type": "Number", + "label": "Flat damage reduction from armor", + "description": "Incoming damages are reduced by this value.", + "group": "Armor", + "advanced": true, + "name": "FlatDamageReduction" + }, + { + "value": "0", + "type": "Number", + "label": "Percentage damage reduction from armor (between 0 and 1)", + "group": "Armor", + "advanced": true, + "name": "PercentDamageReduction" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian, Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Rectangular movement", + "gdevelopVersion": ">=5.5.222", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNoYXBlLXJlY3RhbmdsZS1wbHVzIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5LDZIMjJWOEgxOVYxMUgxN1Y4SDE0VjZIMTdWM0gxOVY2TTE3LDE3VjE0SDE5VjE5SDNWNkgxMVY4SDVWMTdIMTdaIiAvPjwvc3ZnPg==", + "name": "RectangleMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/shape-rectangle-plus.svg", + "shortDescription": "Move objects in a rectangular pattern.", + "version": "1.3.0", + "description": [ + "Move objects in a rectangular pattern with easing functions from the Tween extension.", + "", + "It can be used for:", + "", + "- Moveable platforms", + "- Enemy movement patterns", + "- Moving along the border of another object (inside, center, outside)", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer)).", + "", + "This game shows how to make objects move around the border of another object ([open the project online](https://editor.gdevelop.io/?project=example://moving-saw-platformer)).", + "", + "This example can be used to test different settings ([open the project online](https://editor.gdevelop.io/?project=example://rectangular-movement)).", + "" + ], + "origin": { + "identifier": "RectangleMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "rectangular", + "movement", + "rectangle", + "patrol", + "platform", + "enemy" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Distance from an object to the closest edge of a second object.", + "fullName": "Distance from an object to the closest edge of a second object", + "functionType": "Expression", + "name": "DistanceToClosestEdge", + "private": true, + "sentence": "Distance from _PARAM1_ to the closest edge of _PARAM2_ ", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If point is inside rectangle, just use min distance" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + ">=", + "CenterObject.BoundingBoxLeft()" + ] + }, + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + "<=", + "CenterObject.BoundingBoxRight()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + ">=", + "CenterObject.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + "<=", + "CenterObject.BoundingBoxBottom()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "min(\nmin(\nMovingObject.BoundingBoxCenterY() - CenterObject.BoundingBoxTop(), \nCenterObject.BoundingBoxBottom() - MovingObject.BoundingBoxCenterY()),\nmin(\nMovingObject.BoundingBoxCenterX() - CenterObject.BoundingBoxLeft(), \nCenterObject.BoundingBoxRight() - MovingObject.BoundingBoxCenterX())\n)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If point is outside rectangle, find distance to clamped position on rectangle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + "<", + "CenterObject.BoundingBoxLeft()" + ] + }, + { + "type": { + "value": "CenterX" + }, + "parameters": [ + "MovingObject", + ">", + "CenterObject.BoundingBoxRight()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + "<", + "CenterObject.BoundingBoxTop()" + ] + }, + { + "type": { + "value": "CenterY" + }, + "parameters": [ + "MovingObject", + ">", + "CenterObject.BoundingBoxBottom()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DistanceBetweenPositions(\nMovingObject.BoundingBoxCenterX(),\nMovingObject.BoundingBoxCenterY(),\nclamp(MovingObject.BoundingBoxCenterX(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxRight()),\nclamp(MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxTop(), CenterObject.BoundingBoxBottom())\n)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + }, + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Update rectangular movement to follow the border of an object. Run once, or every time the center object moves.", + "fullName": "Update rectangular movement to follow the border of an object", + "functionType": "Action", + "name": "MoveAlongBorderOfObject", + "sentence": "Update rectangular movement of _PARAM1_ to follow the border of _PARAM3_. Position on border: _PARAM4_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create object link (if one has not been created)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Set a valid initial value by picking any Center object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "MovingObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.DistanceToClosestEdge", + "=", + "RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject)" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update value if distance is lower than existing minimum", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.DistanceToClosestEdge", + "=", + "min(MovingObject.Variable(__RectangleMovement.DistanceToClosestEdge), RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject))" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Link objects that have the closest distance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Link the MovingObject that has the shortest distance (and don't create more links even if another object has the same distance)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "RectangleMovement::DistanceToClosestEdge(CenterObject, MovingObject)", + "=", + "MovingObject.Variable(__RectangleMovement.DistanceToClosestEdge)" + ] + } + ], + "actions": [ + { + "type": { + "value": "LinkedObjects::LinkObjects" + }, + "parameters": [ + "", + "MovingObject", + "CenterObject" + ] + }, + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "True" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update rectangular movement to follow the border of object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "CenterObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "MovingObject", + "CenterObject", + "" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Inside (default)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"Inside\"" + ] + }, + { + "type": { + "value": "CompareArgumentAsString" + }, + "parameters": [ + "\"PositionOnBorder\"", + "=", + "\"\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom() - MovingObject.Height()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight() - MovingObject.Width()", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Center", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PositionOnBorder", + "=", + "\"Center\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop() - MovingObject.Height()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom() - MovingObject.Height()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft() - MovingObject.Width()/2", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight() - MovingObject.Width()/2", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Outside", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PositionOnBorder", + "=", + "\"Outside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetTop" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxTop() - MovingObject.Height()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetBottom" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxBottom()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetLeft" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxLeft() - MovingObject.Width()", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::SetRight" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "CenterObject.BoundingBoxRight()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + }, + { + "description": "Rectangle Movement (required)", + "name": "RectangleMovement", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + }, + { + "description": "Position on border", + "name": "PositionOnBorder", + "supplementaryInformation": "[\"Inside\",\"Center\",\"Outside\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Move to the nearest corner of the center object.", + "fullName": "Move to the nearest corner of the center object", + "functionType": "Action", + "name": "MoveToNearestCorner", + "sentence": "Move _PARAM1_ to the nearest corner of _PARAM3_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Create a link to the closest object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.Linked", + "False" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangleMovement::MoveAlongBorderOfObject" + }, + "parameters": [ + "", + "MovingObject", + "RectangleMovement", + "CenterObject", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move to nearest corner", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "MovingObject", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LinkedObjects::PickObjectsLinkedTo" + }, + "parameters": [ + "", + "CenterObject", + "MovingObject", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to TopLeft (don't use a condition on the first check so the variable starts with a valid corner)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxTop())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Top-left corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to TopRight" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxTop())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxTop())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Top-right corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to BottomLeft" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxBottom())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxLeft(), CenterObject.BoundingBoxBottom())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Bottom-left corner\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Distance to BottomRight" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxBottom())", + "<", + "MovingObject.Variable(__RectangleMovement.ClosestCornerDistance)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "MovingObject", + "__RectangleMovement.ClosestCornerDistance", + "=", + "DistanceBetweenPositions(MovingObject.BoundingBoxCenterX(), MovingObject.BoundingBoxCenterY(), CenterObject.BoundingBoxRight(), CenterObject.BoundingBoxBottom())" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::TeleportToCorner" + }, + "parameters": [ + "MovingObject", + "RectangleMovement", + "\"Bottom-right corner\"", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Moving object", + "name": "MovingObject", + "type": "objectList" + }, + { + "description": "Rectangle Movement (required)", + "name": "RectangleMovement", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Center object", + "name": "CenterObject", + "type": "objectList" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Move objects in a rectangular pattern.", + "fullName": "Rectangular movement", + "name": "RectangleMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "Object.Y()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the initial state according to the configuration." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "InitialPosition", + "=", + "\"Top-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::TopRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "InitialPosition", + "=", + "\"Bottom-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::BottomRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "InitialPosition", + "=", + "\"Bottom-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::BottomLeftDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Left", + "=", + "Object.X() - Object.Behavior::DeltaX()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Top", + "=", + "Object.Y() - Object.Behavior::DeltaY()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update the rectangle when the object is moved outside of the behavior." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Left", + "+", + "Object.X() - OldX" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Top", + "+", + "Object.Y() - OldY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the object on the rectangular path." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "Left + Object.Behavior::DeltaX()", + "=", + "Top + Object.Behavior::DeltaY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save the position to detect when the object is moved outside of the behavior." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldX", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OldY", + "=", + "Object.Y()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Step on the path." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "mod(Progress + TimeDelta() / Object.Behavior::LoopDuration(), 1)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "mod(Progress - TimeDelta() / Object.Behavior::LoopDuration(), 1)" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Teleport the object to a corner of the movement rectangle.", + "fullName": "Teleport at a corner", + "functionType": "Action", + "name": "TeleportToCorner", + "sentence": "Set the position of _PARAM0_ at the _PARAM2_ of the rectangle loop", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Corner", + "=", + "\"Top-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Corner", + "=", + "\"Top-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::TopRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Corner", + "=", + "\"Bottom-right corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::BottomRightDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Corner", + "=", + "\"Bottom-left corner\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Progress", + "=", + "Object.Behavior::BottomLeftDuration() / Object.Behavior::LoopDuration()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Corner", + "name": "Corner", + "supplementaryInformation": "[\"Top-left corner\",\"Top-right corner\",\"Bottom-left corner\",\"Bottom-right corner\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the perimeter of the movement rectangle.", + "fullName": "Perimeter", + "functionType": "Expression", + "group": "Rectangular movement shape", + "name": "Perimeter", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * (abs(Width) + abs(Height))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through the whole rectangle (in seconds).", + "fullName": "Loop duration", + "functionType": "Expression", + "name": "LoopDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * (HorizontalEdgeDuration + VerticalEdgeDuration)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through a horizontal edge (in seconds).", + "fullName": "Horizontal edge duration", + "functionType": "Expression", + "name": "HorizontalEdgeDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time the object takes to go through a vertical edge (in seconds).", + "fullName": "Vertical edge duration", + "functionType": "Expression", + "name": "VerticalEdgeDuration", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the rectangle width.", + "fullName": "Width", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Width", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Width" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the rectangle height.", + "fullName": "Height", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Height", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Height" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the left bound of the movement.", + "fullName": "Left bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Left", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Left" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the top bound of the movement.", + "fullName": "Top bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Top", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Top" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the right bound of the movement.", + "fullName": "Right bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Right", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Left + Width" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the bottom bound of the movement.", + "fullName": "Bottom bound", + "functionType": "Expression", + "group": "Rectangular movement/Shape", + "name": "Bottom", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Top + Height" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the left bound of the rectangular movement.", + "fullName": "Left bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetLeft", + "sentence": "Change the movement left bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Width", + "+", + "Left - Value" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Left", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the top bound of the rectangular movement.", + "fullName": "Top bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetTop", + "sentence": "Change the movement top bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Height", + "+", + "Top - Value" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Top", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the right bound of the rectangular movement.", + "fullName": "Right bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetRight", + "sentence": "Change the movement right bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Width", + "=", + "Value - Left" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the bottom bound of the rectangular movement.", + "fullName": "Bottom bound", + "functionType": "Action", + "group": "Rectangular movement shape", + "name": "SetBottom", + "sentence": "Change the movement bottom bound of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Height", + "=", + "Value - Top" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time the object takes to go through a horizontal edge (in seconds).", + "fullName": "Horizontal edge duration", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetHorizontalEdgeDuration", + "sentence": "Change the time _PARAM0_ takes to go through a horizontal edge to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalEdgeDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the time the object takes to go through a vertical edge (in seconds).", + "fullName": "Vertical edge duration", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetVerticalEdgeDuration", + "sentence": "Change the time _PARAM0_ takes to go through a vertical edge to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalEdgeDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the direction to clockwise or counter-clockwise.", + "fullName": "Clockwise", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetClockwise", + "sentence": "Use clockwise direction for _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Value", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Clockwise", + "False", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Clockwise", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the easing function of the movement.", + "fullName": "Easing", + "functionType": "Action", + "group": "Rectangular movement speed", + "name": "SetEasing", + "sentence": "Change the easing of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "Easing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + }, + { + "description": "Easing", + "name": "Value", + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle the direction to clockwise or counter-clockwise.", + "fullName": "Toggle direction", + "functionType": "Action", + "name": "ToogleClockwise", + "sentence": "Toogle the direction of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ToogleClockwise", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ToogleClockwise", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ToogleClockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Clockwise", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "ToogleClockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving clockwise.", + "fullName": "Is moving clockwise", + "functionType": "Condition", + "name": "IsMovingClockwise", + "sentence": "_PARAM0_ is moving clockwise", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving to the left.", + "fullName": "Is moving left", + "functionType": "Condition", + "name": "IsMovingLeft", + "sentence": "_PARAM0_ is moving to the left", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnTop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnBottom" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving up.", + "fullName": "Is moving up", + "functionType": "Condition", + "name": "IsMovingUp", + "sentence": "_PARAM0_ is moving up", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnLeft" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnRight" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving to the right.", + "fullName": "Is moving right", + "functionType": "Condition", + "name": "IsMovingRight", + "sentence": "_PARAM0_ is moving to the right", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnTop" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnBottom" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is moving down.", + "fullName": "Is moving down", + "functionType": "Condition", + "name": "IsMovingDown", + "sentence": "_PARAM0_ is moving down", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnRight" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "Clockwise", + "True", + "" + ] + }, + { + "type": { + "value": "RectangleMovement::RectangleMovement::IsOnLeft" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the left side of the rectangle.", + "fullName": "Is on left", + "functionType": "Condition", + "name": "IsOnLeft", + "sentence": "_PARAM0_ is on the left side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the top side of the rectangle.", + "fullName": "Is on top", + "functionType": "Condition", + "name": "IsOnTop", + "sentence": "_PARAM0_ is on the top side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::TopRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the right side of the rectangle.", + "fullName": "Is on right", + "functionType": "Condition", + "name": "IsOnRight", + "sentence": "_PARAM0_ is on the right side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::BottomRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is on the bottom side of the rectangle.", + "fullName": "Is on bottom", + "functionType": "Condition", + "name": "IsOnBottom", + "sentence": "_PARAM0_ is on the bottom side", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<=", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the top-right one.", + "fullName": "Duration to top right", + "functionType": "Expression", + "name": "TopRightDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the bottom-right one.", + "fullName": "Duration to bottom right", + "functionType": "Expression", + "name": "BottomRightDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalEdgeDuration + VerticalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the duration between the top-left vertex and the bottom-left one.", + "fullName": "Duration to bottom left", + "functionType": "Expression", + "name": "BottomLeftDuration", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "2 * HorizontalEdgeDuration + VerticalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between the covered distance from the last vertex and the edge length (between 0 and 1).", + "fullName": "Progress on edge", + "functionType": "Expression", + "name": "EdgeProgress", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::HalfCurrentTime() / HorizontalEdgeDuration" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::HalfCurrentTime()", + ">=", + "abs(HorizontalEdgeDuration)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "(Object.Behavior::HalfCurrentTime() - HorizontalEdgeDuration) / VerticalEdgeDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of the current edge origin.", + "fullName": "Edge origin X", + "functionType": "Expression", + "name": "EdgeOriginX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Width" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the Y position of the current edge origin.", + "fullName": "Edge origin Y", + "functionType": "Expression", + "name": "EdgeOriginY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::BottomRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::Perimeter()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Height" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of the current edge target.", + "fullName": "Edge target X", + "functionType": "Expression", + "name": "EdgeTargetY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + ">=", + "Object.Behavior::TopRightDuration()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomLeftDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Height" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the Y position of the current edge target.", + "fullName": "Edge target Y", + "functionType": "Expression", + "name": "EdgeTargetX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Object.Behavior::CurrentTime()", + "<", + "Object.Behavior::BottomRightDuration()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Width" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the time from the top-left vertex.", + "fullName": "Current time", + "functionType": "Expression", + "name": "CurrentTime", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Progress * Object.Behavior::LoopDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the covered length from the top-left vertex or the bottom-right one.", + "fullName": "Half Current length", + "functionType": "Expression", + "name": "HalfCurrentTime", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object. Behavior::LoopDuration() * mod(Progress, 0.5)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the displacement on the X axis from the top-left vertex.", + "fullName": "Delta X", + "functionType": "Expression", + "name": "DeltaX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Tween::Ease(Easing, Object.Behavior::EdgeOriginX(), Object.Behavior::EdgeTargetX(), Object.Behavior::EdgeProgress())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the displacement on the Y axis from the top-left vertex.", + "fullName": "Delta Y", + "functionType": "Expression", + "name": "DeltaY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Tween::Ease(Easing, Object.Behavior::EdgeOriginY(), Object.Behavior::EdgeTargetY(), Object.Behavior::EdgeProgress())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangleMovement::RectangleMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "100", + "type": "Number", + "unit": "Pixel", + "label": "Width", + "group": "Dimension", + "name": "Width" + }, + { + "value": "100", + "type": "Number", + "unit": "Pixel", + "label": "Height", + "group": "Dimension", + "name": "Height" + }, + { + "value": "true", + "type": "Boolean", + "label": "Clockwise", + "group": "Speed", + "name": "Clockwise" + }, + { + "value": "4", + "type": "Number", + "unit": "Second", + "label": "Horizontal edge duration", + "group": "Speed", + "name": "HorizontalEdgeDuration" + }, + { + "value": "1", + "type": "Number", + "unit": "Second", + "label": "Vertical edge duration", + "group": "Speed", + "name": "VerticalEdgeDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Left" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Top" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Progress" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "OldY" + }, + { + "value": "easeInOutSine", + "type": "Choice", + "label": "Easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "Easing" + }, + { + "value": "Top-left corner", + "type": "Choice", + "label": "Initial position", + "extraInformation": [ + "Top-left corner", + "Top-right corner", + "Bottom-right corner", + "Bottom-left corner" + ], + "name": "InitialPosition" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ToogleClockwise" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Resource bar (separated units)", + "gdevelopVersion": ">=5.5.230", + "helpPath": "/objects/resource-bar", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWRvdHMtaG9yaXpvbnRhbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNiwxMkEyLDIgMCAwLDEgMTgsMTBBMiwyIDAgMCwxIDIwLDEyQTIsMiAwIDAsMSAxOCwxNEEyLDIgMCAwLDEgMTYsMTJNMTAsMTJBMiwyIDAgMCwxIDEyLDEwQTIsMiAwIDAsMSAxNCwxMkEyLDIgMCAwLDEgMTIsMTRBMiwyIDAgMCwxIDEwLDEyTTQsMTJBMiwyIDAgMCwxIDYsMTBBMiwyIDAgMCwxIDgsMTJBMiwyIDAgMCwxIDYsMTRBMiwyIDAgMCwxIDQsMTJaIiAvPjwvc3ZnPg==", + "name": "TiledUnitsBar", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/063e9152cf65bc0f3be2a828afd950c3ecf1b1fc72feefdc2467252fe987dc0f_dots-horizontal.svg", + "shortDescription": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "version": "2.0.0", + "description": [ + "A bar that represents a resource in the game (health, mana, ammo, etc).", + "", + "There are ready-to-use resource bars in the asset-store [resource bars pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=resource-bars-resource-bars)." + ], + "origin": { + "identifier": "TiledUnitsBar", + "name": "gdevelop-extension-store" + }, + "tags": [ + "resource", + "bar", + "health", + "mana", + "shield", + "hearts", + "lives", + "ammo" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "q8ubdigLvIRXLxsJDDTaokO41mc2" + ], + "changelog": [ + { + "version": "2.0.0", + "breaking": "- Resource bars now use \"variants\", allowing easy swapping of their visual aspect. You will have to make some adjustments to existing resource bars in your project. Follow this [migration documentation](https://wiki.gdevelop.io/gdevelop5/objects/custom-objects-prefab-template/migrate-to-variants/) to do these changes." + } + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "left anchor", + "fullName": "Left anchor", + "functionType": "ExpressionAndCondition", + "name": "LeftEdgeAnchor", + "private": true, + "sentence": "Left anchor of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs._TiledUnitsBarExtension = gdjs._TiledUnitsBarExtension || {", + " anchors: [\"None\", \"Min\", \"Max\", \"Proportional\", \"Center\"]", + "}", + "const { anchors } = gdjs._TiledUnitsBarExtension;", + "", + "const object = objects[0];", + "/** @type {gdjs.AnchorRuntimeBehavior} */", + "const anchor = object.getBehavior(eventsFunctionContext.getBehaviorName(\"Anchor\"));", + "eventsFunctionContext.returnValue = anchors[anchor._leftEdgeAnchor] || \"None\";", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "supplementaryInformation": "[\"None\",\"Min\",\"Max\",\"Proportional\",\"Center\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + }, + { + "description": "Anchor", + "name": "Anchor", + "supplementaryInformation": "AnchorBehavior::AnchorBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "left anchor", + "fullName": "Right anchor", + "functionType": "ExpressionAndCondition", + "name": "RightEdgeAnchor", + "private": true, + "sentence": "Right anchor of _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs._TiledUnitsBarExtension = gdjs._TiledUnitsBarExtension || {", + " anchors: [\"None\", \"Min\", \"Max\", \"Proportional\", \"Center\"]", + "}", + "const { anchors } = gdjs._TiledUnitsBarExtension;", + "", + "const object = objects[0];", + "/** @type {gdjs.AnchorRuntimeBehavior} */", + "const anchor = object.getBehavior(eventsFunctionContext.getBehaviorName(\"Anchor\"));", + "eventsFunctionContext.returnValue = anchors[anchor._rightEdgeAnchor] || \"None\";", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "expressionType": { + "supplementaryInformation": "[\"None\",\"Min\",\"Max\",\"Proportional\",\"Center\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "objectList" + }, + { + "description": "Anchor", + "name": "Anchor", + "supplementaryInformation": "AnchorBehavior::AnchorBehavior", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "fullName": "Resource bar", + "name": "ResourceBar", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This is done after the events to allow users to read the previous value at the end of the change." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"", + "<=", + "PreviousHighValueDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::UpdatePreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "=" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the value of the object.", + "fullName": "Value", + "functionType": "ExpressionAndCondition", + "name": "Value", + "sentence": "the value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "CurrentValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Value", + "name": "SetValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "clamp(Value, 0, MaxValue)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Value", + "<", + "PreviousHighValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Value", + ">=", + "PreviousHighValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::UpdatePreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum value of the object.", + "fullName": "Maximum value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "MaxValue", + "sentence": "the maximum value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "MaxValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxValue", + "name": "SetMaxValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "MaxValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is empty.", + "fullName": "Empty", + "functionType": "Condition", + "name": "IsEmpty", + "sentence": "_PARAM0_ bar is empty", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is full.", + "fullName": "Full", + "functionType": "Condition", + "name": "IsFull", + "sentence": "_PARAM0_ bar is full", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentValue", + "=", + "MaxValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the previous high value of the resource bar before the current change.", + "fullName": "Previous high value", + "functionType": "ExpressionAndCondition", + "name": "PreviousHighValue", + "sentence": "the previous high value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PreviousHighValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Force the previous resource value to update to the current one.", + "fullName": "Update previous value", + "functionType": "Action", + "name": "UpdatePreviousHighValue", + "sentence": "Update the previous resource value of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousHighValue", + "=", + "CurrentValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the previous high value conservation duration (in seconds) of the object.", + "fullName": "Previous high value conservation duration", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "PreviousHighValueDuration", + "sentence": "the previous high value conservation duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PreviousHighValueDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PreviousHighValueDuration", + "name": "SetPreviousHighValueDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousHighValueDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the resource value is changing.", + "fullName": "Value is changing", + "functionType": "Condition", + "name": "IsChanging", + "sentence": "_PARAM0_ value is changing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::PreviousHighValue" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "CurrentValue", + "" + ] + }, + { + "type": { + "value": "CompareObjectTimer" + }, + "parameters": [ + "Object", + "\"__ResourceBar.LastValueChange\"", + "<=", + "PreviousHighValueDuration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Value", + "name": "CurrentValue" + }, + { + "value": "3", + "type": "Number", + "label": "Maximum value", + "name": "MaxValue" + }, + { + "value": "", + "type": "Number", + "label": "Previous high value", + "hidden": true, + "name": "PreviousHighValue" + }, + { + "value": "1", + "type": "Number", + "label": "Previous high value conservation duration (in seconds)", + "name": "PreviousHighValueDuration" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 96, + "areaMaxY": 32, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "ResourceBar", + "description": "A bar that represents a resource in the game (health, mana, ammo, etc).", + "fullName": "Resource bar (separated units)", + "isInnerAreaFollowingParentSize": true, + "isUsingLegacyInstancesRenderer": false, + "name": "TiledUnitsBar", + "objects": [ + { + "assetStoreId": "", + "height": 32, + "name": "FillBar", + "texture": "", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 4, + "leftEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 4, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "ResourceBar", + "type": "TiledUnitsBar::ResourceBar", + "Value": 1, + "MaxValue": 3, + "PreviousValue": 0 + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Bar", + "texture": "", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 4, + "leftEdgeAnchor": 4, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 4, + "topEdgeAnchor": 4, + "useLegacyBottomAndRightAnchors": false + } + ] + }, + { + "assetStoreId": "", + "bottomMargin": 0, + "height": 32, + "leftMargin": 0, + "name": "Background", + "rightMargin": 0, + "texture": "", + "tiled": false, + "topMargin": 0, + "type": "PanelSpriteObject::PanelSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 2, + "leftEdgeAnchor": 1, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 1, + "useLegacyBottomAndRightAnchors": false + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "FillBar" + }, + { + "objectName": "Bar" + }, + { + "objectName": "Background" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 32, + "layer": "", + "name": "Background", + "persistentUuid": "b13e773c-6941-4f67-b198-030f29c8b679", + "width": 96, + "x": 0, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "layer": "", + "name": "Bar", + "persistentUuid": "caf6fdad-096d-4247-b23b-6cc1a89ce9f8", + "width": 90, + "x": 3, + "y": 3, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 26, + "layer": "", + "name": "FillBar", + "persistentUuid": "4b784a8f-dbae-4d8b-a287-628642416d10", + "width": 60, + "x": 3, + "y": 3, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "This allows to detect a change of \"intial value\" on hot reload." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousInitialValue", + "=", + "InitialValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass the configuration to the behavior (MaxValue must be set before Value)." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetMaxValue" + }, + "parameters": [ + "Object", + "=", + "MaxValue", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "InitialValue", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetUnitWidth" + }, + "parameters": [ + "Object", + "=", + "UnitWidth", + "Object.PropertyMaxValue()" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetMaxValue" + }, + "parameters": [ + "Object", + "=", + "MaxValue", + "Object.PropertyMaxValue()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "InitialValue", + "!=", + "PreviousInitialValue" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PreviousInitialValue", + "=", + "InitialValue" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "InitialValue", + "Object.PropertyInitialValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the value of the object.", + "fullName": "Value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar", + "name": "Value", + "sentence": "the value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FillBar.ResourceBar::Value()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "Value", + "name": "SetValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The value is clamped by the behavior. This is why Object.Value() is used instead of Value directly." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::SetValue" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=", + "Value", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::UpdateBarWidth" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum value of the object.", + "fullName": "Maximum value", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "MaxValue", + "sentence": "the maximum value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FillBar.ResourceBar::MaxValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "MaxValue", + "name": "SetMaxValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::SetMaxValue" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=", + "Value", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::SetValue" + }, + "parameters": [ + "Object", + "=", + "Object.Value()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "TiledUnitsBar::ResourceBar", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is empty.", + "fullName": "Empty", + "functionType": "Condition", + "group": "Resource bar", + "name": "IsEmpty", + "sentence": "_PARAM0_ bar is empty", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::IsEmpty" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the bar is full.", + "fullName": "Full", + "functionType": "Condition", + "group": "Resource bar", + "name": "IsFull", + "sentence": "_PARAM0_ bar is full", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::ResourceBar::IsFull" + }, + "parameters": [ + "FillBar", + "ResourceBar", + "=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the unit width of the object. How much pixels to show for a value of 1.", + "fullName": "Unit width", + "functionType": "ExpressionAndCondition", + "group": "Resource bar configuration", + "name": "UnitWidth", + "private": true, + "sentence": "the unit width", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "UnitWidth" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "UnitWidth", + "name": "SetUnitWidth", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "UnitWidth", + "=", + "Value" + ] + }, + { + "type": { + "value": "TiledUnitsBar::TiledUnitsBar::UpdateBarWidth" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Update the bar width.", + "fullName": "Bar width", + "functionType": "Action", + "name": "UpdateBarWidth", + "private": true, + "sentence": "Update the bar width of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "NewWidth", + "=", + "Object.MaxValue() * UnitWidth" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Center\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Center\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Bar", + "-", + "(NewWidth - Bar.Width()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Bar", + "-", + "NewWidth - Bar.Width()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "Bar", + "Resizable", + "=", + "NewWidth" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "FillBar", + "Resizable", + "=", + "Object.Value() * UnitWidth" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "FillBar", + "=", + "Bar.X()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TiledUnitsBar::LeftEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + }, + { + "type": { + "value": "TiledUnitsBar::RightEdgeAnchor" + }, + "parameters": [ + "", + "=", + "\"Max\"", + "Bar", + "Anchor", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "FillBar", + "=", + "Bar.X() + Bar.Width() - FillBar.Width()" + ] + } + ] + } + ], + "variables": [ + { + "name": "NewWidth", + "type": "number", + "value": 0 + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "TiledUnitsBar::TiledUnitsBar", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "3", + "type": "Number", + "unit": "Dimensionless", + "label": "Maximum value", + "name": "MaxValue" + }, + { + "value": "3", + "type": "Number", + "unit": "Dimensionless", + "label": "Initial value", + "name": "InitialValue" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "It's used to detect a change at hot reload.", + "hidden": true, + "name": "PreviousInitialValue" + }, + { + "value": "24", + "type": "Number", + "unit": "Pixel", + "label": "Unit width", + "description": "How much pixels to show for a value of 1.", + "name": "UnitWidth" + } + ], + "variants": [] + } + ] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.1", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "group": "Effects", + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "group": "Effects", + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "group": "Animation", + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "group": "Animation", + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "group": "Effect", + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "group": "Value", + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "group": "Value", + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "group": "Size", + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "group": "Size", + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "group": "Color", + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "group": "Color", + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/joystick/assets/Big Brown Meteor (1).png b/templates/joystick/assets/Big Brown Meteor (1).png new file mode 100644 index 0000000..31e06a4 Binary files /dev/null and b/templates/joystick/assets/Big Brown Meteor (1).png differ diff --git a/templates/joystick/assets/Big Grey Meteor (1).png b/templates/joystick/assets/Big Grey Meteor (1).png new file mode 100644 index 0000000..74371c3 Binary files /dev/null and b/templates/joystick/assets/Big Grey Meteor (1).png differ diff --git a/templates/joystick/assets/Crash.wav b/templates/joystick/assets/Crash.wav new file mode 100644 index 0000000..4d75323 Binary files /dev/null and b/templates/joystick/assets/Crash.wav differ diff --git a/templates/joystick/assets/Enemy_Spawn_Location.png b/templates/joystick/assets/Enemy_Spawn_Location.png new file mode 100644 index 0000000..b466cec Binary files /dev/null and b/templates/joystick/assets/Enemy_Spawn_Location.png differ diff --git a/templates/joystick/assets/Medium Brown Meteor (1).png b/templates/joystick/assets/Medium Brown Meteor (1).png new file mode 100644 index 0000000..14fa6f5 Binary files /dev/null and b/templates/joystick/assets/Medium Brown Meteor (1).png differ diff --git a/templates/joystick/assets/Orange playerShip (3).png b/templates/joystick/assets/Orange playerShip (3).png new file mode 100644 index 0000000..0b6b7ec Binary files /dev/null and b/templates/joystick/assets/Orange playerShip (3).png differ diff --git a/templates/joystick/assets/You Win.png b/templates/joystick/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/joystick/assets/You Win.png differ diff --git a/templates/joystick/assets/tiled_Starry Background Stars 2.png b/templates/joystick/assets/tiled_Starry Background Stars 2.png new file mode 100644 index 0000000..3a1d50d Binary files /dev/null and b/templates/joystick/assets/tiled_Starry Background Stars 2.png differ diff --git a/templates/joystick/assets/tiled_black space.png b/templates/joystick/assets/tiled_black space.png new file mode 100644 index 0000000..82ddab9 Binary files /dev/null and b/templates/joystick/assets/tiled_black space.png differ diff --git a/templates/joystick/game.json b/templates/joystick/game.json new file mode 100644 index 0000000..4954b98 --- /dev/null +++ b/templates/joystick/game.json @@ -0,0 +1,14536 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 237, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "portrait", + "packageName": "com.example.joysticktutorial", + "pixelsRounding": false, + "projectUuid": "4ec7adea-2f85-4173-a98e-940556b75af5", + "scaleMode": "linear", + "sizeOnStartupMode": "", + "templateSlug": "joystick-tutorial", + "version": "1.0.0", + "name": "Joystick Tutorial", + "description": "A game example where you add a joystick to control the movement of a ship in space.", + "author": "", + "windowWidth": 720, + "windowHeight": 1280, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/Big Brown Meteor (1).png", + "kind": "image", + "metadata": "", + "name": "Big Brown Meteor (1).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Space Shooter/PNG/Meteors/ae6802c87f6e3e4739b6260b23e4546582daad3fb803446401fbec2bc057f297_Big Brown Meteor (1).png", + "name": "Big Brown Meteor (1).png" + } + }, + { + "file": "assets/Big Grey Meteor (1).png", + "kind": "image", + "metadata": "", + "name": "Big Grey Meteor (1).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Space Shooter/PNG/Meteors/821659c429013730ce54bc7259612b06fcaf5563cbed3ce63d0ee73e4de202cd_Big Grey Meteor (1).png", + "name": "Big Grey Meteor (1).png" + } + }, + { + "file": "assets/Medium Brown Meteor (1).png", + "kind": "image", + "metadata": "", + "name": "Medium Brown Meteor (1).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Space Shooter/PNG/Meteors/70f274ae740166dbf45e9131bbaee2b5c18034303c527fccaed64aaedec2f1c1_Medium Brown Meteor (1).png", + "name": "Medium Brown Meteor (1).png" + } + }, + { + "file": "assets/Orange playerShip (3).png", + "kind": "image", + "metadata": "", + "name": "Orange playerShip (3).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Space Shooter/PNG/5abeaf795b2d7c342a06be4ae70a6f484bf445f6884d7c456d4f6be66eab8f3a_Orange playerShip (3).png", + "name": "Orange playerShip (3).png" + } + }, + { + "file": "assets/Enemy_Spawn_Location.png", + "kind": "image", + "metadata": "", + "name": "Enemy_Spawn_Location.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/tiled_black space.png", + "kind": "image", + "metadata": "", + "name": "tiled_black space.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Space Shooter/Backgrounds/82e24c48618660952ceb6cede5c9917ceeb4371c9e971f4a49fb43689d045d89_tiled_black space.png", + "name": "tiled_black space.png" + } + }, + { + "file": "assets/tiled_Starry Background Stars 2.png", + "kind": "image", + "metadata": "", + "name": "tiled_Starry Background Stars 2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/FoozleCC/Void Collection/Environment Pack/Backgrounds/1dd0ee3b6ee4b0545ef9b3723a60ee4a10bb29bfd0fdd4845c460ba69bec4ce0_tiled_Starry Background Stars 2.png", + "name": "tiled_Starry Background Stars 2.png" + } + }, + { + "file": "assets/Crash.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.13,\\\"sustainPunch\\\":70,\\\"decay\\\":0.22,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":5,\\\"frequency\\\":7200,\\\"frequencySweep\\\":-2600,\\\"frequencyDeltaSweep\\\":-2200,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":-5,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.53,\\\"waveform\\\":\\\"pinknoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":0,\\\"squareDuty\\\":55,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":5,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":-1,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":-900,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Crash\"},\"localFilePath\":\"assets/Crash.wav\"}", + "name": "Crash", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": true, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.3866990209613917, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Meteors", + "objects": [ + { + "name": "BigBrownMeteor1" + }, + { + "name": "BigGreyMeteor1" + }, + { + "name": "MediumBrownMeteor1" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 1280, + "layer": "", + "name": "Walls", + "persistentUuid": "b1673ac2-aa53-4b3b-8746-589e30d25f40", + "width": 64, + "x": 720, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 1280, + "layer": "", + "name": "Walls", + "persistentUuid": "d00e0c03-99cb-48f5-987e-d7acbbd91f68", + "width": 64, + "x": -64, + "y": 0, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "", + "name": "Walls", + "persistentUuid": "4668bfcb-cf7e-4a8b-91c8-be6e2cc70c08", + "width": 848, + "x": -64, + "y": -64, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "", + "name": "Walls", + "persistentUuid": "e26dccc7-cf6d-46c1-ad7d-e9ca7c1de527", + "width": 848, + "x": -64, + "y": 1280, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 1344, + "layer": "", + "name": "BlackSpace", + "persistentUuid": "57a3ecf4-327c-414d-bcf9-46d386cb2241", + "width": 784, + "x": -32, + "y": -32, + "zOrder": -2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 1344, + "layer": "", + "name": "StarryBackgroundStars2", + "persistentUuid": "b7046053-b990-498a-ad8d-8b6b8648ae3c", + "width": 784, + "x": -32, + "y": -32, + "zOrder": -1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Trail", + "persistentUuid": "f0281bcf-f9c4-4b83-ba85-f641a4edaef4", + "width": 0, + "x": 960, + "y": 576, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "OrangePlayerShip3", + "persistentUuid": "95ae9a18-9c57-4734-b713-f580de816be6", + "width": 0, + "x": 352, + "y": 896, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "911c6f50a4c05507c6fc1df967493f61a7ce9bad9e144cec92f6ff32be42749a", + "name": "BigBrownMeteor1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Big Brown Meteor (1).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 101, + "y": 0 + }, + { + "x": 101, + "y": 83 + }, + { + "x": 0, + "y": 83 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "ca0633aaa11c9973eff808d10322e7c3142144c53b0c4747cd55b303acdc81f6", + "name": "BigGreyMeteor1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Big Grey Meteor (1).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 101, + "y": 0 + }, + { + "x": 101, + "y": 83 + }, + { + "x": 0, + "y": 83 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "829045c7d03f177ede71c000a4fc81b0ddbdc73a91144b7fa32ad0b557e4b020", + "name": "MediumBrownMeteor1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Medium Brown Meteor (1).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 1 + }, + { + "x": 43, + "y": 1 + }, + { + "x": 43, + "y": 43 + }, + { + "x": 0, + "y": 43 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "2dfe5abcf8449b36588904833bd4d48556da3e9cb3770285e4f8aa6ad3bd3b96", + "name": "OrangePlayerShip3", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior", + "useLegacyTurnBack": false, + "acceleration": 400, + "deceleration": 900, + "maxSpeed": 300, + "allowDiagonals": true, + "angleOffset": 0, + "angularMaxSpeed": 180, + "customIsometryAngle": 30, + "ignoreDefaultControls": false, + "movementAngleOffset": 0, + "rotateObject": false, + "viewpoint": "TopDown" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Orange playerShip (3).png", + "points": [], + "originPoint": { + "name": "origine", + "x": 49, + "y": 70.6128 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 42, + "y": 5 + }, + { + "x": 55, + "y": 5 + }, + { + "x": 95, + "y": 65 + }, + { + "x": 3, + "y": 65 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Walls", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Enemy_Spawn_Location.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "2d701679df0e067e63e657f3a7de8b0c076c1c0db19e7c6070c186b28a611df2", + "height": 128, + "name": "BlackSpace", + "texture": "tiled_black space.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "c20fe4657b50f46f901b666ddae13412211ef388c101136bacecd5bee34520b4", + "height": 128, + "name": "StarryBackgroundStars2", + "texture": "tiled_Starry Background Stars 2.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 250, + "emitterForceMin": 175, + "flow": 30, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "Trail", + "particleAlpha1": 255, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 68, + "particleBlue2": 87, + "particleColor1": "253;239;68", + "particleColor2": "87;87;87", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 239, + "particleGreen2": 87, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 0.5, + "particleRed1": 253, + "particleRed2": 87, + "particleSize1": 100, + "particleSize2": 20, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 10, + "rendererParam2": 1, + "rendererType": "Point", + "tank": -1, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 10, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "BigBrownMeteor1" + }, + { + "objectName": "BigGreyMeteor1" + }, + { + "objectName": "MediumBrownMeteor1" + }, + { + "objectName": "OrangePlayerShip3" + }, + { + "objectName": "Walls" + }, + { + "objectName": "BlackSpace" + }, + { + "objectName": "StarryBackgroundStars2" + }, + { + "objectName": "Trail" + }, + { + "objectName": "EndingDialog" + } + ] + }, + "events": [ + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Game Systems", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Meteor Management", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "", + "\"RockSpawn\"" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Difficulty", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareTimer" + }, + "parameters": [ + "", + "\"RockSpawn\"", + ">", + "Variable(Difficulty)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Randomizer", + "=", + "RandomInRange(0,2)" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Difficulty", + "*", + "0.99" + ] + }, + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "", + "\"RockSpawn\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "Randomizer", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BigBrownMeteor1", + "RandomInRange(0,720)", + "-100", + "" + ] + }, + { + "type": { + "value": "AddForceXY" + }, + "parameters": [ + "BigBrownMeteor1", + "0", + "250", + "1" + ] + }, + { + "type": { + "value": "RotateTowardAngle" + }, + "parameters": [ + "BigBrownMeteor1", + "RandomInRange(0,360)", + "0", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "Randomizer", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "BigGreyMeteor1", + "RandomInRange(0,720)", + "-100", + "" + ] + }, + { + "type": { + "value": "AddForceXY" + }, + "parameters": [ + "BigGreyMeteor1", + "0", + "250", + "1" + ] + }, + { + "type": { + "value": "RotateTowardAngle" + }, + "parameters": [ + "BigGreyMeteor1", + "RandomInRange(0,360)", + "0", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "Randomizer", + "=", + "2" + ] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "MediumBrownMeteor1", + "RandomInRange(0,720)", + "-100", + "" + ] + }, + { + "type": { + "value": "AddForceXY" + }, + "parameters": [ + "MediumBrownMeteor1", + "0", + "250", + "1" + ] + }, + { + "type": { + "value": "RotateTowardAngle" + }, + "parameters": [ + "MediumBrownMeteor1", + "RandomInRange(0,360)", + "0", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Meteors", + ">", + "1400" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Meteors", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Scrolling background", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::SetOpacity" + }, + "parameters": [ + "StarryBackgroundStars2", + "=", + "100" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LayerTimeScale" + }, + "parameters": [ + "", + "\"\"", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::YOffset" + }, + "parameters": [ + "StarryBackgroundStars2", + "+", + "TimeDelta()*-150" + ] + }, + { + "type": { + "value": "TiledSpriteObject::YOffset" + }, + "parameters": [ + "BlackSpace", + "+", + "TimeDelta()*-100" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Trail", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "RotateTowardAngle" + }, + "parameters": [ + "Trail", + "90", + "0", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Trail", + "=", + "OrangePlayerShip3.X()", + "=", + "OrangePlayerShip3.Y()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SeparateFromObjects" + }, + "parameters": [ + "OrangePlayerShip3", + "Walls", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Crashing", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "OrangePlayerShip3", + "Meteors", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ChangeLayerTimeScale" + }, + "parameters": [ + "", + "\"\"", + "0" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Crash", + "", + "100", + "1" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "1.5" + ] + }, + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "TimeFromStart()", + ">", + "5" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "FlatLightJoystick", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "5" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "\"Interface\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "ScreenWidth()/2", + "=", + "ScreenHeight()/2" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 0, + "ambientLightColorG": 22239848, + "ambientLightColorR": 16, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Interface", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.1", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "group": "Effects", + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "group": "Effects", + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "group": "Animation", + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "group": "Animation", + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "group": "Effect", + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "group": "Value", + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "group": "Value", + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "group": "Size", + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "group": "Size", + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "group": "Color", + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "group": "Color", + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "group": "Speed", + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "group": "Speed", + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.8.3", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual", + "platformer", + "platform", + "top-down" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [ + { + "name": "Controllers", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "Buttons", + "type": "array", + "children": [ + { + "type": "structure", + "children": [ + { + "name": "State", + "type": "string", + "value": "Idle" + } + ] + } + ] + }, + { + "name": "Joystick", + "type": "structure", + "children": [] + } + ] + } + ] + } + ], + "eventsFunctions": [ + { + "fullName": "Accelerated speed", + "functionType": "Expression", + "name": "AcceleratedSpeed", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "CurrentSpeed" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "<", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "-", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reduce the speed to match the stick force." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "TargetedSpeed" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(TargetedSpeed, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "TargetedSpeed" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "+", + "Acceleration * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Turn back at least as fast as it would stop." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(TargetedSpeed, CurrentSpeed + max(Acceleration , Deceleration) * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TargetedSpeed", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "min(0, CurrentSpeed + Acceleration * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "CurrentSpeed", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "AcceleratedSpeed", + "=", + "max(0, CurrentSpeed - Acceleration * TimeDelta())" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "clamp(AcceleratedSpeed, -SpeedMax, SpeedMax)" + ] + } + ] + } + ], + "variables": [ + { + "name": "AcceleratedSpeed", + "type": "number", + "value": 0 + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Current speed", + "name": "CurrentSpeed", + "type": "expression" + }, + { + "description": "Targeted speed", + "name": "TargetedSpeed", + "type": "expression" + }, + { + "description": "Max speed", + "name": "SpeedMax", + "type": "expression" + }, + { + "description": "Acceleration", + "name": "Acceleration", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Buttons[Button].State", + "=", + "ButtonState" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone", + "=", + "DeadZoneRadius" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].DeadZone" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(Angle * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "Direction", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "Angle", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(ControllerIdentifier, JoystickIdentifier)", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "", + "name": "Coucou", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the force of multitouch contoller stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier)) / (1 - SpriteMultitouchJoystick::DeadZone(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Stick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Force", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Controllers[ControllerIdentifier].Joystick[JoystickIdentifier].Angle", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "XFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "YFromAngleAndDistance(SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier), SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a new touch has started on the right or left side of the screen.", + "fullName": "New touch on a screen side", + "functionType": "Condition", + "group": "Multitouch Joystick", + "name": "HasTouchStartedOnScreenSide", + "sentence": "A new touch has started on the _PARAM2_ side of the screen on _PARAM1_'s layer", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + "<", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "Side", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "TouchX" + }, + "parameters": [ + "", + "StartedTouchOrMouseId(0)", + ">=", + "CameraCenterX(Object.Layer())", + "Object.Layer()", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch joystick", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "objectList" + }, + { + "description": "Screen side", + "name": "Side", + "supplementaryInformation": "[\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "DeadZoneRadius", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(TouchId, Object.Layer(), 0), TouchY(TouchId, Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "max(0, JoystickForce - DeadZoneRadius) / (1 - DeadZoneRadius)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickForce", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickForce", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "", + "name": "Parameter", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "JoystickAngle" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "JoystickAngle", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "JoystickAngle", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::JoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "JoystickAngle", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "ControllerIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ControllerIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "JoystickIdentifier" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "JoystickIdentifier", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "DeadZoneRadius" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "DeadZoneRadius", + "=", + "Value" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Force the joystick into the pressing state.", + "fullName": "Force start pressing", + "functionType": "Action", + "name": "ForceStartPressing", + "sentence": "Force start pressing _PARAM0_ with touch identifier: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Touch identifier", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "False", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer())", + "TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer())" + ] + }, + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "Radius", + ">", + "DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(StartedTouchOrMouseId(TouchIndex), Object.Layer()), TouchY(StartedTouchOrMouseId(TouchIndex), Object.Layer()))" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(TouchIndex)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchIndex", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "IsReleased", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "ControllerIdentifier", + "ButtonIdentifier", + "ButtonState", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "hidden": true, + "name": "IsReleased" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Triggering circle radius", + "description": "This circle adds up to the object collision mask.", + "name": "Radius" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D platformer multitouch controller mapper", + "name": "Platformer3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SetForwardAngle" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "=", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier) + CameraAngle(Object.Layer())" + ] + }, + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "-90", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Platformer3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics character with a multitouch controller.", + "fullName": "3D shooter multitouch controller mapper", + "name": "Shooter3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "JoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateStick" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JumpButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCharacter3D::SimulateJumpKey" + }, + "parameters": [ + "Object", + "PhysicsCharacter3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::Shooter3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics character", + "extraInformation": [ + "Physics3D::PhysicsCharacter3D" + ], + "name": "PhysicsCharacter3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Walk joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "group": "Controls", + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control camera rotations with a multitouch controller.", + "fullName": "First person camera multitouch controller mapper", + "name": "FirstPersonMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "TODO It's probably a bad idea to rotate the object around Y." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedZ", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedZ, SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, CameraStick) * HorizontalRotationSpeedMax, HorizontalRotationSpeedMax, HorizontalRotationAcceleration, HorizontalRotationDeceleration)" + ] + }, + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "CurrentRotationSpeedZ * TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "CurrentRotationSpeedY", + "=", + "SpriteMultitouchJoystick::AcceleratedSpeed(CurrentRotationSpeedY, SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, CameraStick) * VerticalRotationSpeedMax, VerticalRotationSpeedMax, VerticalRotationAcceleration, VerticalRotationDeceleration)" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "+", + "CurrentRotationSpeedY * TimeDelta()" + ] + }, + { + "type": { + "value": "Scene3D::Base3DBehavior::SetRotationY" + }, + "parameters": [ + "Object", + "Object3D", + "=", + "clamp(Object.Object3D::RotationY(), VerticalAngleMin, VerticalAngleMax)" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper::LookFromObjectEyes" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera to look though _PARAM1_ eyes. The object must look to the right when all its angles are 0 and the top of its head be toward Z+.", + "fullName": "Look through object eyes", + "functionType": "Action", + "group": "Layers and cameras", + "name": "LookFromObjectEyes", + "private": true, + "sentence": "Move the camera to look though _PARAM0_ eyes", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Object", + "", + "Object.Layer()", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraZ" + }, + "parameters": [ + "", + "=", + "Object.Object3D::Z() + Object.Object3D::Depth() + OffsetZ", + "", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationX" + }, + "parameters": [ + "", + "=", + "- Object.Object3D::RotationY() + 90", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "Scene3D::SetCameraRotationY" + }, + "parameters": [ + "", + "=", + "Object.Object3D::RotationX()", + "GetArgumentAsString(\"Layer\")", + "" + ] + }, + { + "type": { + "value": "SetCameraAngle" + }, + "parameters": [ + "", + "=", + "Object.Angle() + 90", + "Object.Layer()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum horizontal rotation speed of the object.", + "fullName": "Maximum horizontal rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationSpeedMax", + "sentence": "the maximum horizontal rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationSpeedMax", + "name": "SetHorizontalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation acceleration of the object.", + "fullName": "Horizontal rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationAcceleration", + "sentence": "the horizontal rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationAcceleration", + "name": "SetHorizontalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the horizontal rotation deceleration of the object.", + "fullName": "Horizontal rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper horizontal rotation configuration", + "name": "HorizontalRotationDeceleration", + "sentence": "the horizontal rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "HorizontalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "HorizontalRotationDeceleration", + "name": "SetHorizontalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "HorizontalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical rotation speed of the object.", + "fullName": "Maximum vertical rotation speed", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationSpeedMax", + "sentence": "the maximum vertical rotation speed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationSpeedMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationSpeedMax", + "name": "SetVerticalRotationSpeedMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationSpeedMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation acceleration of the object.", + "fullName": "Vertical rotation acceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationAcceleration", + "sentence": "the vertical rotation acceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationAcceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationAcceleration", + "name": "SetVerticalRotationAcceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationAcceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the vertical rotation deceleration of the object.", + "fullName": "Vertical rotation deceleration", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalRotationDeceleration", + "sentence": "the vertical rotation deceleration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalRotationDeceleration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalRotationDeceleration", + "name": "SetVerticalRotationDeceleration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalRotationDeceleration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the minimum vertical camera angle of the object.", + "fullName": "Minimum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMin", + "sentence": "the minimum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMin" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMin", + "name": "SetVerticalAngleMin", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMin", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the maximum vertical camera angle of the object.", + "fullName": "Maximum vertical camera angle", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper vertical rotation configuration", + "name": "VerticalAngleMax", + "sentence": "the maximum vertical camera angle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "VerticalAngleMax" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "VerticalAngleMax", + "name": "SetVerticalAngleMax", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "VerticalAngleMax", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the z position offset of the object.", + "fullName": "Z position offset", + "functionType": "ExpressionAndCondition", + "group": "First person camera multitouch controller mapper position configuration", + "name": "OffsetZ", + "sentence": "the z position offset", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "OffsetZ" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetZ", + "name": "SetOffsetZ", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "OffsetZ", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::FirstPersonMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D capability", + "extraInformation": [ + "Scene3D::Base3DBehavior" + ], + "name": "Object3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Camera joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "CameraStick" + }, + { + "value": "180", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Horizontal rotation", + "name": "HorizontalRotationSpeedMax" + }, + { + "value": "360", + "type": "Number", + "label": "Rotation acceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationAcceleration" + }, + { + "value": "720", + "type": "Number", + "label": "Rotation deceleration", + "group": "Horizontal rotation", + "name": "HorizontalRotationDeceleration" + }, + { + "value": "120", + "type": "Number", + "unit": "AngularSpeed", + "label": "Maximum rotation speed", + "group": "Vertical rotation", + "name": "VerticalRotationSpeedMax" + }, + { + "value": "240", + "type": "Number", + "label": "Rotation acceleration", + "group": "Vertical rotation", + "name": "VerticalRotationAcceleration" + }, + { + "value": "480", + "type": "Number", + "label": "Rotation deceleration", + "group": "Vertical rotation", + "name": "VerticalRotationDeceleration" + }, + { + "value": "-90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Minimum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMin" + }, + { + "value": "90", + "type": "Number", + "unit": "DegreeAngle", + "label": "Maximum angle", + "group": "Vertical rotation", + "name": "VerticalAngleMax" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Z position offset", + "group": "Position", + "name": "OffsetZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Z", + "hidden": true, + "name": "CurrentRotationSpeedZ" + }, + { + "value": "0", + "type": "Number", + "unit": "AngularSpeed", + "label": "Current rotation speed Y", + "hidden": true, + "name": "CurrentRotationSpeedY" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a 3D physics car with a multitouch controller.", + "fullName": "3D car multitouch controller mapper", + "name": "PhysicsCar3DMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SteerJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateSteeringStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "SpriteMultitouchJoystick::StickForceX(ControllerIdentifier, \"Primary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::StickForce" + }, + "parameters": [ + "", + ">", + "0", + "ControllerIdentifier", + "SpeedJoystickIdentifier", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateAcceleratorStick" + }, + "parameters": [ + "Object", + "PhysicsCar3D", + "-SpriteMultitouchJoystick::StickForceY(ControllerIdentifier, \"Secondary\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "ControllerIdentifier", + "HandBrakeButton", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "Physics3D::PhysicsCar3D::SimulateHandBrakeKey" + }, + "parameters": [ + "Object", + "PhysicsCar3D" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PhysicsCar3DMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "3D physics car", + "extraInformation": [ + "Physics3D::PhysicsCar3D" + ], + "name": "PhysicsCar3D" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Steer joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SteerJoystickIdentifier" + }, + { + "value": "Secondary", + "type": "Choice", + "label": "Speed joystick", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "SpeedJoystickIdentifier" + }, + { + "value": "B", + "type": "String", + "label": "Hand brake button name", + "group": "Controls", + "name": "HandBrakeButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "quickCustomizationVisibility": "hidden", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(ControllerIdentifier, JoystickIdentifier)", + "sign(SpriteMultitouchJoystick::StickForce(ControllerIdentifier, JoystickIdentifier))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "StickMode", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "ControllerIdentifier", + "JoystickIdentifier", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsPressed" + }, + "parameters": [ + "Object", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "Object" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "no", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "False", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "ControllerIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "JoystickIdentifier", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "DeadZoneRadius", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Show the joystick until it is released.", + "fullName": "Show and start pressing", + "functionType": "Action", + "name": "TeleportAndPress", + "sentence": "Show _PARAM0_ at the cursor position and start pressing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "Object.ParentTouchX(StartedTouchOrMouseId(0))", + "=", + "Object.ParentTouchY(StartedTouchOrMouseId(0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::ActivateControl" + }, + "parameters": [ + "Object", + "yes", + "" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "ShouldBeHiddenWhenReleased", + "True", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::ForceStartPressing" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "StartedTouchOrMouseId(0)", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchX", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchX(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the X position of a specified touch", + "fullName": "Touch X position (on parent)", + "functionType": "Expression", + "name": "ParentTouchY", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const touchId = eventsFunctionContext.getArgument(\"TouchId\");", + "eventsFunctionContext.returnValue = gdjs.evtTools.input.getTouchY(object.getInstanceContainer(), touchId, object.getLayer());" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Touch identifier", + "name": "TouchId", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldActivate", + "True", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick is pressed.", + "fullName": "Stick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Stick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the strick force (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "ExpressionAndCondition", + "name": "StickForceX", + "sentence": "the stick X force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "ExpressionAndCondition", + "name": "StickForceY", + "sentence": "the stick Y force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (from -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the stick is pointing towards (from -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "Direction", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Value", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "hidden": true, + "name": "ParentOrigin" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "hidden": true, + "name": "ShouldBeHiddenWhenReleased" + } + ], + "variants": [] + } + ] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/knightPlatformer/assets/Clouds.png b/templates/knightPlatformer/assets/Clouds.png new file mode 100644 index 0000000..1956717 Binary files /dev/null and b/templates/knightPlatformer/assets/Clouds.png differ diff --git a/templates/knightPlatformer/assets/Fire1.png b/templates/knightPlatformer/assets/Fire1.png new file mode 100644 index 0000000..1358c91 Binary files /dev/null and b/templates/knightPlatformer/assets/Fire1.png differ diff --git a/templates/knightPlatformer/assets/Fire2.png b/templates/knightPlatformer/assets/Fire2.png new file mode 100644 index 0000000..235c74a Binary files /dev/null and b/templates/knightPlatformer/assets/Fire2.png differ diff --git a/templates/knightPlatformer/assets/Fire3.png b/templates/knightPlatformer/assets/Fire3.png new file mode 100644 index 0000000..ea4de7a Binary files /dev/null and b/templates/knightPlatformer/assets/Fire3.png differ diff --git a/templates/knightPlatformer/assets/Fire4.png b/templates/knightPlatformer/assets/Fire4.png new file mode 100644 index 0000000..2ace7a6 Binary files /dev/null and b/templates/knightPlatformer/assets/Fire4.png differ diff --git a/templates/knightPlatformer/assets/Key.wav b/templates/knightPlatformer/assets/Key.wav new file mode 100644 index 0000000..2abe726 Binary files /dev/null and b/templates/knightPlatformer/assets/Key.wav differ diff --git a/templates/knightPlatformer/assets/Key_Sprite.png b/templates/knightPlatformer/assets/Key_Sprite.png new file mode 100644 index 0000000..d42ba69 Binary files /dev/null and b/templates/knightPlatformer/assets/Key_Sprite.png differ diff --git a/templates/knightPlatformer/assets/Knight-Idle1.png b/templates/knightPlatformer/assets/Knight-Idle1.png new file mode 100644 index 0000000..0edcf51 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Idle1.png differ diff --git a/templates/knightPlatformer/assets/Knight-Idle2.png b/templates/knightPlatformer/assets/Knight-Idle2.png new file mode 100644 index 0000000..acd68fb Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Idle2.png differ diff --git a/templates/knightPlatformer/assets/Knight-Idle3.png b/templates/knightPlatformer/assets/Knight-Idle3.png new file mode 100644 index 0000000..c527e4c Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Idle3.png differ diff --git a/templates/knightPlatformer/assets/Knight-Idle4.png b/templates/knightPlatformer/assets/Knight-Idle4.png new file mode 100644 index 0000000..acd68fb Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Idle4.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run1.png b/templates/knightPlatformer/assets/Knight-Run1.png new file mode 100644 index 0000000..19c6251 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run1.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run10.png b/templates/knightPlatformer/assets/Knight-Run10.png new file mode 100644 index 0000000..40a5d27 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run10.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run11.png b/templates/knightPlatformer/assets/Knight-Run11.png new file mode 100644 index 0000000..dc92e49 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run11.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run12.png b/templates/knightPlatformer/assets/Knight-Run12.png new file mode 100644 index 0000000..5cce347 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run12.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run13.png b/templates/knightPlatformer/assets/Knight-Run13.png new file mode 100644 index 0000000..873d959 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run13.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run14.png b/templates/knightPlatformer/assets/Knight-Run14.png new file mode 100644 index 0000000..40a5d27 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run14.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run15.png b/templates/knightPlatformer/assets/Knight-Run15.png new file mode 100644 index 0000000..dc92e49 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run15.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run16.png b/templates/knightPlatformer/assets/Knight-Run16.png new file mode 100644 index 0000000..c4e1c9d Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run16.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run2.png b/templates/knightPlatformer/assets/Knight-Run2.png new file mode 100644 index 0000000..4473534 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run2.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run3.png b/templates/knightPlatformer/assets/Knight-Run3.png new file mode 100644 index 0000000..d8db89a Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run3.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run4.png b/templates/knightPlatformer/assets/Knight-Run4.png new file mode 100644 index 0000000..cfe4fcd Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run4.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run5.png b/templates/knightPlatformer/assets/Knight-Run5.png new file mode 100644 index 0000000..d3c052d Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run5.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run6.png b/templates/knightPlatformer/assets/Knight-Run6.png new file mode 100644 index 0000000..e8c545c Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run6.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run7.png b/templates/knightPlatformer/assets/Knight-Run7.png new file mode 100644 index 0000000..f6431e1 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run7.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run8.png b/templates/knightPlatformer/assets/Knight-Run8.png new file mode 100644 index 0000000..e0b1120 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run8.png differ diff --git a/templates/knightPlatformer/assets/Knight-Run9.png b/templates/knightPlatformer/assets/Knight-Run9.png new file mode 100644 index 0000000..552b195 Binary files /dev/null and b/templates/knightPlatformer/assets/Knight-Run9.png differ diff --git a/templates/knightPlatformer/assets/Left arrow round button.png b/templates/knightPlatformer/assets/Left arrow round button.png new file mode 100644 index 0000000..d718b54 Binary files /dev/null and b/templates/knightPlatformer/assets/Left arrow round button.png differ diff --git a/templates/knightPlatformer/assets/Locked-1.png b/templates/knightPlatformer/assets/Locked-1.png new file mode 100644 index 0000000..ce66592 Binary files /dev/null and b/templates/knightPlatformer/assets/Locked-1.png differ diff --git a/templates/knightPlatformer/assets/NewSprite-1-0.png b/templates/knightPlatformer/assets/NewSprite-1-0.png new file mode 100644 index 0000000..85908c3 Binary files /dev/null and b/templates/knightPlatformer/assets/NewSprite-1-0.png differ diff --git a/templates/knightPlatformer/assets/Platform_Metal-solid.png b/templates/knightPlatformer/assets/Platform_Metal-solid.png new file mode 100644 index 0000000..f621a2c Binary files /dev/null and b/templates/knightPlatformer/assets/Platform_Metal-solid.png differ diff --git a/templates/knightPlatformer/assets/Platform_Stone1-solid.png b/templates/knightPlatformer/assets/Platform_Stone1-solid.png new file mode 100644 index 0000000..8c273b1 Binary files /dev/null and b/templates/knightPlatformer/assets/Platform_Stone1-solid.png differ diff --git a/templates/knightPlatformer/assets/Platform_Stone1.png b/templates/knightPlatformer/assets/Platform_Stone1.png new file mode 100644 index 0000000..1852db4 Binary files /dev/null and b/templates/knightPlatformer/assets/Platform_Stone1.png differ diff --git a/templates/knightPlatformer/assets/Platform_Stone2.png b/templates/knightPlatformer/assets/Platform_Stone2.png new file mode 100644 index 0000000..abeb00c Binary files /dev/null and b/templates/knightPlatformer/assets/Platform_Stone2.png differ diff --git a/templates/knightPlatformer/assets/Player_Mask_Sprite-1-0.png b/templates/knightPlatformer/assets/Player_Mask_Sprite-1-0.png new file mode 100644 index 0000000..81b65dc Binary files /dev/null and b/templates/knightPlatformer/assets/Player_Mask_Sprite-1-0.png differ diff --git a/templates/knightPlatformer/assets/Right arrow round button.png b/templates/knightPlatformer/assets/Right arrow round button.png new file mode 100644 index 0000000..23a8e4c Binary files /dev/null and b/templates/knightPlatformer/assets/Right arrow round button.png differ diff --git a/templates/knightPlatformer/assets/Shadow.png b/templates/knightPlatformer/assets/Shadow.png new file mode 100644 index 0000000..68236f9 Binary files /dev/null and b/templates/knightPlatformer/assets/Shadow.png differ diff --git a/templates/knightPlatformer/assets/TheEnd.mp3 b/templates/knightPlatformer/assets/TheEnd.mp3 new file mode 100644 index 0000000..f720ed4 Binary files /dev/null and b/templates/knightPlatformer/assets/TheEnd.mp3 differ diff --git a/templates/knightPlatformer/assets/TheEnd_Sprite.png b/templates/knightPlatformer/assets/TheEnd_Sprite.png new file mode 100644 index 0000000..4ade300 Binary files /dev/null and b/templates/knightPlatformer/assets/TheEnd_Sprite.png differ diff --git a/templates/knightPlatformer/assets/Top arrow button.png b/templates/knightPlatformer/assets/Top arrow button.png new file mode 100644 index 0000000..7e5dc75 Binary files /dev/null and b/templates/knightPlatformer/assets/Top arrow button.png differ diff --git a/templates/knightPlatformer/assets/Unlock.wav b/templates/knightPlatformer/assets/Unlock.wav new file mode 100644 index 0000000..f02ae72 Binary files /dev/null and b/templates/knightPlatformer/assets/Unlock.wav differ diff --git a/templates/knightPlatformer/assets/Unlocked-1.png b/templates/knightPlatformer/assets/Unlocked-1.png new file mode 100644 index 0000000..a001a01 Binary files /dev/null and b/templates/knightPlatformer/assets/Unlocked-1.png differ diff --git a/templates/knightPlatformer/assets/You Win.png b/templates/knightPlatformer/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/knightPlatformer/assets/You Win.png differ diff --git a/templates/knightPlatformer/game.json b/templates/knightPlatformer/game.json new file mode 100644 index 0000000..6dfaf0d --- /dev/null +++ b/templates/knightPlatformer/game.json @@ -0,0 +1,12546 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 226, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.knightplatformer", + "pixelsRounding": false, + "projectUuid": "b530eee3-05b2-42a5-84b5-a94176fadc7e", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "knight-platformer-tutorial", + "version": "1.0.0", + "name": "Knight Platformer Tutorial", + "description": "An epic Knight platformer all about finding a key and escaping.", + "author": "", + "windowWidth": 768, + "windowHeight": 768, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": { + "android-icon-144": "", + "android-icon-192": "", + "android-icon-36": "", + "android-icon-48": "", + "android-icon-72": "", + "android-icon-96": "", + "android-windowSplashScreenAnimatedIcon": "", + "desktop-icon-512": "", + "ios-icon-100": "", + "ios-icon-1024": "", + "ios-icon-114": "", + "ios-icon-120": "", + "ios-icon-144": "", + "ios-icon-152": "", + "ios-icon-167": "", + "ios-icon-180": "", + "ios-icon-20": "", + "ios-icon-29": "", + "ios-icon-40": "", + "ios-icon-50": "", + "ios-icon-57": "", + "ios-icon-58": "", + "ios-icon-60": "", + "ios-icon-72": "", + "ios-icon-76": "", + "ios-icon-80": "", + "ios-icon-87": "", + "liluo-thumbnail": "" + }, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [ + "platformer" + ], + "playableDevices": [ + "keyboard" + ], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/Key_Sprite.png", + "kind": "image", + "metadata": "", + "name": "Key_Sprite.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Locked-1.png", + "kind": "image", + "metadata": "", + "name": "Locked-1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Unlocked-1.png", + "kind": "image", + "metadata": "", + "name": "Unlocked-1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Clouds.png", + "kind": "image", + "metadata": "", + "name": "Clouds.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Unlock.wav", + "kind": "audio", + "metadata": "", + "name": "Unlock.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Key.wav", + "kind": "audio", + "metadata": "", + "name": "Key.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/TheEnd_Sprite.png", + "kind": "image", + "metadata": "", + "name": "TheEnd_Sprite.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/NewSprite-1-0.png", + "kind": "image", + "metadata": "", + "name": "NewSprite-1-0.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/TheEnd.mp3", + "kind": "audio", + "metadata": "", + "name": "TheEnd.mp3", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Player_Mask_Sprite-1-0.png", + "kind": "image", + "metadata": "", + "name": "Player_Mask_Sprite-1-0.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Right arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Right arrow round button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Shaded Dark/225220b063f1e3e52063ea032322443a816241fb8e55c6461d437847c5e69eef_Right arrow round button.png", + "name": "Right arrow round button.png" + } + }, + { + "file": "assets/Left arrow round button.png", + "kind": "image", + "metadata": "", + "name": "Left arrow round button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Shaded Dark/f755ec56218a581fb4eb4c0c191db2c44a9a1e175dd364c230c211f0d9bd4e49_Left arrow round button.png", + "name": "Left arrow round button.png" + } + }, + { + "file": "assets/Top arrow button.png", + "kind": "image", + "metadata": "", + "name": "Top arrow button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/On-Screen Controls/Sprites/Flat Dark/e3943e1b23ceb90f00fc5e7c0481c5147b983fdc5397fb3690e102e53ce72d4f_Top arrow button.png", + "name": "Top arrow button.png" + } + }, + { + "file": "assets/Platform_Stone2.png", + "kind": "image", + "metadata": "", + "name": "Platform_Stone2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run1.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run2.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run3.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run3.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run4.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run5.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run5.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run6.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run6.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run7.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run7.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run8.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run8.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run9.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run9.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run10.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run10.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run11.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run11.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run12.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run12.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run13.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run13.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run14.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run14.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Run15.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run15.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Knight-Run16.png", + "kind": "image", + "metadata": "", + "name": "Knight-Run16.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Idle1.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Idle2.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Idle3.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Knight-Idle4.png", + "kind": "image", + "metadata": "", + "name": "Knight-Idle4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Platform_Stone1.png", + "kind": "image", + "metadata": "", + "name": "Platform_Stone1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Fire1.png", + "kind": "image", + "metadata": "", + "name": "assets\\Fire1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Fire2.png", + "kind": "image", + "metadata": "", + "name": "assets\\Fire2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Fire3.png", + "kind": "image", + "metadata": "", + "name": "assets\\Fire3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Fire4.png", + "kind": "image", + "metadata": "", + "name": "assets\\Fire4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Clouds.png", + "kind": "image", + "metadata": "", + "name": "assets\\Clouds.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/Shadow.png", + "kind": "image", + "metadata": "", + "name": "assets\\Shadow.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Platform_Stone1.png", + "kind": "image", + "metadata": "", + "name": "assets/Platform_Stone1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "You Win.png", + "kind": "image", + "metadata": "", + "name": "You Win.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": false, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [ + { + "name": "Key", + "type": "string", + "value": "0" + }, + { + "name": "DoubleJump", + "type": "string", + "value": "0" + }, + { + "name": "Level", + "type": "string", + "value": "2" + } + ], + "layouts": [ + { + "b": 255, + "disableInputWhenNotFocused": true, + "mangledName": "Level_321", + "name": "Level 1", + "r": 53, + "standardSortMethod": true, + "stopSoundsOnStartup": false, + "title": "", + "v": 190, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 6457087, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 0.7649530442593787, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Mobile_UI", + "objects": [ + { + "name": "RightArrow" + }, + { + "name": "LeftArrow" + }, + { + "name": "TopArrow" + } + ] + } + ], + "variables": [ + { + "folded": true, + "name": "JumpsRemaining", + "type": "number", + "value": 0 + } + ], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 76, + "layer": "", + "name": "KnightHitBox", + "persistentUuid": "0e59309a-e0ab-4975-bf90-02e652466dd9", + "width": 40, + "x": 64, + "y": 364, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Key", + "persistentUuid": "dde74005-f701-45a2-b7cf-137391d07c56", + "width": 0, + "x": 624, + "y": 96, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Door", + "persistentUuid": "9c79f608-b01e-46a5-a401-bfe38d67ef3c", + "width": 0, + "x": 64, + "y": 512, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Mobile_UI", + "name": "RightArrow", + "persistentUuid": "79fd4ead-4388-47a0-aacb-598aa2960d8a", + "width": 0, + "x": 128, + "y": 656, + "zOrder": 1004, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Mobile_UI", + "name": "LeftArrow", + "persistentUuid": "3b25a7cf-e7da-4a6c-bc65-e81bd7d12992", + "width": 0, + "x": 32, + "y": 656, + "zOrder": 1005, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Mobile_UI", + "name": "TopArrow", + "persistentUuid": "170270fd-46fb-47a0-92b7-6dc0447d36f4", + "width": 0, + "x": 656, + "y": 656, + "zOrder": 1006, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 256, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "a0702caa-e471-4044-b70f-eba9a6439754", + "width": 128, + "x": -64, + "y": 0, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "744fc0d9-9b76-4c52-88b7-9b8da8580705", + "width": 704, + "x": 0, + "y": 0, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 128, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "ea966734-7a3d-48d4-82c2-41cf7ee4045f", + "width": 64, + "x": 256, + "y": 256, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 192, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "af8c3384-0e88-4cc6-98ef-6cd90a9a9696", + "width": 128, + "x": -64, + "y": 448, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 128, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "38a721f6-59b7-47b6-a823-79624353246a", + "width": 896, + "x": -64, + "y": 640, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 192, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "d1d62516-8bc4-4ab7-8b2d-934c28b565d3", + "width": 128, + "x": 704, + "y": 0, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 256, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "e8f3cdf9-4bfa-43a8-89fb-2fe0b91efee9", + "width": 192, + "x": 640, + "y": 384, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "a66e84e1-e63b-440f-a937-80e3d6b162ba", + "width": 576, + "x": 256, + "y": 192, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 76, + "keepRatio": true, + "layer": "", + "name": "KnightArtwork", + "persistentUuid": "c762b7b1-7b81-4444-b77d-5a097ac1696f", + "width": 76, + "x": 122, + "y": 364, + "zOrder": 2000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 768, + "keepRatio": true, + "layer": "", + "name": "BackgroundTiled", + "persistentUuid": "e7d11ff4-0805-4625-9eeb-a459c05ed329", + "width": 768, + "x": 0, + "y": 0, + "zOrder": -1000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "e1f2ec5e-3f65-4234-bee6-f725487d4d78", + "width": 512, + "x": -64, + "y": 384, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "TilesWithGrass", + "persistentUuid": "10cd0309-0692-4da2-a79f-768318265039", + "width": 192, + "x": -64, + "y": 384, + "zOrder": 2001, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "KnightHitBox", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ScreenWrap", + "type": "ScreenWrap::ScreenWrap", + "HorizontalWrapping": true, + "VerticalWrapping": true, + "BorderTop": 0, + "BorderLeft": 0, + "BorderRight": 0, + "BorderBottom": 0, + "TriggerOffset": 40 + } + ], + "animations": [ + { + "name": "Player_Mask_Sprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Player_Mask_Sprite-1-0.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 12, + "y": 20 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Key", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "SineMovement", + "type": "SineMovement::SineMovement", + "HorizontalSpeed": 60, + "VerticalSpeed": 100, + "HorizontalDistance": 0, + "VerticalDistance": 10, + "CenterPointX": 0, + "CenterPointY": 0, + "SineProgressX": 0, + "SineProgressY": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Key_Sprite.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Door", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Locked", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.000009999999747378752, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Locked-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Unlocked", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Unlocked-1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "additive": true, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 350, + "emitterForceMax": 100, + "emitterForceMin": 45, + "flow": 45, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 15, + "name": "SparkleParticle", + "particleAlpha1": 150, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 28, + "particleBlue2": 255, + "particleColor1": "248;231;28", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": -80, + "particleGreen1": 231, + "particleGreen2": 255, + "particleLifeTimeMax": 1.5, + "particleLifeTimeMin": 0.30000001192092896, + "particleRed1": 248, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 100, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 6, + "rendererParam2": 2, + "rendererType": "Point", + "tank": 15, + "textureParticleName": "", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 4, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "e26c3feaa866cf2ae309981046b782ad51562fca555001b654183820af8188ba", + "name": "RightArrow", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "Outline", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Right arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "94e2baae235e1a8799fa16a06164492eaa579b3d61e331df75e588d66855b53d", + "name": "LeftArrow", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "Outline", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Left arrow round button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "9c727020616afdd6ba786b8af206a90481f07db0ca175ed6a4cc5b7e01c66d06", + "name": "TopArrow", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [ + { + "effectType": "Outline", + "name": "Outline", + "doubleParameters": { + "padding": 5, + "thickness": 5 + }, + "stringParameters": { + "color": "255;255;255" + }, + "booleanParameters": {} + } + ], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects", + "ButtonFSM": "ButtonFSM", + "Effect": "Effect", + "IdleEffect": "", + "FocusedEffect": "Outline", + "PressedEffect": "Outline" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Top arrow button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 80, + "y": 0 + }, + { + "x": 80, + "y": 80 + }, + { + "x": 0, + "y": 80 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Tiles", + "texture": "Platform_Stone2.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "KnightArtwork", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.12, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Walk", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.12, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Knight-Run1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run13.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run14.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run15.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run16.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 768, + "name": "BackgroundTiled", + "texture": "assets\\Clouds.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 768, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 64, + "name": "TilesWithGrass", + "texture": "assets/Platform_Stone1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 64, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "KnightHitBox" + }, + { + "objectName": "Key" + }, + { + "objectName": "Tiles" + }, + { + "objectName": "TilesWithGrass" + }, + { + "objectName": "KnightArtwork" + }, + { + "objectName": "Door" + }, + { + "objectName": "SparkleParticle" + }, + { + "objectName": "BackgroundTiled" + }, + { + "objectName": "RightArrow" + }, + { + "objectName": "LeftArrow" + }, + { + "objectName": "TopArrow" + } + ] + }, + "events": [ + { + "colorB": 155, + "colorG": 155, + "colorR": 155, + "creationTime": 0, + "folded": true, + "name": "Game play", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "KnightHitBox" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Mobile UI", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Mobile_UI", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Player", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change animation of the duck artwork" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "KnightArtwork", + "Animation", + "=", + "\"Walk\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "KnightArtwork", + "Animation", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change the position of duck artwork to follow the green duck object" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "KnightArtwork", + "=", + "KnightHitBox.CenterX()", + "=", + "KnightHitBox.CenterY()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Movement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move Left & Flip Artwork to the Left" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "Left" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "a" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "LeftArrow", + "ButtonFSM", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "KnightArtwork", + "Flippable", + "yes" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move Right & Flip Artwork to the Right" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "Right" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "d" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "RightArrow", + "ButtonFSM", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "KnightArtwork", + "Flippable", + "no" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Jumping" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::CanJump" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + } + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "JumpsRemaining", + ">", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make Duck Jump & Squash & Stretches the sprite" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "Up" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "w" + ] + }, + { + "type": { + "value": "KeyPressed" + }, + "parameters": [ + "Duck", + "Space" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "TopArrow", + "ButtonFSM", + "" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateControl" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject", + "\"Jump\"" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "JumpsRemaining", + "-", + "1" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetHeight" + }, + "parameters": [ + "KnightArtwork", + "Resizable", + "=", + "55" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "KnightArtwork", + "Resizable", + "=", + "70" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectWidthTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Squash Jump\"", + "64", + "\"linear\"", + "0.08", + "" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectHeightTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Stretch Jump\"", + "64", + "\"linear\"", + "0.08", + "" + ] + }, + { + "type": { + "value": "PlatformBehavior::SetCanJump" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + } + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Resets the Double Jump" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "JumpsRemaining", + "!=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "JumpsRemaining", + "=", + "2" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Effects", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Squash & Stretch" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetHeight" + }, + "parameters": [ + "KnightArtwork", + "Resizable", + "=", + "50" + ] + }, + { + "type": { + "value": "ResizableCapability::ResizableBehavior::SetWidth" + }, + "parameters": [ + "KnightArtwork", + "Resizable", + "=", + "100" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectHeightTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Stretch\"", + "76", + "\"linear\"", + "0.1", + "" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectWidthTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Squash\"", + "76", + "\"linear\"", + "0.1", + "" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "KnightHitBox", + "PlatformerObject" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Tween::TweenBehavior::AddObjectHeightTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Stretch Air\"", + "86", + "\"linear\"", + "0.08", + "" + ] + }, + { + "type": { + "value": "Tween::TweenBehavior::AddObjectWidthTween2" + }, + "parameters": [ + "KnightArtwork", + "Tween", + "\"Squash Air\"", + "65", + "\"linear\"", + "0.08", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Keys & Gates", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pick up Key" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "KnightHitBox", + "Key", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Key", + "=", + "1" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "SparkleParticle", + "Key.PointX(\"Center\")", + "Key.PointY(\"Center\")", + "\"Player\"" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Key.wav", + "", + "50", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Key", + "" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Unlock the Door" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "KnightHitBox", + "Door", + "", + "", + "" + ] + }, + { + "type": { + "value": "VarScene" + }, + "parameters": [ + "Key", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetIndex" + }, + "parameters": [ + "Door", + "Animation", + "=", + "1" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Unlock.wav", + "", + "50", + "" + ] + }, + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "Key", + "=", + "0" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Enter Door" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "KnightHitBox", + "Door", + "", + "", + "" + ] + }, + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::Name" + }, + "parameters": [ + "Door", + "Animation", + "=", + "\"Unlocked\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "0.5" + ] + }, + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Game End\"", + "" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Hide down arrow if not in collision with door" + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "CollisionNP" + }, + "parameters": [ + "KnightHitBox", + "Door", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 100663296, + "ambientLightColorG": 6037952, + "ambientLightColorR": 8426608, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Sky", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Mobile_UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "ButtonObjectEffects", + "type": "ButtonStates::ButtonObjectEffects" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "ScreenWrap", + "type": "ScreenWrap::ScreenWrap" + }, + { + "name": "SineMovement", + "type": "SineMovement::SineMovement" + }, + { + "name": "Tween", + "type": "Tween::TweenBehavior" + } + ] + }, + { + "b": 255, + "disableInputWhenNotFocused": true, + "mangledName": "Game_32End", + "name": "Game End", + "r": 53, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 190, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.8551636010983584, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "TheEnd", + "persistentUuid": "294f12f0-f2c2-4ae9-a471-a8ca7e7a7608", + "width": 0, + "x": 177, + "y": 216, + "zOrder": 1000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 224, + "layer": "", + "name": "BlackBars", + "persistentUuid": "010ccf9c-0718-4cb8-b06e-32032306c956", + "width": 768, + "x": 0, + "y": 544, + "zOrder": 101, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "BlackBars", + "persistentUuid": "6e6cbcda-2367-4759-92ec-7a14c48f9083", + "width": 768, + "x": 0, + "y": 0, + "zOrder": 101, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Clouds", + "persistentUuid": "6ce1be68-607f-46f8-a3bc-c2926b48eb3b", + "width": 0, + "x": 0, + "y": 0, + "zOrder": -1000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Tiles", + "persistentUuid": "331328b9-db48-457b-a4d7-039113e1a919", + "width": 768, + "x": 0, + "y": 576, + "zOrder": 106, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 64, + "keepRatio": true, + "layer": "", + "name": "Floorcaps", + "persistentUuid": "b2bca4ae-f79b-4cf8-98d6-f2e3cd546379", + "width": 768, + "x": 0, + "y": 512, + "zOrder": 107, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "KnightArtwork", + "persistentUuid": "fb467ab5-3264-448f-b8dc-34b689478cd3", + "width": 0, + "x": 486, + "y": 512, + "zOrder": 108, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "KnightArtwork", + "persistentUuid": "7555081d-5fdc-4067-8bc9-586720731e58", + "width": 0, + "x": 282, + "y": 512, + "zOrder": 108, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Fire", + "persistentUuid": "39c45b4e-f278-40e4-b7d6-d14018768886", + "width": 0, + "x": 320, + "y": 332, + "zOrder": 10, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Darkness", + "persistentUuid": "9a31aef3-121c-430a-9e6c-771bb31db8e1", + "width": 0, + "x": 0, + "y": 128, + "zOrder": 200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 382, + "layer": "", + "name": "EndingDialog", + "persistentUuid": "a2466b65-6f9d-4371-a8bd-3186df7a6a53", + "width": 318, + "x": 123, + "y": 75, + "zOrder": 1001, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "TheEnd", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "SineMovement", + "type": "SineMovement::SineMovement", + "HorizontalSpeed": 100, + "VerticalSpeed": 100, + "HorizontalDistance": 0, + "VerticalDistance": 10, + "CenterPointX": 0, + "CenterPointY": 0, + "SineProgressX": 0, + "SineProgressY": 0 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "TheEnd_Sprite.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "BlackBars", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "NewSprite", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "NewSprite-1-0.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Clouds", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Clouds.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Tiles", + "texture": "Platform_Stone2.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 64, + "name": "Floorcaps", + "texture": "Platform_Stone1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 64, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "KnightArtwork", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.12, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Idle4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Walk", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.12, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Knight-Run1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run13.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run14.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run15.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Knight-Run16.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 38, + "y": 76 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Fire", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.12, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\Fire1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 23 + }, + { + "x": 31, + "y": 23 + }, + { + "x": 31, + "y": 48 + }, + { + "x": 2, + "y": 48 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\Fire2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 23 + }, + { + "x": 31, + "y": 23 + }, + { + "x": 31, + "y": 48 + }, + { + "x": 2, + "y": 48 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\Fire3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 23 + }, + { + "x": 31, + "y": 23 + }, + { + "x": 31, + "y": 48 + }, + { + "x": 2, + "y": 48 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\Fire4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 23 + }, + { + "x": 31, + "y": 23 + }, + { + "x": 31, + "y": 48 + }, + { + "x": 2, + "y": 48 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Darkness", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\Shadow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 768, + "y": 0 + }, + { + "x": 768, + "y": 512 + }, + { + "x": 0, + "y": 512 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "TheEnd" + }, + { + "objectName": "Clouds" + }, + { + "objectName": "Tiles" + }, + { + "objectName": "Floorcaps" + }, + { + "objectName": "KnightArtwork" + }, + { + "objectName": "BlackBars" + }, + { + "objectName": "Fire" + }, + { + "objectName": "Darkness" + }, + { + "objectName": "EndingDialog" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "EndingDialog" + ] + }, + { + "type": { + "value": "PlayMusic" + }, + "parameters": [ + "", + "TheEnd.mp3", + "yes", + "", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "KnightArtwork", + ">", + "Fire.X()" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "KnightArtwork", + "Flippable", + "yes" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "2" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "EndingDialog", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 8885672, + "ambientLightColorG": 150995054, + "ambientLightColorR": 1869182049, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "SineMovement", + "type": "SineMovement::SineMovement" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": "", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.1.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyShouldCheckHovering" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)", + "TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyIndex())" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyMouseIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyTouchIsInside" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTouchId()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyIdleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyIdleEffect()", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyFocusedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyFocusedEffect()", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::PropertyPressedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyPressedEffect()", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyIdleEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyFocusedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedEffect()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffects::SetPropertyPressedEffect" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFocusedAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyPressedAnimationName()" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyIdleAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyFocusedAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedAnimationName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonAnimationName::SetPropertyPressedAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIdleValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleValue()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedValue()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedValue()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedValue()", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFadeInDuration()", + "Object.Behavior::PropertyFadeInEasing()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFadeOutDuration()", + "Object.Behavior::PropertyFadeOutEasing()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenInitialValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyEffectValue()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTargetedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenInitialValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyEffectValue()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTargetedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "GetArgumentAsNumber(\"Duration\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Tween::Ease(GetArgumentAsString(\"Easing\"), Object.Behavior::PropertyTweenInitialValue(), Object.Behavior::PropertyTweenTargetedValue(), Object.Behavior::PropertyTweenTime() / GetArgumentAsNumber(\"Duration\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PropertyTweenTime" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "GetArgumentAsNumber(\"Duration\")" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyTweenState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyTweenTargetedValue()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "Object.Behavior::PropertyEffectName()", + "Object.Behavior::PropertyEffectProperty()", + "Object.Behavior::PropertyEffectValue()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyEffectName()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyEffectProperty()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyEffectProperty" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "EffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "PropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyIdleValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyIdleValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFocusedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyPressedValue()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyPressedValue" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "Object.Behavior::PropertyIdleScale()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleScale()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedScale()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedScale()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedScale()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "GetArgumentAsNumber(\"Value\")", + "GetArgumentAsNumber(\"Value\")", + "Object.Behavior::PropertyFadeInEasing()", + "1000 * Object.Behavior::PropertyFadeInDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "GetArgumentAsNumber(\"Value\")", + "GetArgumentAsNumber(\"Value\")", + "Object.Behavior::PropertyFadeOutEasing()", + "1000 * Object.Behavior::PropertyFadeOutDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyIdleScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyIdleScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFocusedScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyPressedScale()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyPressedScale" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonScaleTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyIdleColorTint()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyIdleColorTint()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedColorTint()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFocusedColorTint()", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::PropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPreviousState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyPressedColorTint()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "GetArgumentAsString(\"Value\")", + "Object.Behavior::PropertyFadeInEasing()", + "1000 * Object.Behavior::PropertyFadeInDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "GetArgumentAsString(\"Value\")", + "Object.Behavior::PropertyFadeOutEasing()", + "1000 * Object.Behavior::PropertyFadeOutDuration()", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyIdleColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyIdleColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFocusedColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFocusedColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyPressedColorTint()" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyPressedColorTint" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeInDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutDuration()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeOutDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeInEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeInEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyFadeOutEasing()" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::SetPropertyFadeOutEasing" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Tristan Rhodes (tristan@victrisgames.com), Entropy", + "category": "", + "extensionNamespace": "", + "fullName": "Screen Wrap", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vbml0b3Itc2NyZWVuc2hvdCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik05LDZINVYxMEg3VjhIOU0xOSwxMEgxN1YxMkgxNVYxNEgxOU0yMSwxNkgzVjRIMjFNMjEsMkgzQzEuODksMiAxLDIuODkgMSw0VjE2QTIsMiAwIDAsMCAzLDE4SDEwVjIwSDhWMjJIMTZWMjBIMTRWMThIMjFBMiwyIDAgMCwwIDIzLDE2VjRDMjMsMi44OSAyMi4xLDIgMjEsMiIgLz48L3N2Zz4=", + "name": "ScreenWrap", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/monitor-screenshot.svg", + "shortDescription": "Teleport objects leaving one side of the screen so that they immediately reappear on the opposite side, maintaining speed and trajectory.", + "version": "0.1.5", + "description": [ + "By default, the borders of the wrapping area match the screen size, but they can be changed.", + "", + "The teleport happens when the center of the object crosses a border. In the behavior properties, you can modify (increase or decrease) the margin used to trigger this teleport." + ], + "origin": { + "identifier": "ScreenWrap", + "name": "gdevelop-extension-store" + }, + "tags": [ + "screen", + "wrap", + "teleport" + ], + "authorIds": [ + "q8ubdigLvIRXLxsJDDTaokO41mc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Teleport the object when leaving one side of the screen so that it immediately reappears on the opposite side, maintaining speed and trajectory.", + "fullName": "Screen Wrap", + "name": "ScreenWrap", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Initialize variables (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::PropertyBorderBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetBottomBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowHeight()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::PropertyBorderRight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetRightBorder" + }, + "parameters": [ + "Object", + "Behavior", + "SceneWindowWidth()", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 5, + "colorG": 117, + "colorR": 65, + "creationTime": 0, + "name": "ScreenWrap", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object to opposite side (if needed)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::PropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyBorderRight() - (Object.Width()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderLeft() - (Object.Width()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::PropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyBorderBottom() - (Object.Height()/2) + Object.Behavior::PropertyTriggerOffset()" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyBorderTop() - (Object.Height()/2) - Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the left and right borders.", + "fullName": "Is horizontal wrapping", + "functionType": "Condition", + "name": "IsHorizontalWrapping", + "sentence": "_PARAM0_ is horizontal wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Horizontal\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Horizontal\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the object is wrapping on the top and bottom borders.", + "fullName": "Is vertical wrapping", + "functionType": "Condition", + "name": "IsVerticalWrapping", + "sentence": "_PARAM0_ is vertical wrapping", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Vertical\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Vertical\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the left and right borders.", + "fullName": "Enable horizontal wrapping", + "functionType": "Action", + "name": "EnableHorizontalWrapping", + "sentence": "Enable _PARAM0_ horizontal wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyHorizontalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableHorizontalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable wrapping on the top and bottom borders.", + "fullName": "Enable vertical wrapping", + "functionType": "Action", + "name": "EnableVerticalWrapping", + "sentence": "Enable _PARAM0_ vertical wrapping: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableVerticalWrapping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyVerticalWrapping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Value", + "name": "EnableVerticalWrapping", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Top border (Y position).", + "fullName": "Top border", + "functionType": "Expression", + "name": "BorderTop", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Left border (X position).", + "fullName": "Left border", + "functionType": "Expression", + "name": "BorderLeft", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Right border (X position).", + "fullName": "Right border", + "functionType": "Expression", + "name": "BorderRight", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Bottom border (Y position).", + "fullName": "Bottom border", + "functionType": "Expression", + "name": "BorderBottom", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyBorderBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Number of pixels past the center where the object teleports and appears.", + "fullName": "Trigger offset", + "functionType": "Expression", + "name": "TriggerOffset", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyTriggerOffset()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set top border (Y position).", + "fullName": "Set top border", + "functionType": "Action", + "name": "SetTopBorder", + "sentence": "Set _PARAM0_ top border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Top border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set left border (X position).", + "fullName": "Set left border", + "functionType": "Action", + "name": "SetLeftBorder", + "sentence": "Set _PARAM0_ left border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderLeft" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Left border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set bottom border (Y position).", + "fullName": "Set bottom border", + "functionType": "Action", + "name": "SetBottomBorder", + "sentence": "Set _PARAM0_ bottom border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Bottom border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set right border (X position).", + "fullName": "Set right border", + "functionType": "Action", + "name": "SetRightBorder", + "sentence": "Set _PARAM0_ right border to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyBorderRight" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "Right border value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set trigger offset (pixels).", + "fullName": "Set trigger offset", + "functionType": "Action", + "name": "SetTriggerOffset", + "sentence": "Set _PARAM0_ trigger offset to _PARAM2_ pixels", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScreenWrap::ScreenWrap::SetPropertyTriggerOffset" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ScreenWrap::ScreenWrap", + "type": "behavior" + }, + { + "description": "SetScreen Offset Leaving Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Horizontal wrapping", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalWrapping" + }, + { + "value": "true", + "type": "Boolean", + "label": "Vertical wrapping", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalWrapping" + }, + { + "value": "0", + "type": "Number", + "label": "Top border of wrapped area (Y). If blank, the value will be 0.", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderTop" + }, + { + "value": "0", + "type": "Number", + "label": "Left border of wrapped area (X). If blank, the value will be 0.", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderLeft" + }, + { + "value": "0", + "type": "Number", + "label": "Right border of wrapped area (X). If blank, the value will be the scene width.", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderRight" + }, + { + "value": "0", + "type": "Number", + "label": "Bottom border of wrapped area (Y). If blank, the value will be scene height.", + "description": "", + "group": "", + "extraInformation": [], + "name": "BorderBottom" + }, + { + "value": "0", + "type": "Number", + "label": "Number of pixels past the center where the object teleports and appears", + "description": "", + "group": "", + "extraInformation": [], + "name": "TriggerOffset" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian, Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "", + "extensionNamespace": "", + "fullName": "Sine (or ellipsis) Movement", + "gdevelopVersion": "", + "helpPath": "https://victrisgames.itch.io/extension-sinemovement-and-deptheffect", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNpbmUtd2F2ZSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNi41LDIxQzEzLjUsMjEgMTIuMzEsMTYuNzYgMTEuMDUsMTIuMjhDMTAuMTQsOS4wNCA5LDUgNy41LDVDNC4xMSw1IDQsMTEuOTMgNCwxMkgyQzIsMTEuNjMgMi4wNiwzIDcuNSwzQzEwLjUsMyAxMS43MSw3LjI1IDEyLjk3LDExLjc0QzEzLjgzLDE0LjggMTUsMTkgMTYuNSwxOUMxOS45NCwxOSAyMC4wMywxMi4wNyAyMC4wMywxMkgyMi4wM0MyMi4wMywxMi4zNyAyMS45NywyMSAxNi41LDIxWiIgLz48L3N2Zz4=", + "name": "SineMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/sine-wave.svg", + "shortDescription": "Allow an object to move smoothly on the X and/or Y axis following a sine wave, or an ellipsis.", + "version": "0.0.5", + "description": [ + "Allow an object to move smoothly on the X and/or Y axis following a sine wave, or an ellipsis.", + "", + "", + "Example uses:", + "- Floating objects, such as powerups or coins", + "- Moveable platforms", + "- Enemy movement patterns", + "", + "Properties:", + "- Horizontal distance", + "- Vertical distance", + "- Horizontal speed", + "- Vertical speed", + "- Center of movement, X position", + "- Center of movement, Y position", + "", + "Tips:", + "- For circular or elliptical movement, the horizontal and vertical speed need to be the same", + "- For horizontal movement only, set vertical distance to 0", + "- For vertical movement only, set horizontal distance to 0", + "- For figure-8 movement, set horizontal speed to 1/2 of the vertical speed" + ], + "origin": { + "identifier": "SineMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "sine", + "ellipsis", + "movement", + "circular", + "circle", + "floating", + "platform", + "enemy" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Allow an object to move smoothly on the X and/or Y axis following a sine wave.\n\nExample uses:\n- Floating pickups\n- Moveable platforms\n- Enemy movement\n\nProperties:\n- Center of movement, X position\n- Center of movement, Y position\n- Horizontal distance\n- Vertical distance\n- Horizontal speed\n- Horizontal distance\n\nTips:\n- For circular or elliptical movement, the horizontal and vertical speed need to be the same\n- For horizontal movement, set vertical distance to 0\n- For vertical movement, set horizontal distance to 0\n- For figure-8 movement, set horizontal speed to 1/2 of the vertical speed.", + "fullName": "Sine Movement", + "name": "SineMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the center of movement to the initial location of the object" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SineMovement::SineMovement::PropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SineMovement::SineMovement::PropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Y()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move the object" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SineMovement::SineMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointX() + cos(ToRad(Object.Behavior::PropertySineProgressX())) * Object.Behavior::PropertyHorizontalDistance()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SineMovement::SineMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointY() + sin(ToRad(Object.Behavior::PropertySineProgressY())) * Object.Behavior::PropertyVerticalDistance()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increment counters that are used to calculate movement" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertySineProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyHorizontalSpeed() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertySineProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Behavior::PropertyVerticalSpeed() * TimeDelta()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Counter used to change the Y position of the object.", + "fullName": "Sine progress Y", + "functionType": "Expression", + "name": "SineProgressY", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertySineProgressY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Counter used to change the X position of the object.", + "fullName": "Sine progress X", + "functionType": "Expression", + "name": "SineProgressX", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertySineProgressX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Horizontal speed.", + "fullName": "Horizontal speed ", + "functionType": "Expression", + "name": "HorizontalSpeed", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalSpeed()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Vertical speed.", + "fullName": "Vertical speed", + "functionType": "Expression", + "name": "VerticalSpeed", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyVerticalSpeed()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Horizontal distance.", + "fullName": "Horizontal distance", + "functionType": "Expression", + "name": "HorizontalDistance", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalDistance()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Vertical distance.", + "fullName": "Vertical distance", + "functionType": "Expression", + "name": "VerticalDistance", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyVerticalDistance()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Center of movement, X position.", + "fullName": "Center of movement, X position", + "functionType": "Expression", + "name": "CenterX", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCenterPointX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Center of movement, Y position.", + "fullName": "Center of movement, Y position", + "functionType": "Expression", + "name": "CenterY", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCenterPointY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set center Y position.", + "fullName": "Set center Y position", + "functionType": "Action", + "name": "SetCenterY", + "sentence": "Set center Y position of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "Y position", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set center X position.", + "fullName": "Set center X position", + "functionType": "Action", + "name": "SetCenterX", + "sentence": "Set center X position of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "X position", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set horizontal distance.", + "fullName": "Set horizontal distance", + "functionType": "Action", + "name": "SetHorizontalDistance", + "sentence": "Set horizontal distance of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "Distance", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set vertical distance.", + "fullName": "Set vertical distance", + "functionType": "Action", + "name": "SetVerticalDistance", + "sentence": "Set vertical distance of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "Distance", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set horizontal speed.", + "fullName": "Set horizontal speed", + "functionType": "Action", + "name": "SetHorizontalSpeed", + "sentence": "Set horizontal speed of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyHorizontalSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "Speed (in degrees per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set vertical speed.", + "fullName": "Set vertical speed", + "functionType": "Action", + "name": "SetVerticalSpeed", + "sentence": "Set vertical speed of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertyVerticalSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + }, + { + "description": "Speed (in degrees per second)", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Reset sine progress counters. The object will return to the initial state.", + "fullName": "Reset sine progress counters", + "functionType": "Action", + "name": "ResetSineCounters", + "sentence": "Reset sine progress counters on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SineMovement::SineMovement::SetPropertySineProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SineMovement::SineMovement::SetPropertySineProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SineMovement::SineMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "60", + "type": "Number", + "label": "Horizontal speed, in degrees per second", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalSpeed" + }, + { + "value": "60", + "type": "Number", + "label": "Vertical speed, in degrees per second", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalSpeed" + }, + { + "value": "100", + "type": "Number", + "label": "Horizontal distance: amplitude of the movement on X axis (0 to deactivate)", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalDistance" + }, + { + "value": "0", + "type": "Number", + "label": "Vertical distance: amplitude of the movement on Y axis (0 to deactivate)", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalDistance" + }, + { + "value": "0", + "type": "Number", + "label": "Center of movement, X position", + "description": "", + "group": "", + "extraInformation": [], + "name": "CenterPointX" + }, + { + "value": "0", + "type": "Number", + "label": "Center of movement, Y position", + "description": "", + "group": "", + "extraInformation": [], + "name": "CenterPointY" + }, + { + "value": "0", + "type": "Number", + "label": "Counter used to change X position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "SineProgressX" + }, + { + "value": "0", + "type": "Number", + "label": "Counter used to change Y position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "SineProgressY" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/object3d/assets/A Button.png b/templates/object3d/assets/A Button.png new file mode 100644 index 0000000..42f76ea Binary files /dev/null and b/templates/object3d/assets/A Button.png differ diff --git a/templates/object3d/assets/BlackCheckered.png b/templates/object3d/assets/BlackCheckered.png new file mode 100644 index 0000000..5967eb1 Binary files /dev/null and b/templates/object3d/assets/BlackCheckered.png differ diff --git a/templates/object3d/assets/Button_Open_1.png b/templates/object3d/assets/Button_Open_1.png new file mode 100644 index 0000000..c2e281c Binary files /dev/null and b/templates/object3d/assets/Button_Open_1.png differ diff --git a/templates/object3d/assets/Button_Open_2.png b/templates/object3d/assets/Button_Open_2.png new file mode 100644 index 0000000..517066d Binary files /dev/null and b/templates/object3d/assets/Button_Open_2.png differ diff --git a/templates/object3d/assets/Button_Open_3.png b/templates/object3d/assets/Button_Open_3.png new file mode 100644 index 0000000..4167bd6 Binary files /dev/null and b/templates/object3d/assets/Button_Open_3.png differ diff --git a/templates/object3d/assets/Character Orange_Fall_1.png b/templates/object3d/assets/Character Orange_Fall_1.png new file mode 100644 index 0000000..b7c590a Binary files /dev/null and b/templates/object3d/assets/Character Orange_Fall_1.png differ diff --git a/templates/object3d/assets/Character Orange_Fall_2.png b/templates/object3d/assets/Character Orange_Fall_2.png new file mode 100644 index 0000000..8042932 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Fall_2.png differ diff --git a/templates/object3d/assets/Character Orange_Fall_3.png b/templates/object3d/assets/Character Orange_Fall_3.png new file mode 100644 index 0000000..18ad532 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Fall_3.png differ diff --git a/templates/object3d/assets/Character Orange_Fall_4.png b/templates/object3d/assets/Character Orange_Fall_4.png new file mode 100644 index 0000000..d0f144d Binary files /dev/null and b/templates/object3d/assets/Character Orange_Fall_4.png differ diff --git a/templates/object3d/assets/Character Orange_Jump_10.png b/templates/object3d/assets/Character Orange_Jump_10.png new file mode 100644 index 0000000..b264de8 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Jump_10.png differ diff --git a/templates/object3d/assets/Character Orange_Jump_11.png b/templates/object3d/assets/Character Orange_Jump_11.png new file mode 100644 index 0000000..6a7a762 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Jump_11.png differ diff --git a/templates/object3d/assets/Character Orange_Jump_7.png b/templates/object3d/assets/Character Orange_Jump_7.png new file mode 100644 index 0000000..8c071ff Binary files /dev/null and b/templates/object3d/assets/Character Orange_Jump_7.png differ diff --git a/templates/object3d/assets/Character Orange_Jump_8.png b/templates/object3d/assets/Character Orange_Jump_8.png new file mode 100644 index 0000000..ab9e44e Binary files /dev/null and b/templates/object3d/assets/Character Orange_Jump_8.png differ diff --git a/templates/object3d/assets/Character Orange_Jump_9.png b/templates/object3d/assets/Character Orange_Jump_9.png new file mode 100644 index 0000000..084f6c1 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Jump_9.png differ diff --git a/templates/object3d/assets/Character Orange_Ledge Grab_1.png b/templates/object3d/assets/Character Orange_Ledge Grab_1.png new file mode 100644 index 0000000..a7e1789 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Ledge Grab_1.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_1.png b/templates/object3d/assets/Character Orange_Stand_1.png new file mode 100644 index 0000000..449684b Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_1.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_10.png b/templates/object3d/assets/Character Orange_Stand_10.png new file mode 100644 index 0000000..92143ca Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_10.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_11.png b/templates/object3d/assets/Character Orange_Stand_11.png new file mode 100644 index 0000000..8e9b5f5 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_11.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_12.png b/templates/object3d/assets/Character Orange_Stand_12.png new file mode 100644 index 0000000..2f76448 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_12.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_2.png b/templates/object3d/assets/Character Orange_Stand_2.png new file mode 100644 index 0000000..e380fe1 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_2.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_3.png b/templates/object3d/assets/Character Orange_Stand_3.png new file mode 100644 index 0000000..083de40 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_3.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_4.png b/templates/object3d/assets/Character Orange_Stand_4.png new file mode 100644 index 0000000..7466921 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_4.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_5.png b/templates/object3d/assets/Character Orange_Stand_5.png new file mode 100644 index 0000000..420c61f Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_5.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_6.png b/templates/object3d/assets/Character Orange_Stand_6.png new file mode 100644 index 0000000..805bb56 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_6.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_7.png b/templates/object3d/assets/Character Orange_Stand_7.png new file mode 100644 index 0000000..a313323 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_7.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_8.png b/templates/object3d/assets/Character Orange_Stand_8.png new file mode 100644 index 0000000..09b995d Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_8.png differ diff --git a/templates/object3d/assets/Character Orange_Stand_9.png b/templates/object3d/assets/Character Orange_Stand_9.png new file mode 100644 index 0000000..4be9ffb Binary files /dev/null and b/templates/object3d/assets/Character Orange_Stand_9.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_1.png b/templates/object3d/assets/Character Orange_Walk_1.png new file mode 100644 index 0000000..de4727b Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_1.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_2.png b/templates/object3d/assets/Character Orange_Walk_2.png new file mode 100644 index 0000000..083e985 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_2.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_3.png b/templates/object3d/assets/Character Orange_Walk_3.png new file mode 100644 index 0000000..150155c Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_3.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_4.png b/templates/object3d/assets/Character Orange_Walk_4.png new file mode 100644 index 0000000..520076f Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_4.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_5.png b/templates/object3d/assets/Character Orange_Walk_5.png new file mode 100644 index 0000000..6bcc981 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_5.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_6.png b/templates/object3d/assets/Character Orange_Walk_6.png new file mode 100644 index 0000000..424ef70 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_6.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_7.png b/templates/object3d/assets/Character Orange_Walk_7.png new file mode 100644 index 0000000..a5f063f Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_7.png differ diff --git a/templates/object3d/assets/Character Orange_Walk_8.png b/templates/object3d/assets/Character Orange_Walk_8.png new file mode 100644 index 0000000..0a4c733 Binary files /dev/null and b/templates/object3d/assets/Character Orange_Walk_8.png differ diff --git a/templates/object3d/assets/Death.wav b/templates/object3d/assets/Death.wav new file mode 100644 index 0000000..cf4c4b6 Binary files /dev/null and b/templates/object3d/assets/Death.wav differ diff --git a/templates/object3d/assets/Flat light joystick border.png b/templates/object3d/assets/Flat light joystick border.png new file mode 100644 index 0000000..24e1cfe Binary files /dev/null and b/templates/object3d/assets/Flat light joystick border.png differ diff --git a/templates/object3d/assets/Flat light joystick thumb.png b/templates/object3d/assets/Flat light joystick thumb.png new file mode 100644 index 0000000..d21ac51 Binary files /dev/null and b/templates/object3d/assets/Flat light joystick thumb.png differ diff --git a/templates/object3d/assets/Orange Arrow.png b/templates/object3d/assets/Orange Arrow.png new file mode 100644 index 0000000..7347018 Binary files /dev/null and b/templates/object3d/assets/Orange Arrow.png differ diff --git a/templates/object3d/assets/RedCheckered.png b/templates/object3d/assets/RedCheckered.png new file mode 100644 index 0000000..e96da13 Binary files /dev/null and b/templates/object3d/assets/RedCheckered.png differ diff --git a/templates/object3d/assets/WhiteCheckered.png b/templates/object3d/assets/WhiteCheckered.png new file mode 100644 index 0000000..23541e5 Binary files /dev/null and b/templates/object3d/assets/WhiteCheckered.png differ diff --git a/templates/object3d/assets/WinGame.wav b/templates/object3d/assets/WinGame.wav new file mode 100644 index 0000000..fbc2971 Binary files /dev/null and b/templates/object3d/assets/WinGame.wav differ diff --git a/templates/object3d/assets/You Win.png b/templates/object3d/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/object3d/assets/You Win.png differ diff --git a/templates/object3d/game.json b/templates/object3d/game.json new file mode 100644 index 0000000..a0275f6 --- /dev/null +++ b/templates/object3d/game.json @@ -0,0 +1,20805 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 227, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.platformer3dtutorial", + "pixelsRounding": false, + "projectUuid": "f1f1c1c9-25ab-4ff5-89af-7061d8c42bf0", + "scaleMode": "linear", + "sizeOnStartupMode": "adaptWidth", + "templateSlug": "platformer-3d-tutorial", + "version": "1.0.0", + "name": "3d Object Tutorial", + "description": "3D platformer tutorial example designed to teach people how to set up 3D cube objects and 3D scenes.", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/BlackCheckered.png", + "kind": "image", + "metadata": "", + "name": "BlackCheckered.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/WhiteCheckered.png", + "kind": "image", + "metadata": "", + "name": "WhiteCheckered.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Stand_1.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_1.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_2.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_2.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_3.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_3.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_4.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_4.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_5.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_5.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_6.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_6.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_7.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_7.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_8.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_8.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_9.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_9.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_10.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_10.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Stand_11.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_11.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Stand_12.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Stand_12.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Walk_1.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Walk_2.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_2.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Walk_3.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_3.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Walk_4.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_4.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Walk_5.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_5.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Walk_6.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_6.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Walk_7.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_7.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Character Orange_Walk_8.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Walk_8.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_7.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_7.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_8.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_8.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_9.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_9.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_10.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_10.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_11.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_11.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Fall_1.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Fall_1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Fall_2.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Fall_2.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Fall_3.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Fall_3.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Fall_4.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Fall_4.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Button_Open_1.png", + "kind": "image", + "metadata": "", + "name": "Button_Open_1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Button_Open_2.png", + "kind": "image", + "metadata": "", + "name": "Button_Open_2.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Button_Open_3.png", + "kind": "image", + "metadata": "", + "name": "Button_Open_3.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Jump_8.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Jump_82.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Character Orange_Ledge Grab_1.png", + "kind": "image", + "metadata": "", + "name": "Character Orange_Ledge Grab_1.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/WinGame.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.18,\\\"sustainPunch\\\":0,\\\"decay\\\":0.39,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":700,\\\"frequencySweep\\\":600,\\\"frequencyDeltaSweep\\\":800,\\\"repeatFrequency\\\":7.5,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"triangle\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":45,\\\"squareDutySweep\\\":-20,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"WinGame\"}}", + "name": "WinGame", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Orange Arrow.png", + "kind": "image", + "metadata": "", + "name": "Orange Arrow.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Flat light joystick border.png", + "kind": "image", + "metadata": "", + "name": "Flat light joystick border.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/ab72105ef4577d93b002f4b6f9b6095f7db7e346da37bcffa2977edf61ac231d_Flat light joystick border.png", + "name": "Flat light joystick border.png" + } + }, + { + "file": "assets/Flat light joystick thumb.png", + "kind": "image", + "metadata": "", + "name": "Flat light joystick thumb.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/0acabda67390a4e4aa8b1023454400432c202efb1a525070784c756f61de7e81_Flat light joystick thumb.png", + "name": "Flat light joystick thumb.png" + } + }, + { + "file": "assets/A Button.png", + "kind": "image", + "metadata": "", + "name": "A Button.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Controller And Input Icons/Button/Button/x128/Light Dark/67eb208b2a0557aa6bf791a9a6bc1404b17203406faeb4cfa93ddea284890237_A Button.png", + "name": "A Button.png" + } + }, + { + "file": "assets/Death.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.08,\\\"sustainPunch\\\":30,\\\"decay\\\":0.33,\\\"tremoloDepth\\\":32,\\\"tremoloFrequency\\\":57,\\\"frequency\\\":10000,\\\"frequencySweep\\\":-4500,\\\"frequencyDeltaSweep\\\":-4400,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"brownnoise\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1.4000000000000001,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Death\"}}", + "name": "Death", + "preloadAsMusic": false, + "preloadAsSound": false, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/RedCheckered.png", + "kind": "image", + "metadata": "", + "name": "assets\\RedCheckered.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": true, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": false, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.3437520241612354, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 248, + "layer": "", + "locked": true, + "name": "Player", + "persistentUuid": "17cd86c8-c414-4f1a-8882-222df2e1fb96", + "sealed": true, + "width": 253, + "x": -32, + "y": 168, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 50, + "layer": "", + "locked": true, + "name": "Goal", + "persistentUuid": "5978a44b-9b96-4b35-9804-b0056e917de9", + "sealed": true, + "width": 100, + "x": 1532, + "y": 540, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 736, + "layer": "Background", + "locked": true, + "name": "Background", + "persistentUuid": "824bc678-324f-48ff-aca1-99016ce82937", + "sealed": true, + "width": 1312, + "x": 0, + "y": -832, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "", + "locked": true, + "name": "FailLine", + "persistentUuid": "61426111-f54f-421a-baaf-76508bfbf3d4", + "sealed": true, + "width": 1856, + "x": -448, + "y": 832, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "locked": true, + "name": "FailMarker", + "persistentUuid": "111bbf51-8d30-4ee2-88aa-d5e901ffe123", + "sealed": true, + "width": 1536, + "x": -320, + "y": 832, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "81f70a3b-c715-40a2-a429-3120543f8dd8", + "sealed": true, + "width": 0, + "x": 736, + "y": 512, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "8be476ed-5106-4e10-92e5-3f5c888f2136", + "sealed": true, + "width": 0, + "x": 736, + "y": 613, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "98e274b4-c896-4a0d-87a3-7c18feb8d39c", + "sealed": true, + "width": 0, + "x": 1760, + "y": 96, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "96161c03-f483-4e22-8a73-8ac6fdc70855", + "sealed": true, + "width": 0, + "x": 1760, + "y": 197, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "600b2d16-fa18-4a30-baa2-14e191f93918", + "sealed": true, + "width": 0, + "x": 1760, + "y": -5, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "9296c572-0b3d-4b52-a358-d00d35ecf65c", + "sealed": true, + "width": 0, + "x": 384, + "y": 96, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "106a1cee-3ecc-4e74-8b90-8abf5512b3eb", + "sealed": true, + "width": 0, + "x": 384, + "y": 197, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "3235a77a-f507-4b2c-9ff6-2f64923f3b8e", + "sealed": true, + "width": 0, + "x": 384, + "y": -5, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "d9fe1ccb-2e42-45bf-8ba2-5e0bb29a03b8", + "sealed": true, + "width": 0, + "x": 1088, + "y": 96, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "62fc5177-13de-47b8-b190-bb8b11ce0607", + "sealed": true, + "width": 0, + "x": 1088, + "y": 197, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "1f72dd43-6e19-42f2-a35e-f6980e188c36", + "sealed": true, + "width": 0, + "x": 1088, + "y": -5, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Arrow", + "persistentUuid": "0b489c55-dac1-44a4-85be-cca12f8a0c25", + "sealed": true, + "width": 0, + "x": 34, + "y": 96, + "zOrder": -20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "MobileUI", + "locked": true, + "name": "FlatLightJoystick", + "persistentUuid": "c51d2f52-5891-4f51-b03e-a2d73bb83619", + "sealed": true, + "width": 0, + "x": 144, + "y": 592, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "MobileUI", + "locked": true, + "name": "AButton", + "persistentUuid": "1f2f4b77-1281-4d99-a0af-133d458d38f2", + "sealed": true, + "width": 0, + "x": 1088, + "y": 544, + "zOrder": 8, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "77eef8a8-9b51-4b28-a234-e064a32dda1b", + "sealed": true, + "width": 0, + "x": 1760, + "y": 601, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "bf70890a-de2e-4416-93d9-81e9ea3d19ab", + "sealed": true, + "width": 0, + "x": 1760, + "y": 298, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "18739e85-8f50-452a-b05b-020b1b225871", + "sealed": true, + "width": 0, + "x": 1760, + "y": 399, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "4c1a547f-5822-4cc7-a9db-39e6b5386bba", + "sealed": true, + "width": 0, + "x": 1760, + "y": 500, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 45, + "customSize": false, + "height": 0, + "layer": "", + "locked": true, + "name": "Danger", + "persistentUuid": "695356e2-29f1-447c-8f6f-a85fd9ff3efe", + "sealed": true, + "width": 0, + "x": 740, + "y": 427, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "EnableAnimationChanges": true, + "EnableHorizontalFlipping": true, + "IdleAnimationName": "Idle", + "RunAnimationName": "Run", + "JumpAnimationName": "Jump", + "FallAnimationName": "Fall", + "ClimbAnimationName": "Climb", + "PlatformerBehavior": "PlatformerObject" + }, + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "Property": "PlatformerObject", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "JumpButton": "A" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "jumpSpeed": 1000, + "jumpSustainTime": 0.2, + "acceleration": 1500, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 1500, + "gravity": 1000, + "ignoreDefaultControls": false, + "ladderClimbingSpeed": 150, + "maxFallingSpeed": 700, + "maxSpeed": 250, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + }, + { + "name": "SmoothCamera", + "type": "SmoothCamera::SmoothCamera", + "LeftwardSpeed": 0.9, + "RightwardSpeed": 0.9, + "UpwardSpeed": 0.9, + "DownwardSpeed": 0.9, + "FollowOnX": true, + "FollowOnY": true, + "FollowFreeAreaLeft": 0, + "FollowFreeAreaRight": 0, + "FollowFreeAreaTop": 0, + "FollowFreeAreaBottom": 0, + "CameraOffsetX": 0, + "CameraOffsetY": -32, + "CameraDelay": 0, + "ForecastTime": 0, + "ForecastHistoryDuration": 0, + "LogLeftwardSpeed": 0, + "LogRightwardSpeed": 0, + "LogDownwardSpeed": 0, + "LogUpwardSpeed": 0, + "DelayedCenterX": 0, + "DelayedCenterY": 0, + "ForecastHistoryMeanX": 0, + "ForecastHistoryMeanY": 0, + "ForecastHistoryVarianceX": 0, + "ForecastHistoryCovariance": 0, + "ForecastHistoryLinearA": 0, + "ForecastHistoryLinearB": 0, + "ForecastedX": 0, + "ForecastedY": 0, + "ProjectedNewestX": 0, + "ProjectedNewestY": 0, + "ProjectedOldestX": 0, + "ProjectedOldestY": 0, + "ForecastHistoryVarianceY": 0, + "Index": 0, + "CameraDelayCatchUpSpeed": 0, + "CameraExtraDelay": 0, + "WaitingSpeedXMax": 0, + "WaitingSpeedYMax": 0, + "WaitingEnd": 0, + "CameraDelayCatchUpDuration": 0, + "LeftwardSpeedMax": 9000, + "RightwardSpeedMax": 9000, + "UpwardSpeedMax": 9000, + "DownwardSpeedMax": 9000, + "OldX": 9000, + "OldY": 9000, + "IsCalledManually": false + }, + { + "name": "SmoothPlatformerCamera", + "type": "SmoothCamera::SmoothPlatformerCamera", + "PlatformerCharacter": "PlatformerObject", + "SmoothCamera": "SmoothCamera", + "JumpOriginY": 1.758268736427497e-308, + "AirFollowFreeAreaTop": 0, + "AirFollowFreeAreaBottom": 0, + "FloorFollowFreeAreaTop": 0, + "FloorFollowFreeAreaBottom": 0, + "AirUpwardSpeed": 0.95, + "AirDownwardSpeed": 0.95, + "FloorUpwardSpeed": 0.9, + "FloorDownwardSpeed": 0.9, + "AirUpwardSpeedMax": 9000, + "AirDownwardSpeedMax": 9000, + "FloorUpwardSpeedMax": 9000, + "FloorDownwardSpeedMax": 9000 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Stand_12.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 190, + "y": 185 + }, + { + "x": 300, + "y": 182 + }, + { + "x": 312, + "y": 414 + }, + { + "x": 174, + "y": 416 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_5.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_6.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Walk_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 203, + "y": 181 + }, + { + "x": 292, + "y": 181 + }, + { + "x": 272, + "y": 415 + }, + { + "x": 203, + "y": 409 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Jump", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_7.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 291, + "y": 162 + }, + { + "x": 284, + "y": 388 + }, + { + "x": 204, + "y": 385 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_8.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 291, + "y": 162 + }, + { + "x": 284, + "y": 388 + }, + { + "x": 204, + "y": 385 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_9.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 291, + "y": 162 + }, + { + "x": 284, + "y": 388 + }, + { + "x": 204, + "y": 385 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_10.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 291, + "y": 162 + }, + { + "x": 284, + "y": 388 + }, + { + "x": 204, + "y": 385 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_11.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 291, + "y": 162 + }, + { + "x": 284, + "y": 388 + }, + { + "x": 204, + "y": 385 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Fall", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_82.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Jump_82.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Fall_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Fall_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Fall_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Fall_4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 314, + "y": 150 + }, + { + "x": 311, + "y": 346 + }, + { + "x": 199, + "y": 362 + } + ] + ] + } + ] + } + ] + }, + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Character Orange_Ledge Grab_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 204, + "y": 162 + }, + { + "x": 333, + "y": 159 + }, + { + "x": 317, + "y": 404 + }, + { + "x": 202, + "y": 394 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Goal", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Button_Open_1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.2, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Button_Open_2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "Button_Open_3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Background", + "texture": "BlackCheckered.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 128, + "name": "FailMarker", + "texture": "assets\\RedCheckered.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 128, + "name": "Danger", + "texture": "assets\\RedCheckered.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Arrow", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Orange Arrow.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "c7a381f15f0bb07adc63d78850702df44e8328a15db1ecb10ca1503491ed22a0", + "name": "FlatLightJoystick", + "type": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "variables": [], + "effects": [], + "behaviors": [], + "content": {}, + "childrenContent": { + "Border": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat light joystick border.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + "Thumb": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Flat light joystick thumb.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "a9518cbba640f8287edf6c5eb05df6e2f825343bc6440e8d4afe9623831a3afc", + "name": "AButton", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior", + "bottomEdgeAnchor": 0, + "leftEdgeAnchor": 0, + "relativeToOriginalWindowSize": true, + "rightEdgeAnchor": 2, + "topEdgeAnchor": 0, + "useLegacyBottomAndRightAnchors": false + }, + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton", + "ControllerIdentifier": 1, + "ButtonIdentifier": "A", + "TouchId": 0, + "TouchIndex": 0, + "IsReleased": false + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "A Button.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Platform", + "type": "Scene3D::Cube3DObject", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "width": 128, + "height": 128, + "depth": 128, + "enableTextureTransparency": false, + "facesOrientation": "Y", + "frontFaceResourceName": "BlackCheckered.png", + "backFaceResourceName": "", + "backFaceUpThroughWhichAxisRotation": "X", + "leftFaceResourceName": "WhiteCheckered.png", + "rightFaceResourceName": "WhiteCheckered.png", + "topFaceResourceName": "WhiteCheckered.png", + "bottomFaceResourceName": "WhiteCheckered.png", + "frontFaceVisible": true, + "backFaceVisible": false, + "leftFaceVisible": true, + "rightFaceVisible": true, + "topFaceVisible": true, + "bottomFaceVisible": true, + "frontFaceResourceRepeat": true, + "backFaceResourceRepeat": false, + "leftFaceResourceRepeat": true, + "rightFaceResourceRepeat": true, + "topFaceResourceRepeat": true, + "bottomFaceResourceRepeat": true, + "materialType": "Basic" + } + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "EndingDialog" + }, + { + "objectName": "Player" + }, + { + "objectName": "Goal" + }, + { + "objectName": "Background" + }, + { + "objectName": "FailMarker" + }, + { + "objectName": "Danger" + }, + { + "objectName": "Arrow" + }, + { + "objectName": "FlatLightJoystick" + }, + { + "objectName": "AButton" + }, + { + "objectName": "Platform" + } + ] + }, + "events": [ + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Game Logic", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Background", + "", + "\"Background\"", + "" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Player", + "", + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::XOffset" + }, + "parameters": [ + "Background", + "=", + "CameraCenterX()/3" + ] + }, + { + "type": { + "value": "TiledSpriteObject::YOffset" + }, + "parameters": [ + "Background", + "=", + "CameraCenterY()/3" + ] + }, + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "FailMarker", + "=", + "Player.CenterX()-(FailMarker.Width()/2)" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Fail Game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Player.CenterY()", + ">", + "FailMarker.Y()" + ] + }, + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Player", + "Danger", + "", + "", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Death", + "", + "50", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Win Game", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Player", + "Goal", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "WinGame", + "", + "50", + "1" + ] + }, + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Goal", + "\"Down\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mobile Controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SystemInfo::IsMobile" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ShowLayer" + }, + "parameters": [ + "", + "\"MobileUI\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "AButton", + "MultitouchButton", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Player", + "PlatformerObject" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SystemInfo::IsMobile" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "FlatLightJoystick", + "" + ] + }, + { + "type": { + "value": "Delete" + }, + "parameters": [ + "AButton", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At the beginning of scene, adjust z(Elevation) of the 3D cubes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene3D::Base3DBehavior::SetZ" + }, + "parameters": [ + "Platform", + "Object3D", + "=", + "-64" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionNP" + }, + "parameters": [ + "Player", + "Goal", + "", + "", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "\"Interface\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraCenterX(\"Interface\")", + "=", + "CameraCenterY(\"Interface\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Background", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "MobileUI", + "renderingType": "", + "visibility": false, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Interface", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Anchor", + "type": "AnchorBehavior::AnchorBehavior" + }, + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "MultitouchButton", + "type": "SpriteMultitouchJoystick::MultitouchButton" + }, + { + "name": "Object3D", + "type": "Scene3D::Base3DBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator" + }, + { + "name": "PlatformerMultitouchMapper", + "type": "SpriteMultitouchJoystick::PlatformerMultitouchMapper" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "SmoothCamera", + "type": "SmoothCamera::SmoothCamera" + }, + { + "name": "SmoothPlatformerCamera", + "type": "SmoothCamera::SmoothPlatformerCamera" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": "", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.2.2", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "GetArgumentAsString(\"ButtonState\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone", + "=", + "GetArgumentAsNumber(\"DeadZoneRadius\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the force of multitouch contoller stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Stick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::JoystickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\")) * cos(ToRad(SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::JoystickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\")) * sin(ToRad(SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyDeadZoneRadius()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickForce()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickAngle()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyControllerIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyDeadZoneRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyButtonIdentifier()", + "GetArgumentAsString(\"ButtonState\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "description": "", + "group": "", + "extraInformation": [], + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsReleased" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJumpButton()", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "SpriteMultitouchJoystick::StickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "sign(SpriteMultitouchJoystick::StickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier()))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "description": "", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyControllerIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyJoystickIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyDeadZoneRadius()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick is pressed.", + "fullName": "Stick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Stick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the strick force (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "ExpressionAndCondition", + "name": "StickForceX", + "sentence": "the stick X force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "ExpressionAndCondition", + "name": "StickForceY", + "sentence": "the stick Y force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (from -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the stick is pointing towards (from -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsString(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ParentOrigin" + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [] + } + ] + }, + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Platformer character animator", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTIzLDExYzIuMiwwLDQtMS44LDQtNHMtMS44LTQtNC00cy00LDEuOC00LDRTMjAuOCwxMSwyMywxMXoiLz4NCgk8cGF0aCBkPSJNMzAuOCwxMi40Yy0wLjMtMC40LTEtMC41LTEuNC0wLjJsLTIuOSwyLjNjLTAuOCwwLjctMiwwLjYtMi43LTAuMmwtNy45LTcuOWMtMS42LTEuNi00LjEtMS42LTUuNywwTDcuMyw5LjMNCgkJYy0wLjQsMC40LTAuNCwxLDAsMS40czEsMC40LDEuNCwwbDIuOC0yLjhjMC44LTAuOCwyLjEtMC44LDIuOSwwbDEuNiwxLjZMMTEuNiwxNGMtMSwxLTEuNCwyLjMtMS4xLDMuN2MwLjIsMS4xLDAuOSwyLDEuOCwyLjYNCgkJbC0xLjYsMS42Yy0wLjQsMC40LTEsMC40LTEuNCwwbC0zLjYtMy42Yy0wLjQtMC40LTEtMC40LTEuNCwwcy0wLjQsMSwwLDEuNGwzLjYsMy42YzAuNiwwLjYsMS4zLDAuOSwyLjEsMC45czEuNi0wLjMsMi4xLTAuOQ0KCQlsMi4xLTIuMWwyLjUsMWMwLjcsMC4zLDEuMiwxLDEuMiwxLjh2NmMwLDAuNiwwLjQsMSwxLDFzMS0wLjQsMS0xdi02YzAtMS42LTEtMy4xLTIuNS0zLjdsLTEuNy0wLjdsNS4yLTUuMmwxLjQsMS40DQoJCWMwLjgsMC44LDEuOCwxLjIsMi45LDEuMmMwLjksMCwxLjgtMC4zLDIuNS0wLjlsMi45LTIuM0MzMS4xLDEzLjQsMzEuMSwxMi44LDMwLjgsMTIuNHoiLz4NCjwvZz4NCjwvc3ZnPg0K", + "name": "PlatformerCharacterAnimator", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg", + "shortDescription": "Change animations and horizontal flipping of a platformer character automatically.", + "version": "1.0.1", + "description": [ + "Automatically change the animations and horizontal flipping of a platformer character based on movement and interaction with platform objects.", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer))." + ], + "origin": { + "identifier": "PlatformerCharacterAnimator", + "name": "gdevelop-extension-store" + }, + "tags": [ + "animations", + "platformer", + "flipping", + "automatic" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Change animations and horizontal flipping of a platformer character automatically.", + "fullName": "Platformer character animator", + "name": "PlatformerCharacterAnimator", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "Object", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlayAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PauseAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlayAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onActivate", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "Object", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlipX" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetAnimationName" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlayAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PauseAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlayAnimation" + }, + "parameters": [ + "Object" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated animation changes a platformer character. Disabling animation changes is useful to play custom animations.", + "fullName": "Enable (or disable) automated animation changes", + "functionType": "Action", + "name": "EnableChangingAnimations", + "sentence": "Enable automated animation changes on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableAnimationChanges\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Change animations automatically", + "name": "EnableAnimationChanges", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated horizontal flipping of a platform character.", + "fullName": "Enable (or disable) automated horizontal flipping", + "functionType": "Action", + "name": "EnableHorizontalFlipping", + "sentence": "Enable automated horizontal flipping on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalFlipping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable horizontal flipping", + "name": "EnableHorizontalFlipping", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Idle\" animation name. Do not use quotation marks.", + "fullName": "\"Idle\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetIdleAnimationName", + "sentence": "Set \"Idle\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyIdleAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Move\" animation name. Do not use quotation marks.", + "fullName": "\"Move\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetMoveAnimationName", + "sentence": "Set \"Move\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyRunAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Jump\" animation name. Do not use quotation marks.", + "fullName": "\"Jump\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetJumpAnimationName", + "sentence": "Set \"Jump\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyJumpAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Fall\" animation name. Do not use quotation marks.", + "fullName": "\"Fall\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetFallAnimationName", + "sentence": "Set \"Fall\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyFallAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Climb\" animation name. Do not use quotation marks.", + "fullName": "\"Climb\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetClimbAnimationName", + "sentence": "Set \"Climb\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyClimbAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Enable animation changes", + "description": "", + "group": "", + "extraInformation": [], + "name": "EnableAnimationChanges" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable horizontal flipping", + "description": "", + "group": "", + "extraInformation": [], + "name": "EnableHorizontalFlipping" + }, + { + "value": "Idle", + "type": "String", + "label": "\"Idle\" animation name ", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Run", + "type": "String", + "label": "\"Run\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "RunAnimationName" + }, + { + "value": "Jump", + "type": "String", + "label": "\"Jump\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "JumpAnimationName" + }, + { + "value": "Fall", + "type": "String", + "label": "\"Fall\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "FallAnimationName" + }, + { + "value": "Climb", + "type": "String", + "label": "\"Climb\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "ClimbAnimationName" + }, + { + "value": "", + "type": "Behavior", + "label": "Platformer character", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerBehavior" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.3.0", + "description": [ + "The camera follows an object according to:", + "- a frame rate independent catch-up speed to make the scrolling from smooth to strong", + "- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object", + "- a follow-free zone to avoid scrolling on small movements", + "- an offset to see further in one direction", + "- an extra delay and catch-up speed to give an impression of speed (useful for dash)", + "- position forecasting and delay to simulate a cameraman response time", + "", + "A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping." + ], + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "name": "SmoothCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaLeft()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaRight()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaTop()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaBottom()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::PropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * Object.Behavior::PropertyLogLeftwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * Object.Behavior::PropertyLogRightwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * Object.Behavior::PropertyLogUpwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * Object.Behavior::PropertyLogDownwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "TimeFromStart() + GetArgumentAsNumber(\"WaitingDuration\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedXMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedXMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedYMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedYMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CatchUpDuration\")" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "WaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "WaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "WaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "CatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forecasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyProjectedOldestX()", + "Object.Behavior::PropertyProjectedOldestY()", + "Object.Behavior::PropertyProjectedNewestX()", + "Object.Behavior::PropertyProjectedNewestY()", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyForecastedX()", + "Object.Behavior::PropertyForecastedY()", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnX\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "FollowOnX", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnY\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "FollowOnY", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaRight\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "SetFollowFreeAreaRight", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaLeft\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "SetFollowFreeAreaLeft", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"FollowFreeAreaTop\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "FollowFreeAreaTop", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaBottom\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "SetFollowFreeAreaBottom", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in ratio per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"LeftwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyLeftwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "LeftwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"RightwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyRightwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "RightwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"DownwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyDownwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "DownwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"UpwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyUpwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "UpwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset X", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetX", + "sentence": "the camera offset on X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetX", + "name": "SetOffsetXOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "private": true, + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetXOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetXOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetX\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "CameraOffsetX", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset Y", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetY", + "sentence": "the camera offset on Y axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetY", + "name": "SetOffsetYOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetYOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "private": true, + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetYOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetY\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"ForecastTime\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "ForecastTime", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"CameraDelay\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "CameraDelay", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() - Object.Behavior::PropertyFollowFreeAreaLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() + Object.Behavior::PropertyFollowFreeAreaRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() + Object.Behavior::PropertyFollowFreeAreaBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() - Object.Behavior::PropertyFollowFreeAreaTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "max(0, TimeDelta() * (1 - min(Object.Behavior::PropertyWaitingSpeedXMax() * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), Object.Behavior::PropertyWaitingSpeedYMax() * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraExtraDelay() / Object.Behavior::PropertyCameraDelayCatchUpDuration()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyCameraExtraDelay() -Object.Behavior::PropertyCameraDelayCatchUpSpeed() * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraDelay() + Object.Behavior::PropertyCameraExtraDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "GetArgumentAsNumber(\"Time\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "GetArgumentAsNumber(\"ObjectX\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "GetArgumentAsNumber(\"ObjectY\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - Object.Behavior::PropertyCameraDelay() - Object.Behavior::PropertyCameraExtraDelay() - Object.Behavior::PropertyForecastHistoryDuration()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(Object.Behavior::PropertyForecastHistoryMeanX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryMeanY())", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX())\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY())" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceY()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryCovariance())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanY() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanX()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanX() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanY()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(Object.Behavior::PropertyProjectedOldestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedOldestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(Object.Behavior::PropertyProjectedNewestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedNewestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forecasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX() + ( Object.Behavior::PropertyProjectedNewestX() - Object.Behavior::PropertyProjectedOldestX()) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY() + ( Object.Behavior::PropertyProjectedNewestY() - Object.Behavior::PropertyProjectedOldestY()) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(Object.Behavior::PropertyForecastedX()) + \" \" + ToString(Object.Behavior::PropertyForecastedY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"NewestX\") + (GetArgumentAsNumber(\"NewestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"NewestY\") + (GetArgumentAsNumber(\"NewestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"NewestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"OldestX\") + (GetArgumentAsNumber(\"OldestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"OldestY\") + (GetArgumentAsNumber(\"OldestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"OldestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- Object.Behavior::PropertyForecastTime() / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area left border", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area right border", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top border", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom border", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset X", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset Y", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Camera delay", + "description": "", + "group": "Timing", + "extraInformation": [], + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast time", + "description": "", + "group": "Timing", + "extraInformation": [], + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast history duration", + "description": "", + "group": "Timing", + "extraInformation": [], + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Leftward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Rightward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsCalledManually" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "name": "SmoothPlatformerCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeedMax()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeedMax()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "description": "", + "group": "", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorDownwardSpeedMax" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "description": "", + "group": "", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/plinkoMultiplier/assets/Ball.png b/templates/plinkoMultiplier/assets/Ball.png new file mode 100644 index 0000000..7ea6be4 Binary files /dev/null and b/templates/plinkoMultiplier/assets/Ball.png differ diff --git a/templates/plinkoMultiplier/assets/BallRespawn.wav b/templates/plinkoMultiplier/assets/BallRespawn.wav new file mode 100644 index 0000000..e990dec Binary files /dev/null and b/templates/plinkoMultiplier/assets/BallRespawn.wav differ diff --git a/templates/plinkoMultiplier/assets/ClickerBeep.wav b/templates/plinkoMultiplier/assets/ClickerBeep.wav new file mode 100644 index 0000000..739e7e3 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ClickerBeep.wav differ diff --git a/templates/plinkoMultiplier/assets/ClickerBeep2.wav b/templates/plinkoMultiplier/assets/ClickerBeep2.wav new file mode 100644 index 0000000..1788999 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ClickerBeep2.wav differ diff --git a/templates/plinkoMultiplier/assets/CloudLayer.png b/templates/plinkoMultiplier/assets/CloudLayer.png new file mode 100644 index 0000000..a99c31f Binary files /dev/null and b/templates/plinkoMultiplier/assets/CloudLayer.png differ diff --git a/templates/plinkoMultiplier/assets/Darkening.png b/templates/plinkoMultiplier/assets/Darkening.png new file mode 100644 index 0000000..fc48a67 Binary files /dev/null and b/templates/plinkoMultiplier/assets/Darkening.png differ diff --git a/templates/plinkoMultiplier/assets/DoublePeg.png b/templates/plinkoMultiplier/assets/DoublePeg.png new file mode 100644 index 0000000..12bedd3 Binary files /dev/null and b/templates/plinkoMultiplier/assets/DoublePeg.png differ diff --git a/templates/plinkoMultiplier/assets/DoublePeg2.png b/templates/plinkoMultiplier/assets/DoublePeg2.png new file mode 100644 index 0000000..12bedd3 Binary files /dev/null and b/templates/plinkoMultiplier/assets/DoublePeg2.png differ diff --git a/templates/plinkoMultiplier/assets/GameOver.wav b/templates/plinkoMultiplier/assets/GameOver.wav new file mode 100644 index 0000000..9f11c93 Binary files /dev/null and b/templates/plinkoMultiplier/assets/GameOver.wav differ diff --git a/templates/plinkoMultiplier/assets/LongMetalPanel.png b/templates/plinkoMultiplier/assets/LongMetalPanel.png new file mode 100644 index 0000000..e450acd Binary files /dev/null and b/templates/plinkoMultiplier/assets/LongMetalPanel.png differ diff --git a/templates/plinkoMultiplier/assets/PTSans-Bold.ttf b/templates/plinkoMultiplier/assets/PTSans-Bold.ttf new file mode 100644 index 0000000..f82c3bd Binary files /dev/null and b/templates/plinkoMultiplier/assets/PTSans-Bold.ttf differ diff --git a/templates/plinkoMultiplier/assets/StonePeg.png b/templates/plinkoMultiplier/assets/StonePeg.png new file mode 100644 index 0000000..c0b4e4a Binary files /dev/null and b/templates/plinkoMultiplier/assets/StonePeg.png differ diff --git a/templates/plinkoMultiplier/assets/StonePeg2.png b/templates/plinkoMultiplier/assets/StonePeg2.png new file mode 100644 index 0000000..c0b4e4a Binary files /dev/null and b/templates/plinkoMultiplier/assets/StonePeg2.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-144.png b/templates/plinkoMultiplier/assets/android-icon-144.png new file mode 100644 index 0000000..d73c3c3 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-144.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-192.png b/templates/plinkoMultiplier/assets/android-icon-192.png new file mode 100644 index 0000000..9ba9f63 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-192.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-36.png b/templates/plinkoMultiplier/assets/android-icon-36.png new file mode 100644 index 0000000..eb92b49 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-36.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-48.png b/templates/plinkoMultiplier/assets/android-icon-48.png new file mode 100644 index 0000000..0692c5b Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-48.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-72.png b/templates/plinkoMultiplier/assets/android-icon-72.png new file mode 100644 index 0000000..91ff3d9 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-72.png differ diff --git a/templates/plinkoMultiplier/assets/android-icon-96.png b/templates/plinkoMultiplier/assets/android-icon-96.png new file mode 100644 index 0000000..09c8fb7 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-icon-96.png differ diff --git a/templates/plinkoMultiplier/assets/android-windowSplashScreenAnimatedIcon.png b/templates/plinkoMultiplier/assets/android-windowSplashScreenAnimatedIcon.png new file mode 100644 index 0000000..a6e0ae5 Binary files /dev/null and b/templates/plinkoMultiplier/assets/android-windowSplashScreenAnimatedIcon.png differ diff --git a/templates/plinkoMultiplier/assets/desktop-icon-512.png b/templates/plinkoMultiplier/assets/desktop-icon-512.png new file mode 100644 index 0000000..130b7d0 Binary files /dev/null and b/templates/plinkoMultiplier/assets/desktop-icon-512.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-100.png b/templates/plinkoMultiplier/assets/ios-icon-100.png new file mode 100644 index 0000000..30bafcc Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-100.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-1024.png b/templates/plinkoMultiplier/assets/ios-icon-1024.png new file mode 100644 index 0000000..07d5131 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-1024.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-114.png b/templates/plinkoMultiplier/assets/ios-icon-114.png new file mode 100644 index 0000000..5b3ceda Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-114.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-120.png b/templates/plinkoMultiplier/assets/ios-icon-120.png new file mode 100644 index 0000000..a73a9d0 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-120.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-144.png b/templates/plinkoMultiplier/assets/ios-icon-144.png new file mode 100644 index 0000000..d73c3c3 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-144.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-152.png b/templates/plinkoMultiplier/assets/ios-icon-152.png new file mode 100644 index 0000000..43c0456 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-152.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-167.png b/templates/plinkoMultiplier/assets/ios-icon-167.png new file mode 100644 index 0000000..149096d Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-167.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-180.png b/templates/plinkoMultiplier/assets/ios-icon-180.png new file mode 100644 index 0000000..dc43c75 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-180.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-20.png b/templates/plinkoMultiplier/assets/ios-icon-20.png new file mode 100644 index 0000000..623fa7a Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-20.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-29.png b/templates/plinkoMultiplier/assets/ios-icon-29.png new file mode 100644 index 0000000..b09816c Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-29.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-40.png b/templates/plinkoMultiplier/assets/ios-icon-40.png new file mode 100644 index 0000000..fde6641 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-40.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-50.png b/templates/plinkoMultiplier/assets/ios-icon-50.png new file mode 100644 index 0000000..00fb9c0 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-50.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-57.png b/templates/plinkoMultiplier/assets/ios-icon-57.png new file mode 100644 index 0000000..fd54ef7 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-57.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-58.png b/templates/plinkoMultiplier/assets/ios-icon-58.png new file mode 100644 index 0000000..77673a8 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-58.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-60.png b/templates/plinkoMultiplier/assets/ios-icon-60.png new file mode 100644 index 0000000..5c81c6e Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-60.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-72.png b/templates/plinkoMultiplier/assets/ios-icon-72.png new file mode 100644 index 0000000..91ff3d9 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-72.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-76.png b/templates/plinkoMultiplier/assets/ios-icon-76.png new file mode 100644 index 0000000..c708482 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-76.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-80.png b/templates/plinkoMultiplier/assets/ios-icon-80.png new file mode 100644 index 0000000..4f73f8e Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-80.png differ diff --git a/templates/plinkoMultiplier/assets/ios-icon-87.png b/templates/plinkoMultiplier/assets/ios-icon-87.png new file mode 100644 index 0000000..4ebe3c2 Binary files /dev/null and b/templates/plinkoMultiplier/assets/ios-icon-87.png differ diff --git a/templates/plinkoMultiplier/assets/metalPanel.png b/templates/plinkoMultiplier/assets/metalPanel.png new file mode 100644 index 0000000..ba91736 Binary files /dev/null and b/templates/plinkoMultiplier/assets/metalPanel.png differ diff --git a/templates/plinkoMultiplier/assets/starGold.png b/templates/plinkoMultiplier/assets/starGold.png new file mode 100644 index 0000000..ff18377 Binary files /dev/null and b/templates/plinkoMultiplier/assets/starGold.png differ diff --git a/templates/plinkoMultiplier/assets/starGold2.png b/templates/plinkoMultiplier/assets/starGold2.png new file mode 100644 index 0000000..ff18377 Binary files /dev/null and b/templates/plinkoMultiplier/assets/starGold2.png differ diff --git a/templates/plinkoMultiplier/assets/thumbnail.png b/templates/plinkoMultiplier/assets/thumbnail.png new file mode 100644 index 0000000..482333e Binary files /dev/null and b/templates/plinkoMultiplier/assets/thumbnail.png differ diff --git a/templates/plinkoMultiplier/assets/tiled_Background2.png b/templates/plinkoMultiplier/assets/tiled_Background2.png new file mode 100644 index 0000000..176f5ac Binary files /dev/null and b/templates/plinkoMultiplier/assets/tiled_Background2.png differ diff --git a/templates/plinkoMultiplier/game.json b/templates/plinkoMultiplier/game.json new file mode 100644 index 0000000..2f70c1d --- /dev/null +++ b/templates/plinkoMultiplier/game.json @@ -0,0 +1,11291 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 224, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.plinkotutorial", + "pixelsRounding": false, + "projectUuid": "4d3120d9-7219-4c0a-9f41-a60386d0430a", + "scaleMode": "linear", + "sizeOnStartupMode": "", + "templateSlug": "plinko-tutorial", + "version": "1.0.0", + "name": "Plinko Tutorial", + "description": "In this game the player drops their pachinko ball in an effort to hit as many pegs as possible to accumulate the maximum number of points. This game exhibits a scoring system, a score multiplier, the physics options, the leaderboard system, and more.", + "author": "", + "windowWidth": 800, + "windowHeight": 600, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": { + "android-icon-144": "android-icon-144.png", + "android-icon-192": "android-icon-192.png", + "android-icon-36": "android-icon-36.png", + "android-icon-48": "android-icon-48.png", + "android-icon-72": "android-icon-72.png", + "android-icon-96": "android-icon-96.png", + "android-windowSplashScreenAnimatedIcon": "android-windowSplashScreenAnimatedIcon.png", + "desktop-icon-512": "desktop-icon-512.png", + "ios-icon-100": "ios-icon-100.png", + "ios-icon-1024": "ios-icon-1024.png", + "ios-icon-114": "ios-icon-114.png", + "ios-icon-120": "ios-icon-120.png", + "ios-icon-144": "ios-icon-144.png", + "ios-icon-152": "ios-icon-152.png", + "ios-icon-167": "ios-icon-167.png", + "ios-icon-180": "ios-icon-180.png", + "ios-icon-20": "ios-icon-20.png", + "ios-icon-29": "ios-icon-29.png", + "ios-icon-40": "ios-icon-40.png", + "ios-icon-50": "ios-icon-50.png", + "ios-icon-57": "ios-icon-57.png", + "ios-icon-58": "ios-icon-58.png", + "ios-icon-60": "ios-icon-60.png", + "ios-icon-72": "ios-icon-72.png", + "ios-icon-76": "ios-icon-76.png", + "ios-icon-80": "ios-icon-80.png", + "ios-icon-87": "ios-icon-87.png", + "liluo-thumbnail": "thumbnail.png" + }, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/LongMetalPanel.png", + "kind": "image", + "metadata": "", + "name": "elementMetal013.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Darkening.png", + "kind": "image", + "metadata": "", + "name": "Darkening.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/DoublePeg.png", + "kind": "image", + "metadata": "", + "name": "elementExplosive001.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/ClickerBeep.wav", + "kind": "audio", + "metadata": "", + "name": "ClickerBeep.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/starGold.png", + "kind": "image", + "metadata": "", + "name": "starGold.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/PTSans-Bold.ttf", + "kind": "font", + "metadata": "", + "name": "PTSans-Bold.ttf", + "userAdded": true + }, + { + "file": "assets/StonePeg.png", + "kind": "image", + "metadata": "", + "name": "elementStone001.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/ClickerBeep2.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0,\\\"sustainPunch\\\":50,\\\"decay\\\":0.2,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":0,\\\"frequency\\\":1000,\\\"frequencySweep\\\":-200,\\\"frequencyDeltaSweep\\\":2800,\\\"repeatFrequency\\\":5.5,\\\"frequencyJump1Onset\\\":35,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":60,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"sine\\\",\\\"interpolateNoise\\\":false,\\\"vibratoDepth\\\":470,\\\"vibratoFrequency\\\":0,\\\"squareDuty\\\":55,\\\"squareDutySweep\\\":100,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":4,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":2100,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1.2000000000000002,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"ClickerBeep2\"}}", + "name": "ClickerBeep2.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/metalPanel.png", + "kind": "image", + "metadata": "", + "name": "metalPanel.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/GameOver.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.3592499173913404,\\\"sustainPunch\\\":0,\\\"decay\\\":0.4267571207535963,\\\"tremoloDepth\\\":4,\\\"tremoloFrequency\\\":508,\\\"frequency\\\":10,\\\"frequencySweep\\\":0,\\\"frequencyDeltaSweep\\\":0,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":2,\\\"harmonicsFalloff\\\":0.18,\\\"waveform\\\":\\\"breaker\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":50,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":22,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":2700,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":8100,\\\"highPassCutoffSweep\\\":6000,\\\"compression\\\":1.1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"GameOver\"}}", + "name": "GameOver.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/BallRespawn.wav", + "kind": "audio", + "metadata": "{\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.08,\\\"sustainPunch\\\":0,\\\"decay\\\":0.39,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":100,\\\"frequencySweep\\\":0,\\\"frequencyDeltaSweep\\\":0,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":25,\\\"frequencyJump1Amount\\\":65,\\\"frequencyJump2Onset\\\":35,\\\"frequencyJump2Amount\\\":85,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"breaker\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":10,\\\"squareDuty\\\":25,\\\"squareDutySweep\\\":-100,\\\"flangerOffset\\\":1,\\\"flangerOffsetSweep\\\":0,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"BallRespawn\"}}", + "name": "BallRespawn.wav", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/Ball.png", + "kind": "image", + "metadata": "", + "name": "assets\\Ball.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/CloudLayer.png", + "kind": "image", + "metadata": "", + "name": "tiled_Cloud layer (3).png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/Generic Backgrounds/Background Elements/tiled_Cloud layer (3).png", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/tiled_Background2.png", + "kind": "image", + "metadata": "", + "name": "tiled_Background.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://resources.gdevelop-app.com/assets/GDevelop examples/Platformer/Background/tiled_Background.png", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/desktop-icon-512.png", + "kind": "image", + "metadata": "", + "name": "desktop-icon-512.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-192.png", + "kind": "image", + "metadata": "", + "name": "android-icon-192.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-144.png", + "kind": "image", + "metadata": "", + "name": "android-icon-144.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-96.png", + "kind": "image", + "metadata": "", + "name": "android-icon-96.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-72.png", + "kind": "image", + "metadata": "", + "name": "android-icon-72.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-48.png", + "kind": "image", + "metadata": "", + "name": "android-icon-48.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-icon-36.png", + "kind": "image", + "metadata": "", + "name": "android-icon-36.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/android-windowSplashScreenAnimatedIcon.png", + "kind": "image", + "metadata": "", + "name": "android-windowSplashScreenAnimatedIcon.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-1024.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-1024.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-180.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-180.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-167.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-167.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-152.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-152.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-144.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-144.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-120.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-120.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-114.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-114.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-100.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-100.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-87.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-87.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-80.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-80.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-76.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-76.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-72.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-72.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-60.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-60.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-58.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-58.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-57.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-57.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-50.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-50.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-40.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-40.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-29.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-29.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/ios-icon-20.png", + "kind": "image", + "metadata": "", + "name": "ios-icon-20.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/thumbnail.png", + "kind": "image", + "metadata": "", + "name": "thumbnail.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/StonePeg2.png", + "kind": "image", + "metadata": "", + "name": "assets\\StonePeg.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/DoublePeg2.png", + "kind": "image", + "metadata": "", + "name": "assets\\DoublePeg.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/starGold2.png", + "kind": "image", + "metadata": "", + "name": "assets\\starGold.png", + "smoothed": true, + "userAdded": true + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [ + { + "folded": true, + "name": "ScoreValue", + "type": "number", + "value": 0 + }, + { + "folded": true, + "name": "ScoreDisplay", + "type": "number", + "value": 0 + } + ], + "layouts": [ + { + "b": 65, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 65, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 65, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.2, + "snap": false, + "zoomFactor": 0.8275910924187377, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Breakable_Pegs", + "objects": [ + { + "name": "Peg_Basic" + }, + { + "name": "Peg_Move" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "05a26d2e-1704-4da9-b082-6b555ee0e806", + "width": 32, + "x": 432, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 26, + "layer": "", + "name": "Ball", + "persistentUuid": "2c040a60-3669-496c-a581-0f088adcc9f2", + "width": 26, + "x": 427, + "y": 120, + "zOrder": 4, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 56, + "layer": "", + "name": "Score", + "persistentUuid": "a2b81b92-9142-4065-8c49-ee304ccc74d7", + "width": 334, + "x": 564, + "y": 8, + "zOrder": 15, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 70, + "layer": "", + "name": "Walls", + "persistentUuid": "0c554c1d-e7e2-4e12-a968-03c5c205c607", + "width": 768, + "x": 419, + "y": 253, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 70, + "layer": "", + "name": "Walls", + "persistentUuid": "c4d84af3-67b4-416a-bb00-a1871615439f", + "width": 768, + "x": -387, + "y": 253, + "zOrder": 16, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "adc5b4e4-469d-4b1e-a3b4-21cb06eccdf7", + "width": 32, + "x": 368, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "08fa4bf4-6b1f-4991-a18f-22fa7b0daea1", + "width": 32, + "x": 560, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "9ec2eb74-05fa-461d-a3af-5ebc4aea59b4", + "width": 32, + "x": 496, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "2e8b76e0-0d59-47c3-a67b-2eed8abb71d7", + "width": 32, + "x": 304, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "7e894361-efc8-4ca2-a633-f91bab620b8a", + "width": 32, + "x": 240.00003051757812, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "7ea04418-0944-40af-ace5-be93d4ed401f", + "width": 32, + "x": 176, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "e9efd641-9523-434f-a4cd-8c9ce7271324", + "width": 32, + "x": 112, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "552db0e6-0372-4fff-b028-12d61c32d2ce", + "width": 32, + "x": 688, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "d7b9dd91-e071-4d0b-8372-991c3b0995b7", + "width": 32, + "x": 624, + "y": 240, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "3cce0dc0-d071-4ddd-a5cf-8d8184f1549b", + "width": 32, + "x": 400.0000305175781, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "6da7cd3a-ad9e-4c73-a4d2-069a433762a2", + "width": 32, + "x": 336.0000305175781, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "d1fa2b48-9f83-4f57-a455-819759a677d4", + "width": 32, + "x": 528, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "233a5067-e46b-49fd-8038-924fc56dfb75", + "width": 32, + "x": 464.0000305175781, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "363aadc4-9762-4a63-a3e0-047c73fe061f", + "width": 32, + "x": 272.0000305175781, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "8a030273-c7d5-4a84-a9a8-cabda92a3bac", + "width": 32, + "x": 208.00006103515625, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "359f16f2-77d0-4ca8-a74b-dd20ea909165", + "width": 32, + "x": 144.00003051757812, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "2fdab63b-46da-4933-8f13-dcbb4f1c12e0", + "width": 32, + "x": 80.00003051757812, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "75affb6b-ff93-4a7d-a583-b26f7d448ce5", + "width": 32, + "x": 656, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "cb972a95-a97c-4805-ab42-35dd8efb2347", + "width": 32, + "x": 592, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "1949ef33-2d49-4295-a8f4-2824df33f491", + "width": 32, + "x": 720, + "y": 368, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "4085ec2c-797a-4dec-aee9-5b6cc49a6d89", + "width": 32, + "x": 592, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "57acad87-ee21-4ae9-a14a-7a8591744b65", + "width": 32, + "x": 464, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "3ee24e78-9428-4a4d-99cc-a264f96f52d8", + "width": 32, + "x": 336, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "dff1eb6a-7169-48c1-b613-eb76783bdb00", + "width": 32, + "x": 208, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "2643d1ae-64bb-456f-9162-5b81a2c75d14", + "width": 32, + "x": 688, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "32196a4e-24e0-413f-b415-8b49f8ed7597", + "width": 32, + "x": 112, + "y": 304, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "d6e70190-dfef-477d-92b9-fe5d25b73f6b", + "width": 32, + "x": 48, + "y": 272, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "60a9f528-1456-40e3-9473-6addbcb7582a", + "width": 32, + "x": 752, + "y": 272, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Peg_Bigger", + "persistentUuid": "cd40b1a4-3837-46ae-9d47-7dd6fbc62efe", + "width": 0, + "x": 605, + "y": 451, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Peg_Bigger", + "persistentUuid": "addfd14b-0c59-4fe5-8228-987601abc98c", + "width": 0, + "x": 195, + "y": 451, + "zOrder": 17, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "21e4e15e-47ea-45f6-8964-de0aa60b80c3", + "width": 32, + "x": 400.0000305175781, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "0ef30dd1-8ede-4c2e-9e51-6fcc9247893c", + "width": 32, + "x": 336.0000305175781, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "43a12a17-852a-4f92-aa58-1bf88f312f79", + "width": 32, + "x": 528, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "734d0a0b-e1f6-4491-ac64-458414624fcf", + "width": 32, + "x": 464.0000305175781, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "789d0707-9580-4076-9cb5-501291fe690f", + "width": 32, + "x": 272.00006103515625, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "29c613bd-b829-41ef-8bcb-f3055816127b", + "width": 32, + "x": 208.0000762939453, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "ac135ff4-24b9-47b0-a5b4-5f3e05d7ab3b", + "width": 32, + "x": 144.00003051757812, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "ff6b9bab-2347-4ffc-9468-6d6e743ce362", + "width": 32, + "x": 80.00003814697266, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "18bfe8d1-3c81-49df-8a77-0fb8026ebace", + "width": 32, + "x": 656, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "b069c8d0-aa09-46a4-8a2b-fc07e1ee8053", + "width": 32, + "x": 592, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "da9f1b51-cec9-494d-b3b8-d0424c98d701", + "width": 32, + "x": 720, + "y": 528, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Move", + "persistentUuid": "6d7fee79-1428-470e-93b1-fc91a228c5a7", + "width": 32, + "x": 368, + "y": 464, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Move", + "persistentUuid": "528daa72-f644-45fb-ae3d-7d7ef348684d", + "width": 32, + "x": 432, + "y": 464, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Move", + "persistentUuid": "9a9409d8-f642-4c3e-906f-64c3ee0af083", + "width": 32, + "x": 304, + "y": 464, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Move", + "persistentUuid": "6e1a6921-c592-4ec1-882d-16f2c2060fbc", + "width": 32, + "x": 496, + "y": 464, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "5c0bf6f5-773b-46cc-9823-455802d86a19", + "width": 32, + "x": 752, + "y": 464, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 32, + "layer": "", + "name": "Peg_Basic", + "persistentUuid": "a13c8d1a-2aab-4ab7-a65f-bfc20ab8686d", + "width": 32, + "x": 48, + "y": 464, + "zOrder": 2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 56, + "layer": "", + "name": "Lives", + "persistentUuid": "93d492a5-d718-4d96-8b38-64a56c37497a", + "width": 214, + "x": 106, + "y": 8, + "zOrder": 19, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 672, + "layer": "GameOver", + "name": "Darkening", + "persistentUuid": "c62af5d7-a247-45ea-bcfe-5acb987c4c70", + "width": 864, + "x": -32, + "y": -32, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "GameOver", + "name": "GameOver", + "persistentUuid": "baae5410-a8d5-4695-9c91-e3af4f7a007b", + "width": 0, + "x": 96, + "y": 109, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "UI_Block", + "persistentUuid": "73dc5b71-9143-4039-80fb-1d3ff36ff27f", + "width": 268, + "x": -12, + "y": -64, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 128, + "layer": "", + "name": "UI_Block", + "persistentUuid": "daeedb0a-82be-4e0f-8308-c8cf82bf12c5", + "width": 256, + "x": 544, + "y": -64, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 64, + "layer": "GameOver", + "name": "NewTextInput", + "persistentUuid": "9e557af3-3ecf-4088-b7be-5b4c105ade68", + "width": 416, + "x": 192, + "y": 288, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "GameOver", + "name": "SubmitScore", + "persistentUuid": "581f22a0-3d8d-4e6c-a933-9ff900cd1e2c", + "width": 0, + "x": 250, + "y": 370, + "zOrder": 26, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 224, + "layer": "Clouds", + "name": "CloudLayer3", + "persistentUuid": "175a396f-0e66-4c1b-b078-4d931ad2f7da", + "width": 928, + "x": -64, + "y": 480, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 180, + "customSize": true, + "height": 192, + "layer": "Clouds", + "name": "CloudLayer3", + "persistentUuid": "71a1b96a-729b-4eaf-b721-5ce3c51c722a", + "width": 928, + "x": -64, + "y": -64, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 224, + "layer": "Clouds", + "name": "CloudLayer3", + "persistentUuid": "2b9a1f23-cedb-4dab-8c0c-323089bd1074", + "width": 1184, + "x": -256, + "y": 480, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 180, + "customSize": true, + "height": 192, + "layer": "Clouds", + "name": "CloudLayer3", + "persistentUuid": "4ea62a65-c2be-408e-8402-aec5597fb5ca", + "width": 1280, + "x": -192, + "y": -96, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 608, + "layer": "Background", + "name": "Background", + "persistentUuid": "13ed0307-aafd-4be7-a01d-9076f5fcb9b3", + "width": 864, + "x": 1184, + "y": 64, + "zOrder": 31, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "GameOver", + "name": "RestartGame", + "persistentUuid": "64534e90-8695-457e-9d21-f2c12ac1927b", + "width": 0, + "x": 319.5, + "y": 441, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Multiplier", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ], + "animations": [ + { + "name": "elementMetal001", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "starGold.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 35, + "y": 35 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "ScoreMultiplier", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "string": "x1", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "characterSize": 30, + "color": { + "b": 28, + "g": 231, + "r": 248 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "x1", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 30, + "color": "248;231;28" + } + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 360, + "emitterForceMax": 70, + "emitterForceMin": 30, + "flow": 100, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "PegStar_Particle", + "particleAlpha1": 255, + "particleAlpha2": 255, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 100, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 3, + "particleLifeTimeMin": 2, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 50, + "particleSize2": 0, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 3, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 6, + "textureParticleName": "assets\\starGold.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Peg_Basic", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Static", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 1, + "friction": 0.3, + "restitution": 1, + "linearDamping": 0.1, + "angularDamping": 0.1, + "gravityScale": 1, + "layers": 1, + "masks": 1 + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "elementStone001.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 35, + "y": 35 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Peg_Move", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Static", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 1, + "friction": 0.3, + "restitution": 1, + "linearDamping": 0.1, + "angularDamping": 0.1, + "gravityScale": 1, + "layers": 1, + "masks": 1 + }, + { + "name": "RectangularMovement", + "type": "RectangularMovement::RectangularMovement", + "HorizontalSpeed": 50, + "VerticalSpeed": 0, + "HorizontalDistance": 100, + "VerticalDistance": 0, + "CenterPointX": 0, + "CenterPointY": 0, + "ProgressX": 0, + "ProgressY": 0, + "RectangularCounter": 0, + "ConstantSpeed": true, + "CounterClockwise": false, + "CurrentDirection": "" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "elementStone001.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 35, + "y": 35 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Peg_Bigger", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Static", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 1, + "friction": 0, + "restitution": 1, + "linearDamping": 0, + "angularDamping": 0, + "gravityScale": 1, + "layers": 1, + "masks": 1 + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ], + "animations": [ + { + "name": "elementMetal001", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.07999999821186066, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "elementExplosive001.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 35, + "y": 35 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Ball", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [ + { + "folded": true, + "name": "Pitch", + "type": "number", + "value": 1 + }, + { + "folded": true, + "name": "Dropped", + "type": "boolean", + "value": false + }, + { + "folded": true, + "name": "Lives", + "type": "number", + "value": 3 + } + ], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Dynamic", + "bullet": false, + "fixedRotation": true, + "canSleep": true, + "shape": "Circle", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 2, + "friction": 0.3, + "restitution": 0.2, + "linearDamping": 0.1, + "angularDamping": 0.1, + "gravityScale": 2, + "layers": 1, + "masks": 1 + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "assets\\Ball.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 13, + "y": 13 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Score", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "string": "Score: 0", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Score: 0", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 40, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Lives", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "string": "Lives: 0", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "characterSize": 40, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Lives: 0", + "font": "PTSans-Bold.ttf", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 40, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "height": 70, + "name": "Walls", + "texture": "elementMetal013.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 220, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "bodyType": "Static", + "bullet": false, + "fixedRotation": false, + "canSleep": true, + "shape": "Box", + "shapeDimensionA": 0, + "shapeDimensionB": 0, + "shapeOffsetX": 0, + "shapeOffsetY": 0, + "polygonOrigin": "Center", + "vertices": [], + "density": 1, + "friction": 0.3, + "restitution": 1, + "linearDamping": 0.1, + "angularDamping": 0.1, + "gravityScale": 1, + "layers": 1, + "masks": 1 + } + ] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 1, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "PegDeath_Particle", + "particleAlpha1": 100, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 114, + "particleColor1": "255;255;255", + "particleColor2": "114;114;114", + "particleGravityX": 0, + "particleGravityY": 95, + "particleGreen1": 255, + "particleGreen2": 114, + "particleLifeTimeMax": 1.5, + "particleLifeTimeMin": 1, + "particleRed1": 255, + "particleRed2": 114, + "particleSize1": 40, + "particleSize2": 40, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 3, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 1, + "textureParticleName": "assets\\StonePeg.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "additive": false, + "assetStoreId": "", + "destroyWhenNoParticles": true, + "emitterAngleA": 0, + "emitterAngleB": 0, + "emitterForceMax": 0, + "emitterForceMin": 0, + "flow": 1, + "jumpForwardInTimeOnCreation": 0, + "maxParticleNb": 300, + "name": "PegBig_Particle", + "particleAlpha1": 100, + "particleAlpha2": 0, + "particleAlphaRandomness1": 0, + "particleAlphaRandomness2": 0, + "particleAngle1": 0, + "particleAngle2": 0, + "particleAngleRandomness1": 0, + "particleAngleRandomness2": 0, + "particleBlue1": 255, + "particleBlue2": 255, + "particleColor1": "255;255;255", + "particleColor2": "255;255;255", + "particleGravityX": 0, + "particleGravityY": 0, + "particleGreen1": 255, + "particleGreen2": 255, + "particleLifeTimeMax": 1, + "particleLifeTimeMin": 1, + "particleRed1": 255, + "particleRed2": 255, + "particleSize1": 100, + "particleSize2": 150, + "particleSizeRandomness1": 0, + "particleSizeRandomness2": 0, + "rendererParam1": 3, + "rendererParam2": 1, + "rendererType": "Quad", + "tank": 1, + "textureParticleName": "assets\\DoublePeg.png", + "type": "ParticleSystem::ParticleEmitter", + "zoneRadius": 0, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Darkening", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Darkening.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "GameOver", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "string": "GAME OVER", + "font": "", + "textAlignment": "", + "characterSize": 100, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "GAME OVER", + "font": "", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 100, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "bottomMargin": 20, + "height": 100, + "leftMargin": 20, + "name": "UI_Block", + "rightMargin": 20, + "texture": "metalPanel.png", + "tiled": true, + "topMargin": 20, + "type": "PanelSpriteObject::PanelSprite", + "width": 100, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ] + }, + { + "assetStoreId": "", + "name": "NewTextInput", + "type": "TextInput::TextInputObject", + "variables": [], + "effects": [], + "behaviors": [], + "content": { + "initialValue": "", + "placeholder": "Touch to start typing", + "fontResourceName": "", + "fontSize": 20, + "inputType": "text", + "textColor": "0;0;0", + "fillColor": "255;255;255", + "fillOpacity": 255, + "borderColor": "0;0;0", + "borderOpacity": 255, + "borderWidth": 1, + "readOnly": false, + "disabled": false + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "SubmitScore", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Submit Score", + "font": "", + "textAlignment": "", + "characterSize": 50, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Submit Score", + "font": "", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 50, + "color": "255;255;255" + } + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "RestartGame", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Restart", + "font": "", + "textAlignment": "", + "characterSize": 50, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Restart", + "font": "", + "textAlignment": "", + "verticalTextAlignment": "top", + "characterSize": 50, + "color": "255;255;255" + } + }, + { + "assetStoreId": "520d7b3a4681a42df216ea3ef7fa0f589eb73e9b020056cc9fa530c3994ea5c0", + "height": 128, + "name": "CloudLayer3", + "texture": "tiled_Cloud layer (3).png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [ + { + "folded": true, + "name": "Speed", + "type": "number", + "value": 0 + } + ], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "3ab58f0740dbc4aaac3552dc7c172d0b7c45fbd38c1b6c7c42dcfd6d86faa404", + "height": 128, + "name": "Background", + "texture": "tiled_Background.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 128, + "variables": [], + "effects": [], + "behaviors": [] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Multiplier" + }, + { + "objectName": "ScoreMultiplier" + }, + { + "objectName": "PegStar_Particle" + }, + { + "objectName": "Peg_Basic" + }, + { + "objectName": "Peg_Move" + }, + { + "objectName": "Peg_Bigger" + }, + { + "objectName": "Ball" + }, + { + "objectName": "Score" + }, + { + "objectName": "Lives" + }, + { + "objectName": "Walls" + }, + { + "objectName": "PegDeath_Particle" + }, + { + "objectName": "PegBig_Particle" + }, + { + "objectName": "Darkening" + }, + { + "objectName": "GameOver" + }, + { + "objectName": "UI_Block" + }, + { + "objectName": "NewTextInput" + }, + { + "objectName": "SubmitScore" + }, + { + "objectName": "RestartGame" + }, + { + "objectName": "CloudLayer3" + }, + { + "objectName": "Background" + } + ] + }, + "events": [ + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Beginning of scene set up", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Setting up some default settings and effects to make the game functional and more appealing to look at." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Multiplier", + "ShakeObject_PositionAngleScale", + "2", + "0", + "10", + "30", + "0", + "2", + "yes", + "" + ] + }, + { + "type": { + "value": "TextObject::String" + }, + "parameters": [ + "ScoreMultiplier", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Background", + "", + "\"Background\"", + "" + ] + }, + { + "type": { + "value": "TiledSpriteObject::SetColor" + }, + "parameters": [ + "Background", + "\"233;178;178\"" + ] + }, + { + "type": { + "value": "TiledSpriteObject::XOffset" + }, + "parameters": [ + "Background", + "-", + "100" + ] + }, + { + "type": { + "value": "TiledSpriteObject::SetOpacity" + }, + "parameters": [ + "CloudLayer3", + "=", + "100" + ] + }, + { + "type": { + "value": "TiledSpriteObject::SetColor" + }, + "parameters": [ + "CloudLayer3", + "\"143;98;168\"" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Ball", + "Physics2", + "no" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "**Hitting pegs", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the ball collides with a breakable, add points to the score based on the current score multiplier." + }, + { + "type": "BuiltinCommonInstructions::ForEach", + "object": "Breakable_Pegs", + "conditions": [ + { + "type": { + "value": "Physics2::CollisionStarted" + }, + "parameters": [ + "Ball", + "Physics2", + "Breakable_Pegs", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreValue", + "+", + "1" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "ClickerBeep.wav", + "", + "20", + "Ball.Variable(Pitch)" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Breakable_Pegs", + "ShakeObject_PositionAngleScale", + "0.2", + "0", + "0", + "0", + "-30", + "0.1", + "", + "" + ] + }, + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "Breakable_Pegs", + "Opacity", + "-", + "30" + ] + }, + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "Ball", + "Pitch", + "+", + "0.05" + ] + }, + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "", + "\"Ball_Pitch\"" + ] + }, + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Breakable_Pegs", + "\"114;114;114\"" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If below a certain opacity value, delete the peg and spawn a death particle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Opacity" + }, + "parameters": [ + "Breakable_Pegs", + "<", + "180" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Breakable_Pegs", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "PegDeath_Particle", + "Breakable_Pegs.X()", + "Breakable_Pegs.Y()", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "PegDeath_Particle", + "=", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the ball collides with a bigger peg, add points to the score based on the current score multiplier times 2." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Physics2::CollisionStarted" + }, + "parameters": [ + "Ball", + "Physics2", + "Peg_Bigger", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreValue", + "+", + "2" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "ClickerBeep.wav", + "", + "30", + "0.8" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Peg_Bigger", + "ShakeObject_PositionAngleScale", + "0.3", + "0", + "0", + "0", + "20", + "0.15", + "", + "" + ] + }, + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "Ball", + "Pitch", + "+", + "0.05" + ] + }, + { + "type": { + "value": "ResetTimer" + }, + "parameters": [ + "", + "\"Ball_Pitch\"" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "PegBig_Particle", + "Peg_Bigger.X()", + "Peg_Bigger.Y()", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "PegDeath_Particle", + "=", + "0" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Score", + "ShakeObject_PositionAngle", + "1", + "0", + "-10", + "0", + "0.2", + "0.15", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 224, + "colorG": 16, + "colorR": 189, + "creationTime": 0, + "name": "**Score multiplier", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the ball collides with the score multiplier object, delete it and create particles, and change the multiplier variable as well as the text displaying that variables value." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + }, + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "name": "Game management events", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reseting the ball's collision pitch to 1, if the ball hasn't collided with any pegs for more than 0.5 seconds." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CompareTimer" + }, + "parameters": [ + "", + "\"Ball_Pitch\"", + ">", + "0.5" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "Ball", + "Pitch", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the ball falls below 1000 along the Y axis, reset it's starting properties andmove it back to the top of the play field.\n\nBut only if the player has more than 0 lives left." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Ball", + ">", + "1000" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Ball", + "Physics2", + "no" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Ball", + "=", + "120" + ] + }, + { + "type": { + "value": "SetBooleanObjectVariable" + }, + "parameters": [ + "Ball", + "Dropped", + "False", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::ShakeObject_PositionAngleScale" + }, + "parameters": [ + "Ball", + "ShakeObject_PositionAngleScale", + "0.4", + "0", + "0", + "0", + "60", + "0.4", + "", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "Ball", + "Lives", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "BallRespawn.wav", + "", + "45", + "1.2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberObjectVariable" + }, + "parameters": [ + "Ball", + "Lives", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "Ball", + "" + ] + }, + { + "type": { + "value": "ShowLayer" + }, + "parameters": [ + "", + "\"GameOver\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the balls \"Dropped\" boolean variable is set to false, have it follow the mouse and allow access to the sub event that will drop the ball is the left mouse button was released." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanObjectVariable" + }, + "parameters": [ + "Ball", + "Dropped", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Ball", + "=", + "clamp(48, MouseX(), 752)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanObjectVariable" + }, + "parameters": [ + "Ball", + "Dropped", + "True", + "" + ] + }, + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Ball", + "Physics2", + "yes" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "ClickerBeep.wav", + "", + "50", + "0.8" + ] + }, + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "Ball", + "Lives", + "-", + "1" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "Lives", + "ShakeObject_PositionAngle", + "1", + "0", + "-10", + "0", + "0.2", + "0.15", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Display the score and lives left" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreDisplay", + "=", + "floor(GlobalVariable(ScoreValue))" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Lives", + "Text", + "=", + "\"Lives: \" + Ball.Lives" + ] + }, + { + "type": { + "value": "TextContainerCapability::TextContainerBehavior::SetValue" + }, + "parameters": [ + "Score", + "Text", + "=", + "\"Score: \" + ScoreDisplay" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When the GameOver kayer has become visible, allow the sub events to be triggered." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "LayerVisible" + }, + "parameters": [ + "", + "\"GameOver\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "GameOver.wav", + "", + "40", + "1" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "GameOver", + "ShakeObject_PositionAngle", + "4", + "0", + "70", + "0", + "2", + "yes", + "" + ] + }, + { + "type": { + "value": "OpacityCapability::OpacityBehavior::SetValue" + }, + "parameters": [ + "Darkening", + "Opacity", + "=", + "220" + ] + }, + { + "type": { + "value": "ChangeLayer" + }, + "parameters": [ + "Score", + "\"Score\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When cursor hovers over the SubmitScore text object, and the left mouse button is released, it will take the text from the text input object and send that to the selected leaderboard and then display the loading screen for the leaderboard and reset the global values for score and score display." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "SubmitScore", + "", + "", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "TextObject::ChangeColor" + }, + "parameters": [ + "SubmitScore", + "\"255;235;0\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Leaderboards::SavePlayerScore" + }, + "parameters": [ + "", + "\"d2c349c3-2f6b-4862-a19b-52eb2845622c\"", + "GlobalVariable(ScoreValue)", + "NewTextInput.Text()" + ] + }, + { + "type": { + "value": "Leaderboards::DisplayLeaderboard" + }, + "parameters": [ + "", + "\"d2c349c3-2f6b-4862-a19b-52eb2845622c\"", + "yes" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreDisplay", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreValue", + "=", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisSurObjet" + }, + "parameters": [ + "SubmitScore", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TextObject::ChangeColor" + }, + "parameters": [ + "SubmitScore", + "\"255;255;255\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When cursor hovers over the RestartGame text object, and the left mouse button is released, it will reset the global variables and change the scene back to the GameScene which will allow the player to start over." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SourisSurObjet" + }, + "parameters": [ + "RestartGame", + "", + "", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "TextObject::ChangeColor" + }, + "parameters": [ + "RestartGame", + "\"255;235;0\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "MouseButtonReleased" + }, + "parameters": [ + "", + "Left" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreDisplay", + "=", + "0" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "ScoreValue", + "=", + "0" + ] + }, + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SourisSurObjet" + }, + "parameters": [ + "RestartGame", + "", + "", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TextObject::ChangeColor" + }, + "parameters": [ + "RestartGame", + "\"255;255;255\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When the leaderboard has finished loading, change the game scene to the \"leaderboard\" game scene so the player is isolated from the game and can only interact with the leaderboard." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Leaderboards::IsLeaderboardViewLoaded" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"Leaderboard\"", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Randomizing the object variable \"Speed\" of the cloud object that will be use in the below event to make them drift at a randomized speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberObjectVariable" + }, + "parameters": [ + "CloudLayer3", + "Speed", + "=", + "RandomFloatInRange(3,7)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "A constant addition to the X offset of the cloud objects so they'll drift slowly across the screen." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "TiledSpriteObject::XOffset" + }, + "parameters": [ + "CloudLayer3", + "+", + "CloudLayer3.Variable(Speed)*TimeDelta()" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 8187816, + "ambientLightColorG": 6040208, + "ambientLightColorR": 7389680, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Background", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 19952200, + "ambientLightColorG": 6043600, + "ambientLightColorR": 10052400, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Clouds", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 32, + "ambientLightColorG": 0, + "ambientLightColorR": 0, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "0;0;0" + }, + "booleanParameters": {} + } + ] + }, + { + "ambientLightColorB": 0, + "ambientLightColorG": 6040208, + "ambientLightColorR": 9174096, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "GameOver", + "renderingType": "", + "visibility": false, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 9248840, + "ambientLightColorG": 6040208, + "ambientLightColorR": 7389680, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Score", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Outline", + "name": "Effect", + "doubleParameters": { + "padding": 2, + "thickness": 2 + }, + "stringParameters": { + "color": "0;0;0" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Physics2", + "type": "Physics2::Physics2Behavior", + "gravityX": 0, + "gravityY": 9.8, + "scaleX": 50, + "scaleY": 50 + }, + { + "name": "RectangularMovement", + "type": "RectangularMovement::RectangularMovement" + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "ShakeObject_PositionAngleScale", + "type": "ShakeObject::ShakeObject_PositionAngleScale" + } + ] + }, + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "Leaderboard", + "name": "Leaderboard", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 1, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [], + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "When the player exits the leaderboard, send them back to GameScene so they can restart the game." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "Leaderboards::IsLeaderboardViewLoaded" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "no" + ] + } + ] + } + ], + "layers": [ + { + "ambientLightColorB": 2, + "ambientLightColorG": 134217728, + "ambientLightColorR": 1597132097, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "", + "extensionNamespace": "", + "fullName": "Shake Object (position, angle, scale)", + "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", + "name": "ShakeObject", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", + "shortDescription": "Shake an object, using one or more ways to shake (position, angle, scale).", + "version": "1.5.5", + "description": [ + "Select one or more methods of shaking:", + "- Position: Shake the X and/or Y position of the object ", + "- Angle: Shake the angle (rotation) of the object ", + "- Scale: Shake the scale of the object (must be a sprite)", + "", + "Control how the object shakes:", + "- Amplitude: How far the object moves during each shake", + "- Duration: Amount of time to shake the object", + "- Time between shakes: Amount of time between each movement of the object", + "- Keep shaking until stopped (boolean)", + "", + "Tips:", + "- For a single-shake effect, set the \"Time between shakes\" to be equal to \"Duration\" (great for a hit or impact)", + "- To make the single-shake move in the opposite direction, use negative numbers ", + "- To repeat a single-shake effect in a loop, add a condition \"Object is not shaking\" ", + "- Use a long \"Time between shakes\" to simulate a slow moving object (like a ship rocking back and forth)", + "- Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. ", + "- Use \"Shake until stopped\" to simulate engine vibration, earthquake, or pulsing" + ], + "origin": { + "identifier": "ShakeObject", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "object", + "effect", + "shake", + "scale", + "position", + "rotate", + "angle" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", + "fullName": "Shake object (position, angle)", + "name": "ShakeObject_PositionAngle", + "objectType": "", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).", + "fullName": "Shake object (position, angle)", + "functionType": "Action", + "name": "ShakeObject_PositionAngle", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5) ", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop any shaking of object that was initiated by the Shake Object extension.", + "fullName": "Stop shaking the object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + }, + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", + "fullName": "Shake object (position, angle, scale)", + "name": "ShakeObject_PositionAngleScale", + "objectType": "Sprite", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale).", + "fullName": "Shake object (position, angle, scale)", + "functionType": "Action", + "name": "ShakeObject_PositionAngleScale", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "=", + "GetArgumentAsNumber(\"PowerScale\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amplitude of scale shake (in percent change) (For example: 5)", + "name": "PowerScale", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Scale shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate object scale displacement, with linear decay over time" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every even shake, increase scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, decrease scale" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking an object.", + "fullName": "Stop shaking an object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "@4ian, Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "", + "extensionNamespace": "", + "fullName": "Rectangular Movement", + "helpPath": "https://victrisgames.itch.io/extension-rectangular-movement", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLXNoYXBlLXJlY3RhbmdsZS1wbHVzIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5LDZIMjJWOEgxOVYxMUgxN1Y4SDE0VjZIMTdWM0gxOVY2TTE3LDE3VjE0SDE5VjE5SDNWNkgxMVY4SDVWMTdIMTdaIiAvPjwvc3ZnPg==", + "name": "RectangularMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/shape-rectangle-plus.svg", + "shortDescription": "Allow an object to move in a rectangular pattern.", + "version": "0.2.1", + "description": [ + "Allow an object to move in a rectangular pattern.", + "By default, movement will slow down when going around corners, but this can be changed to always use a constant speed.", + "", + "Example uses:", + "- Moveable platforms", + "- Enemy movement patterns", + "", + "Properties:", + "- Center of movement, X position", + "- Center of movement, Y position", + "- Horizontal distance", + "- Vertical distance", + "- Horizontal speed", + "- Vertical speed", + "- Use constant speed (object will not slow down at corners)", + "- Use counter-clockwise direction", + "", + "Tips:", + "- Set the CenterX and CenterY values to move the object", + "- For horizontal movement only, set vertical distance to 0", + "- For vertical movement only, set horizontal distance to 0", + "- Use conditions to apply logic based on the direction the object is moving. For example, setting the animation." + ], + "origin": { + "identifier": "RectangularMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "rectangular", + "movement", + "rectangle", + "patrol", + "platform", + "enemy" + ], + "authorIds": [ + "wWP8BSlAW0UP4NeaHa2LcmmDzmH2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Allow an object to move in a rectangular pattern.", + "fullName": "Rectangular Movement", + "name": "RectangularMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Rectangular movement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Set the center of movement to the initial location of the object" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.X()" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Y()" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move slowly around corners (default)", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyConstantSpeed" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move Clockwise or CounterClockwise", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Horizontal movement is the same for both methods" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointX() + cos(ToRad(Object.Behavior::PropertyProgressX())) * abs(Object.Behavior::PropertyHorizontalDistance()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Vertical movement is reversed based on the parameter" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointY() + cos(ToRad(Object.Behavior::PropertyProgressY())) * abs(Object.Behavior::PropertyVerticalDistance()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointY() - cos(ToRad(Object.Behavior::PropertyProgressY())) * abs(Object.Behavior::PropertyVerticalDistance()) / 2" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate how to move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "180" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta()) / 2" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Skip if no horizontal movement is desired" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "180" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Left\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "180" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "360" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta()) / 2" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Skip if no vertical movement is desired" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "360" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Up\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Down\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "360" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "540" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta()) / 2" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Skip if no horizontal movement is desired" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "540" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Right\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "540" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "720" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta()) / 2" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta()) / 2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Skip if no vertical movement is desired" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "720" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Down\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Up\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset the counter after the rectangular path is completed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "720" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "720" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move at a constant speed", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyConstantSpeed" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move Clockwise or CounterClockwise", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Vertical movement is the same for both methods" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointY() - abs(Object.Behavior::PropertyVerticalDistance()) / 2 + Object.Behavior::PropertyProgressY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointX() - abs(Object.Behavior::PropertyHorizontalDistance()) / 2 + Object.Behavior::PropertyProgressX()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyCenterPointX() + abs(Object.Behavior::PropertyHorizontalDistance()) / 2 - Object.Behavior::PropertyProgressX()" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate how to move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "abs(Object.Behavior::HorizontalDistance())" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "abs(Object.Behavior::PropertyHorizontalDistance())" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Left\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Right\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + ">=", + "abs(Object.Behavior::VerticalDistance())" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "abs(Object.Behavior::PropertyVerticalDistance())" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Down\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "abs(Object.Behavior::PropertyHorizontalSpeed() * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when Progress crosses 0 (or if horizontal movement is disabled)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Right\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "RectangularMovement::RectangularMovement::PropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Left\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "3" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "-", + "abs(Object.Behavior::PropertyVerticalSpeed() * TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when Progress crosses 0 (or if vertical movement is disabled)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "<", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Record direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Up\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Counter used to change the Y position of the object.", + "fullName": "Progress Y", + "functionType": "Expression", + "name": "ProgressY", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyProgressY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Counter used to change the X position of the object.", + "fullName": "Progress X", + "functionType": "Expression", + "name": "ProgressX", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyProgressX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Horizontal speed.", + "fullName": "Horizontal speed ", + "functionType": "Expression", + "name": "HorizontalSpeed", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalSpeed()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Vertical speed.", + "fullName": "Vertical speed", + "functionType": "Expression", + "name": "VerticalSpeed", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyVerticalSpeed()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Horizontal distance.", + "fullName": "Horizontal distance", + "functionType": "Expression", + "name": "HorizontalDistance", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyHorizontalDistance()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Vertical distance.", + "fullName": "Vertical distance", + "functionType": "Expression", + "name": "VerticalDistance", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyVerticalDistance()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Center of movement, X position.", + "fullName": "Center of movement, X position", + "functionType": "Expression", + "name": "CenterX", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCenterPointX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Center of movement, Y position.", + "fullName": "Center of movement, Y position", + "functionType": "Expression", + "name": "CenterY", + "sentence": "Set initial Y of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCenterPointY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Set center Y position.", + "fullName": "Set center Y position", + "functionType": "Action", + "name": "SetCenterY", + "sentence": "Set center Y position of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCenterPointY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set center X position.", + "fullName": "Set center X position", + "functionType": "Action", + "name": "SetCenterX", + "sentence": "Set center X position of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCenterPointX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set horizontal distance.", + "fullName": "Set horizontal distance", + "functionType": "Action", + "name": "SetHorizontalDistance", + "sentence": "Set horizontal distance of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyHorizontalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set vertical distance.", + "fullName": "Set vertical distance", + "functionType": "Action", + "name": "SetVerticalDistance", + "sentence": "Set vertical distance of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyVerticalDistance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set horizontal speed.", + "fullName": "Set horizontal speed", + "functionType": "Action", + "name": "SetHorizontalSpeed", + "sentence": "Set horizontal speed of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyHorizontalSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set vertical speed.", + "fullName": "Set vertical speed", + "functionType": "Action", + "name": "SetVerticalSpeed", + "sentence": "Set vertical speed of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyVerticalSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Use counter-clockwise direction.", + "fullName": "Use counter-clockwise direction", + "functionType": "Action", + "name": "SetCounterClockwise", + "sentence": "Use counter-clockwise direction for _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyCounterClockwise" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Counter clockwise?", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Use constant speed.", + "fullName": "Use constant speed", + "functionType": "Action", + "name": "SetConstantSpeed", + "sentence": "Use constant speed for _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyConstantSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"Value\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyConstantSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + }, + { + "description": "Make the speed constant?", + "name": "Value", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Reset progress counters. The object will return to the initial state.", + "fullName": "Reset progress counters", + "functionType": "Action", + "name": "ResetProgressCounters", + "sentence": "Reset progress counters on _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyProgressY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "RectangularMovement::RectangularMovement::SetPropertyRectangularCounter" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving downwards.", + "fullName": "Object is moving downwards", + "functionType": "Condition", + "name": "IsMovingDown", + "sentence": "_PARAM0_ is moving downwards", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving upwards.", + "fullName": "Object is moving upwards", + "functionType": "Condition", + "name": "IsMovingUp", + "sentence": "_PARAM0_ is moving upwards", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Up\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving to the left.", + "fullName": "Object is moving to the left", + "functionType": "Condition", + "name": "IsMovingLeft", + "sentence": "_PARAM0_ is moving to the left", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Object is moving to the right.", + "fullName": "Object is moving to the right", + "functionType": "Condition", + "name": "IsMovingRight", + "sentence": "_PARAM0_ is moving to the right", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "RectangularMovement::RectangularMovement::PropertyCurrentDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "RectangularMovement::RectangularMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "300", + "type": "Number", + "label": "Horizontal speed", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalSpeed" + }, + { + "value": "300", + "type": "Number", + "label": "Vertical speed", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalSpeed" + }, + { + "value": "100", + "type": "Number", + "label": "Horizontal Distance: Amplitude of the movement on X axis (0 to deactivate)", + "description": "", + "group": "", + "extraInformation": [], + "name": "HorizontalDistance" + }, + { + "value": "100", + "type": "Number", + "label": "Vertical Distance: Amplitude of the movement on Y axis (0 to deactivate)", + "description": "", + "group": "", + "extraInformation": [], + "name": "VerticalDistance" + }, + { + "value": "0", + "type": "Number", + "label": "Center of movement, X position", + "description": "", + "group": "", + "extraInformation": [], + "name": "CenterPointX" + }, + { + "value": "0", + "type": "Number", + "label": "Center of movement, Y position", + "description": "", + "group": "", + "extraInformation": [], + "name": "CenterPointY" + }, + { + "value": "0", + "type": "Number", + "label": "Counter used to change X position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProgressX" + }, + { + "value": "0", + "type": "Number", + "label": "Counter used to change Y position", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProgressY" + }, + { + "value": "0", + "type": "Number", + "label": "Counter used for rectangular movement", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "RectangularCounter" + }, + { + "value": "", + "type": "Boolean", + "label": "Use a constant speed for movement", + "description": "", + "group": "", + "extraInformation": [], + "name": "ConstantSpeed" + }, + { + "value": "", + "type": "Boolean", + "label": "Use counter-clockwise direction", + "description": "", + "group": "", + "extraInformation": [], + "name": "CounterClockwise" + }, + { + "value": "", + "type": "Choice", + "label": "Current direction the object is moving", + "description": "", + "group": "", + "extraInformation": [ + "Left", + "Right", + "Up", + "Down" + ], + "hidden": true, + "name": "CurrentDirection" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/tilemapPlatformer/assets/Arrow Key_Down.png b/templates/tilemapPlatformer/assets/Arrow Key_Down.png new file mode 100644 index 0000000..3afceba Binary files /dev/null and b/templates/tilemapPlatformer/assets/Arrow Key_Down.png differ diff --git a/templates/tilemapPlatformer/assets/Arrow Key_Left.png b/templates/tilemapPlatformer/assets/Arrow Key_Left.png new file mode 100644 index 0000000..6c4beec Binary files /dev/null and b/templates/tilemapPlatformer/assets/Arrow Key_Left.png differ diff --git a/templates/tilemapPlatformer/assets/Arrow Key_Right.png b/templates/tilemapPlatformer/assets/Arrow Key_Right.png new file mode 100644 index 0000000..f0f9e76 Binary files /dev/null and b/templates/tilemapPlatformer/assets/Arrow Key_Right.png differ diff --git a/templates/tilemapPlatformer/assets/Arrow Key_Up.png b/templates/tilemapPlatformer/assets/Arrow Key_Up.png new file mode 100644 index 0000000..8f4b0e4 Binary files /dev/null and b/templates/tilemapPlatformer/assets/Arrow Key_Up.png differ diff --git a/templates/tilemapPlatformer/assets/CantoraOne-Regular.ttf b/templates/tilemapPlatformer/assets/CantoraOne-Regular.ttf new file mode 100644 index 0000000..57446a2 Binary files /dev/null and b/templates/tilemapPlatformer/assets/CantoraOne-Regular.ttf differ diff --git a/templates/tilemapPlatformer/assets/GrassLand_Background_4.png b/templates/tilemapPlatformer/assets/GrassLand_Background_4.png new file mode 100644 index 0000000..783a535 Binary files /dev/null and b/templates/tilemapPlatformer/assets/GrassLand_Background_4.png differ diff --git a/templates/tilemapPlatformer/assets/GrassLand_Cloud_1.png b/templates/tilemapPlatformer/assets/GrassLand_Cloud_1.png new file mode 100644 index 0000000..ac407dc Binary files /dev/null and b/templates/tilemapPlatformer/assets/GrassLand_Cloud_1.png differ diff --git a/templates/tilemapPlatformer/assets/Grassland_Terrain_Tileset.png b/templates/tilemapPlatformer/assets/Grassland_Terrain_Tileset.png new file mode 100644 index 0000000..53e8e83 Binary files /dev/null and b/templates/tilemapPlatformer/assets/Grassland_Terrain_Tileset.png differ diff --git a/templates/tilemapPlatformer/assets/Space Key.png b/templates/tilemapPlatformer/assets/Space Key.png new file mode 100644 index 0000000..1a2f0f6 Binary files /dev/null and b/templates/tilemapPlatformer/assets/Space Key.png differ diff --git a/templates/tilemapPlatformer/assets/Tree 2.png b/templates/tilemapPlatformer/assets/Tree 2.png new file mode 100644 index 0000000..cff0e7a Binary files /dev/null and b/templates/tilemapPlatformer/assets/Tree 2.png differ diff --git a/templates/tilemapPlatformer/assets/You Win.png b/templates/tilemapPlatformer/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/tilemapPlatformer/assets/You Win.png differ diff --git a/templates/tilemapPlatformer/assets/assets_Grassland_Terrain_Tileset.png b/templates/tilemapPlatformer/assets/assets_Grassland_Terrain_Tileset.png new file mode 100644 index 0000000..810b187 Binary files /dev/null and b/templates/tilemapPlatformer/assets/assets_Grassland_Terrain_Tileset.png differ diff --git a/templates/tilemapPlatformer/assets/slime_green_walk1.png b/templates/tilemapPlatformer/assets/slime_green_walk1.png new file mode 100644 index 0000000..43da875 Binary files /dev/null and b/templates/tilemapPlatformer/assets/slime_green_walk1.png differ diff --git a/templates/tilemapPlatformer/assets/slime_green_walk2.png b/templates/tilemapPlatformer/assets/slime_green_walk2.png new file mode 100644 index 0000000..2ef33b5 Binary files /dev/null and b/templates/tilemapPlatformer/assets/slime_green_walk2.png differ diff --git a/templates/tilemapPlatformer/assets/slime_green_walk3.png b/templates/tilemapPlatformer/assets/slime_green_walk3.png new file mode 100644 index 0000000..2d03697 Binary files /dev/null and b/templates/tilemapPlatformer/assets/slime_green_walk3.png differ diff --git a/templates/tilemapPlatformer/assets/slime_green_walk4.png b/templates/tilemapPlatformer/assets/slime_green_walk4.png new file mode 100644 index 0000000..b8be63c Binary files /dev/null and b/templates/tilemapPlatformer/assets/slime_green_walk4.png differ diff --git a/templates/tilemapPlatformer/game.json b/templates/tilemapPlatformer/game.json new file mode 100644 index 0000000..617c4aa --- /dev/null +++ b/templates/tilemapPlatformer/game.json @@ -0,0 +1,16174 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 226, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.tilemaptutorial", + "pixelsRounding": true, + "projectUuid": "df2b03ec-3534-4819-bce7-42fd527f479d", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "multiplayer-coop-platformer-tutorial", + "version": "1.0.0", + "name": "Tilemap tutorial", + "description": "A platformer where the players have to go on the next platform by using the tilemap.", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": { + "android-icon-144": "", + "android-icon-192": "", + "android-icon-36": "", + "android-icon-48": "", + "android-icon-72": "", + "android-icon-96": "", + "android-windowSplashScreenAnimatedIcon": "", + "desktop-icon-512": "", + "ios-icon-100": "", + "ios-icon-1024": "", + "ios-icon-114": "", + "ios-icon-120": "", + "ios-icon-144": "", + "ios-icon-152": "", + "ios-icon-167": "", + "ios-icon-180": "", + "ios-icon-20": "", + "ios-icon-29": "", + "ios-icon-40": "", + "ios-icon-50": "", + "ios-icon-57": "", + "ios-icon-58": "", + "ios-icon-60": "", + "ios-icon-72": "", + "ios-icon-76": "", + "ios-icon-80": "", + "ios-icon-87": "", + "liluo-thumbnail": "" + }, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/slime_green_walk1.png", + "kind": "image", + "metadata": "", + "name": "assets\\slime_green_walk1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk2.png", + "kind": "image", + "metadata": "", + "name": "assets\\slime_green_walk2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk3.png", + "kind": "image", + "metadata": "", + "name": "assets\\slime_green_walk3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/slime_green_walk4.png", + "kind": "image", + "metadata": "", + "name": "assets\\slime_green_walk4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Tree 2.png", + "kind": "image", + "metadata": "", + "name": "Tree 2.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Western FPS 2D/Background Element/Plant/dfa57489ad1dbb8ae7589165e7ee2bdd13997a866e9c329dc45b417dba23c17a_Tree 2.png", + "name": "Tree 2.png" + } + }, + { + "file": "assets/assets_Grassland_Terrain_Tileset.png", + "kind": "image", + "metadata": "{\"extension\":\".png\",\"pskl\":{},\"localFilePath\":\"assets/assets_Grassland_Terrain_Tileset.png\"}", + "name": "assets\\Grassland_Terrain_Tileset.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Arrow Key_Down.png", + "kind": "image", + "metadata": "", + "name": "Arrow Key_Down.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Light/94523ef2083c28173877e8deb0e8db26f7ab09e8222438b58cbbb3add069d37a_Arrow Key_Down.png", + "name": "Arrow Key_Down.png" + } + }, + { + "file": "assets/Arrow Key_Left.png", + "kind": "image", + "metadata": "", + "name": "Arrow Key_Left.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Light/9babf0ec0acbd51b85e7ae155534e0ecb734d39621c7618f507bc8211ea82703_Arrow Key_Left.png", + "name": "Arrow Key_Left.png" + } + }, + { + "file": "assets/Arrow Key_Right.png", + "kind": "image", + "metadata": "", + "name": "Arrow Key_Right.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Light/1fec5b7543165a92de8ef20b39e12c85f57de933ccee6798cb924b5d1ec6a254_Arrow Key_Right.png", + "name": "Arrow Key_Right.png" + } + }, + { + "file": "assets/Arrow Key_Up.png", + "kind": "image", + "metadata": "", + "name": "Arrow Key_Up.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Light/1e1b1caa80c49158d2f7a13b27f55146d9b4e1612b90069236bfe5b2b23ea93c_Arrow Key_Up.png", + "name": "Arrow Key_Up.png" + } + }, + { + "file": "assets/Space Key.png", + "kind": "image", + "metadata": "", + "name": "Space Key.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Xelu Free Controller and Key Prompts/Keyboard/Light/0dc138faa184abd28b60a4ea8de0c52382717192f6560130d16d241d50e2cb54_Space Key.png", + "name": "Space Key.png" + } + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": false, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [ + { + "folded": true, + "name": "GameLevel", + "type": "number", + "value": 1 + } + ], + "layouts": [ + { + "b": 255, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 41, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 173, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 2.353003667872166, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Slime", + "persistentUuid": "564d1a60-159e-4ea7-aa94-d2abe9ad8892", + "width": 0, + "x": 630, + "y": 342, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "Tilemap", + "persistentUuid": "3bced925-c173-429b-9fce-f23a94378528", + "width": 0, + "x": 448, + "y": 258, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [ + { + "name": "tilemap", + "value": "{\"tileWidth\":16,\"tileHeight\":16,\"dimX\":30,\"dimY\":15,\"layers\":[{\"id\":0,\"alpha\":1,\"tiles\":[[0,1,1,1,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,9,9,9,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,9,9,9,9,10,1,1,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[8,9,9,9,9,10,9,9,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,2],[8,9,9,9,9,10,9,9,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,-1,-1,-1,-1,-1,-1,-1,-1,3,14,14,-1,14,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,1,1,1,2,-1,-1,-1,-1,0,1,1,1,2,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,9,9,9,10,-1,-1,-1,-1,8,9,9,9,9,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,9,9,9,10,-1,-1,-1,-1,8,9,9,9,9,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,9,9,9,10,20,21,22,-1,8,9,9,9,9,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,9,9,9,10,-1,-1,-1,-1,8,9,9,9,9,8,9,9,9,9,9,10],[8,9,9,9,9,10,9,9,9,10,9,9,9,10,-1,-1,-1,-1,8,9,9,9,9,8,9,9,9,9,9,10],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]]}]}" + } + ], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 174, + "keepRatio": true, + "layer": "", + "locked": true, + "name": "Tree", + "persistentUuid": "70ea51ea-fb80-4b58-9240-69513d36190f", + "sealed": true, + "width": 136, + "x": 754, + "y": 210, + "zOrder": -2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "flippedX": true, + "height": 174, + "keepRatio": true, + "layer": "", + "locked": true, + "name": "Tree", + "persistentUuid": "a32d2046-2a61-4aab-87b2-357125d7776b", + "sealed": true, + "width": 136, + "x": 495, + "y": 183, + "zOrder": -2, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 20, + "keepRatio": true, + "layer": "", + "name": "ArrowKey", + "persistentUuid": "58ee9d3a-120b-4fd3-91cb-9331e66f92fc", + "width": 20, + "x": 623, + "y": 320, + "zOrder": 2, + "numberProperties": [ + { + "name": "animation", + "value": 1 + } + ], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 20, + "keepRatio": true, + "layer": "", + "name": "ArrowKey", + "persistentUuid": "2095461c-3297-457a-8a8b-d85e67439d23", + "width": 20, + "x": 639, + "y": 320, + "zOrder": 2, + "numberProperties": [ + { + "name": "animation", + "value": 2 + } + ], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 32, + "keepRatio": true, + "layer": "", + "name": "SpaceKey", + "persistentUuid": "c8c11066-d0f5-46db-809a-e20d8d0ccf66", + "width": 32, + "x": 625, + "y": 298, + "zOrder": 3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "Slime", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "PixelPerfectPlatformerCharacter", + "type": "PixelPerfectMovement::PixelPerfectPlatformerCharacter", + "PlatformerCharacter": "PlatformerObject", + "PixelSize": 1, + "OffsetX": 0, + "OffsetY": 0, + "TargetX": 0, + "TargetDirectionX": 0, + "TargetY": 0, + "TargetDirectionY": 0, + "PreviousSpeedX": 2.0247e-320, + "IsDecelerating": false + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "EnableAnimationChanges": true, + "EnableHorizontalFlipping": true, + "IdleAnimationName": "Idle", + "RunAnimationName": "Run", + "JumpAnimationName": "Jump", + "FallAnimationName": "Fall", + "ClimbAnimationName": "Climb", + "PlatformerBehavior": "PlatformerObject", + "Animation": "Animation", + "Flippable": "Flippable" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior", + "jumpSpeed": 200, + "acceleration": 500, + "canGoDownFromJumpthru": true, + "canGrabPlatforms": false, + "canGrabWithoutMoving": true, + "deceleration": 1500, + "gravity": 1000, + "ignoreDefaultControls": false, + "jumpSustainTime": 0.2, + "ladderClimbingSpeed": 150, + "maxFallingSpeed": 700, + "maxSpeed": 100, + "slopeMaxAngle": 60, + "useLegacyTrajectory": false, + "xGrabTolerance": 10, + "yGrabOffset": 0 + }, + { + "name": "SmoothCamera", + "type": "SmoothCamera::SmoothCamera", + "LeftwardSpeed": 0.9, + "RightwardSpeed": 0.9, + "UpwardSpeed": 0.9, + "DownwardSpeed": 0.9, + "FollowOnX": true, + "FollowOnY": true, + "FollowFreeAreaLeft": 0, + "FollowFreeAreaRight": 0, + "FollowFreeAreaTop": 0, + "FollowFreeAreaBottom": 0, + "CameraOffsetX": 0, + "CameraOffsetY": 0, + "CameraDelay": 0, + "ForecastTime": 0, + "ForecastHistoryDuration": 0, + "LogLeftwardSpeed": 2.0247e-320, + "LogRightwardSpeed": 2.0247e-320, + "LogDownwardSpeed": 2.0247e-320, + "LogUpwardSpeed": 2.0247e-320, + "DelayedCenterX": 2.0247e-320, + "DelayedCenterY": 2.0247e-320, + "ForecastHistoryMeanX": 2.0247e-320, + "ForecastHistoryMeanY": 2.0247e-320, + "ForecastHistoryVarianceX": 2.0247e-320, + "ForecastHistoryCovariance": 2.0247e-320, + "ForecastHistoryLinearA": 2.0247e-320, + "ForecastHistoryLinearB": 2.0247e-320, + "ForecastedX": 2.0247e-320, + "ForecastedY": 2.0247e-320, + "ProjectedNewestX": 2.0247e-320, + "ProjectedNewestY": 2.0247e-320, + "ProjectedOldestX": 2.0247e-320, + "ProjectedOldestY": 2.0247e-320, + "ForecastHistoryVarianceY": 2.0247e-320, + "Index": 2.0247e-320, + "CameraDelayCatchUpSpeed": 0, + "CameraExtraDelay": 2.0247e-320, + "WaitingSpeedXMax": 2.0247e-320, + "WaitingSpeedYMax": 2.0247e-320, + "WaitingEnd": 2.0247e-320, + "CameraDelayCatchUpDuration": 2.0247e-320, + "LeftwardSpeedMax": 9000, + "RightwardSpeedMax": 9000, + "UpwardSpeedMax": 9000, + "DownwardSpeedMax": 9000, + "OldX": 9000.000000007454, + "OldY": 9000.000000007454, + "IsCalledManually": false + }, + { + "name": "SmoothPlatformerCamera", + "type": "SmoothCamera::SmoothPlatformerCamera", + "PlatformerCharacter": "PlatformerObject", + "SmoothCamera": "SmoothCamera", + "JumpOriginY": 1.870938225360772e-308, + "AirFollowFreeAreaTop": 0, + "AirFollowFreeAreaBottom": 0, + "FloorFollowFreeAreaTop": 0, + "FloorFollowFreeAreaBottom": 0, + "AirUpwardSpeed": 0.95, + "AirDownwardSpeed": 0.95, + "FloorUpwardSpeed": 0.9, + "FloorDownwardSpeed": 0.9, + "AirUpwardSpeedMax": 9000, + "AirDownwardSpeedMax": 9000, + "FloorUpwardSpeedMax": 9000, + "FloorDownwardSpeedMax": 9000 + } + ], + "animations": [ + { + "name": "Run", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.11, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\slime_green_walk1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\slime_green_walk2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\slime_green_walk3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + }, + { + "hasCustomCollisionMask": true, + "image": "assets\\slime_green_walk4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 5, + "y": 12 + }, + { + "x": 19, + "y": 12 + }, + { + "x": 19, + "y": 24 + }, + { + "x": 5, + "y": 24 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "name": "Tilemap", + "type": "TileMap::SimpleTileMap", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior", + "canBeGrabbed": true, + "platformType": "NormalPlatform", + "yGrabOffset": 0 + } + ], + "content": { + "atlasImage": "assets\\Grassland_Terrain_Tileset.png", + "rowCount": 6, + "columnCount": 8, + "tileSize": 16, + "tilesWithHitBox": "2,1,0,8,9,10" + } + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "dd79d300ef0b79227904c455e2c8491c394a376ccff18ad46299bca515ecda4d", + "name": "Tree", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Tree 2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 146, + "y": 0 + }, + { + "x": 146, + "y": 187 + }, + { + "x": 0, + "y": 187 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "d66829cbf4530b925ac8c83d8786ea4c17d3059da92bf761ecb00bed3dedfff7", + "name": "ArrowKey", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Arrow Key_Down.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 12, + "y": 14 + }, + { + "x": 88, + "y": 14 + }, + { + "x": 88, + "y": 86 + }, + { + "x": 12, + "y": 86 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Arrow Key_Left.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 12, + "y": 14 + }, + { + "x": 88, + "y": 14 + }, + { + "x": 88, + "y": 86 + }, + { + "x": 12, + "y": 86 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Arrow Key_Right.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 12, + "y": 14 + }, + { + "x": 88, + "y": 14 + }, + { + "x": 88, + "y": 86 + }, + { + "x": 12, + "y": 86 + } + ] + ] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Arrow Key_Up.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 12, + "y": 14 + }, + { + "x": 88, + "y": 14 + }, + { + "x": 88, + "y": 86 + }, + { + "x": 12, + "y": 86 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "01ab324c7be80d3da307ddc14fa8918b5bd8ea1dd6db64f995c7f57c4d78860a", + "name": "SpaceKey", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Space Key.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 2, + "y": 26 + }, + { + "x": 98, + "y": 26 + }, + { + "x": 98, + "y": 74 + }, + { + "x": 2, + "y": 74 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Tilemap" + }, + { + "objectName": "EndingDialog" + }, + { + "objectName": "Slime" + }, + { + "objectName": "Tree" + }, + { + "objectName": "ArrowKey" + }, + { + "objectName": "SpaceKey" + } + ] + }, + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Tilemap.TileIdAtPosition(775, 350)", + "!=", + "13" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "\"Interface\"" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraCenterX(\"Interface\")", + "=", + "CameraCenterY(\"Interface\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "5", + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset the scene if the player fall" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Slime", + ">", + "460" + ] + } + ], + "actions": [ + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Instruction to implement to pick the apple:\n\nIf the Slime collide with tile of the apple, then remove the tile at the same position of the Slime." + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Interface", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "PixelPerfectPlatformerCharacter", + "type": "PixelPerfectMovement::PixelPerfectPlatformerCharacter" + }, + { + "name": "Platform", + "type": "PlatformBehavior::PlatformBehavior" + }, + { + "name": "PlatformerCharacterAnimator", + "type": "PlatformerCharacterAnimator::PlatformerCharacterAnimator" + }, + { + "name": "PlatformerObject", + "type": "PlatformBehavior::PlatformerObjectBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "SmoothCamera", + "type": "SmoothCamera::SmoothCamera" + }, + { + "name": "SmoothPlatformerCamera", + "type": "SmoothCamera::SmoothPlatformerCamera" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Platformer character animator", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGc+DQoJPHBhdGggZD0iTTIzLDExYzIuMiwwLDQtMS44LDQtNHMtMS44LTQtNC00cy00LDEuOC00LDRTMjAuOCwxMSwyMywxMXoiLz4NCgk8cGF0aCBkPSJNMzAuOCwxMi40Yy0wLjMtMC40LTEtMC41LTEuNC0wLjJsLTIuOSwyLjNjLTAuOCwwLjctMiwwLjYtMi43LTAuMmwtNy45LTcuOWMtMS42LTEuNi00LjEtMS42LTUuNywwTDcuMyw5LjMNCgkJYy0wLjQsMC40LTAuNCwxLDAsMS40czEsMC40LDEuNCwwbDIuOC0yLjhjMC44LTAuOCwyLjEtMC44LDIuOSwwbDEuNiwxLjZMMTEuNiwxNGMtMSwxLTEuNCwyLjMtMS4xLDMuN2MwLjIsMS4xLDAuOSwyLDEuOCwyLjYNCgkJbC0xLjYsMS42Yy0wLjQsMC40LTEsMC40LTEuNCwwbC0zLjYtMy42Yy0wLjQtMC40LTEtMC40LTEuNCwwcy0wLjQsMSwwLDEuNGwzLjYsMy42YzAuNiwwLjYsMS4zLDAuOSwyLjEsMC45czEuNi0wLjMsMi4xLTAuOQ0KCQlsMi4xLTIuMWwyLjUsMWMwLjcsMC4zLDEuMiwxLDEuMiwxLjh2NmMwLDAuNiwwLjQsMSwxLDFzMS0wLjQsMS0xdi02YzAtMS42LTEtMy4xLTIuNS0zLjdsLTEuNy0wLjdsNS4yLTUuMmwxLjQsMS40DQoJCWMwLjgsMC44LDEuOCwxLjIsMi45LDEuMmMwLjksMCwxLjgtMC4zLDIuNS0wLjlsMi45LTIuM0MzMS4xLDEzLjQsMzEuMSwxMi44LDMwLjgsMTIuNHoiLz4NCjwvZz4NCjwvc3ZnPg0K", + "name": "PlatformerCharacterAnimator", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Glyphster Pack/Master/SVG/Sports and Fitness/Sports and Fitness_training_running_run.svg", + "shortDescription": "Change animations and horizontal flipping of a platformer character automatically.", + "version": "1.1.0", + "description": [ + "Automatically change the animations and horizontal flipping of a platformer character based on movement and interaction with platform objects.", + "", + "The platformer example uses this extension ([open the project online](https://editor.gdevelop.io/?project=example://platformer))." + ], + "origin": { + "identifier": "PlatformerCharacterAnimator", + "name": "gdevelop-extension-store" + }, + "tags": [ + "animation", + "platformer", + "platform", + "flip" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Change animations and horizontal flipping of a platformer character automatically.", + "fullName": "Platformer character animator", + "name": "PlatformerCharacterAnimator", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flippable", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onActivate", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Flip character based on input from controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Right\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerBehavior", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlippableCapability::FlippableBehavior::FlipX" + }, + "parameters": [ + "Object", + "Flip", + "no" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change animations", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::PropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyJumpAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyFallAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnFloor" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyRunAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyIdleAnimationName()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "Object.Behavior::PropertyClimbAnimationName()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsMovingEvenALittle" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerBehavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Object", + "Animation" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated animation changes a platformer character. Disabling animation changes is useful to play custom animations.", + "fullName": "Enable (or disable) automated animation changes", + "functionType": "Action", + "name": "EnableChangingAnimations", + "sentence": "Enable automated animation changes on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableAnimationChanges\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableAnimationChanges" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Change animations automatically", + "name": "EnableAnimationChanges", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable (or disable) automated horizontal flipping of a platform character.", + "fullName": "Enable (or disable) automated horizontal flipping", + "functionType": "Action", + "name": "EnableHorizontalFlipping", + "sentence": "Enable automated horizontal flipping on _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"EnableHorizontalFlipping\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyEnableHorizontalFlipping" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "defaultValue": "yes", + "description": "Enable horizontal flipping", + "name": "EnableHorizontalFlipping", + "optional": true, + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Idle\" animation name. Do not use quotation marks.", + "fullName": "\"Idle\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetIdleAnimationName", + "sentence": "Set \"Idle\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyIdleAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Move\" animation name. Do not use quotation marks.", + "fullName": "\"Move\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetMoveAnimationName", + "sentence": "Set \"Move\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyRunAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Jump\" animation name. Do not use quotation marks.", + "fullName": "\"Jump\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetJumpAnimationName", + "sentence": "Set \"Jump\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyJumpAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Fall\" animation name. Do not use quotation marks.", + "fullName": "\"Fall\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetFallAnimationName", + "sentence": "Set \"Fall\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyFallAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set the \"Climb\" animation name. Do not use quotation marks.", + "fullName": "\"Climb\" animation name", + "functionType": "Action", + "group": "Configure animations", + "name": "SetClimbAnimationName", + "sentence": "Set \"Climb\" animation of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PlatformerCharacterAnimator::PlatformerCharacterAnimator::SetPropertyClimbAnimationName" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"AnimationName\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PlatformerCharacterAnimator::PlatformerCharacterAnimator", + "type": "behavior" + }, + { + "description": "Animation name", + "name": "AnimationName", + "type": "string" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "Enable animation changes", + "description": "", + "group": "", + "extraInformation": [], + "name": "EnableAnimationChanges" + }, + { + "value": "true", + "type": "Boolean", + "label": "Enable horizontal flipping", + "description": "", + "group": "", + "extraInformation": [], + "name": "EnableHorizontalFlipping" + }, + { + "value": "Idle", + "type": "String", + "label": "\"Idle\" animation name ", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Run", + "type": "String", + "label": "\"Run\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "RunAnimationName" + }, + { + "value": "Jump", + "type": "String", + "label": "\"Jump\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "JumpAnimationName" + }, + { + "value": "Fall", + "type": "String", + "label": "\"Fall\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "FallAnimationName" + }, + { + "value": "Climb", + "type": "String", + "label": "\"Climb\" animation name", + "description": "", + "group": "Animation names", + "extraInformation": [], + "name": "ClimbAnimationName" + }, + { + "value": "", + "type": "Behavior", + "label": "Platformer character", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerBehavior" + }, + { + "value": "", + "type": "Behavior", + "label": "Animatable capacity", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Flippable capacity", + "description": "", + "group": "", + "extraInformation": [ + "FlippableCapability::FlippableBehavior" + ], + "name": "Flippable" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Pixel perfect movement", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30NCgkuc3Qye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWRhc2hhcnJheTo2LDY7fQ0KCS5zdDN7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtZGFzaGFycmF5OjQsNDt9DQoJLnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7fQ0KCS5zdDV7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1kYXNoYXJyYXk6My4xMDgxLDMuMTA4MTt9DQoJDQoJCS5zdDZ7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5OjQsMzt9DQo8L3N0eWxlPg0KPHJlY3QgeD0iNCIgeT0iNCIgY2xhc3M9InN0MCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMTIiIHkxPSIyOCIgeDI9IjEyIiB5Mj0iNCIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjIwIiB5MT0iMjgiIHgyPSIyMCIgeTI9IjQiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOCIgeTE9IjIwIiB4Mj0iNCIgeTI9IjIwIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMjgiIHkxPSIxMiIgeDI9IjQiIHkyPSIxMiIvPg0KPC9zdmc+DQo=", + "name": "PixelPerfectMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Graphic Design/Graphic Design_grid.svg", + "shortDescription": "Grid-based or pixel perfect platformer and top-down movements.", + "version": "0.2.1", + "description": [ + "Games with pixel art usually use pixels bigger than actual pixels of the screen. This can lead to big pixels partially overlapping each other which doesn't look good.", + "", + "This extension allows to seamlessly keep big pixels aligned when the object is stopped and still beneficiate from the high resolution of the screen to have smooth movements.", + "", + "It can be used for:", + "* Pixel-perfect platformers ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap))", + "* Align top-down characters on a grid ([open the project online](https://editor.gdevelop.io/?project=example://top-down-grid-movement))" + ], + "origin": { + "identifier": "PixelPerfectMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "pixel perfect", + "platformer", + "platform", + "top-down", + "movement", + "grid" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "mkJFlZEo4aXeAZxt8CsXjEkW4Oq1", + "mMR36hCjO5dlcYmhNSuVtcREM473" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Return the speed necessary to cover a distance according to the deceleration.", + "fullName": "Speed to reach", + "functionType": "Expression", + "name": "SpeedToReach", + "private": true, + "sentence": "Braking distance from an initial speed: _PARAM2_ and a deceleration: _PARAM3_ is less than _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Distance", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "sqrt(2 * Distance * Deceleration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "Distance", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "-sqrt(-2 * Distance * Deceleration)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Distance", + "name": "Distance", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the braking distance according to an initial speed and a deceleration.", + "fullName": "Braking distance", + "functionType": "Expression", + "name": "BrakingDistance", + "private": true, + "sentence": "Braking distance from an initial speed: _PARAM2_ and a deceleration: _PARAM3_ is less than _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Speed * Speed / (2 * Deceleration)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Speed", + "name": "Speed", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Define JavaScript classes for top-down.", + "fullName": "Define JavaScript classes for top-down", + "functionType": "Action", + "name": "DefineJavaScriptForTopDown", + "private": true, + "sentence": "Define JavaScript classes for top-down", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "if (gdjs.__pixelPerfectExtension) {", + " return;", + "}", + "", + "const epsilon = 1 / (1 << 20);", + "", + "class PixelPerfectTopDownMovement {", + "", + " /**", + " * @param {gdjs.RuntimeBehavior} pixelPerfectBehavior", + " * @param {gdjs.TopDownMovementRuntimeBehavior} topDownBehavior", + " */", + " constructor(pixelPerfectBehavior, topDownBehavior) {", + " /** @type {gdjs.RuntimeBehavior} */", + " this.pixelPerfectBehavior = pixelPerfectBehavior;", + " /** @type {gdjs.TopDownMovementRuntimeBehavior} */", + " this.topDownBehavior = topDownBehavior;", + "", + " topDownBehavior.registerHook(this);", + "", + " /** @type {number | null} */", + " this.targetX = null;", + " /** @type {number | null} */", + " this.targetY = null;", + " this.targetDirectionX = 0;", + " this.targetDirectionY = 0;", + " this.lastDirection = -1;", + " this.isVelocityAdjusted = false;", + " this.isVelocityAdjustedOnX = false;", + " this.isVelocityAdjustedOnY = false;", + " }", + "", + " /**", + " * Return the direction to use instead of the direction given in", + " * parameter.", + " * @param {gdjs.TopDownMovementRuntimeBehavior.TopDownMovementHookContext} context", + " * @return {number}", + " */", + " overrideDirection(context) {", + " let direction = context.getDirection();", + " if (!this.pixelPerfectBehavior.activated()) {", + " return direction;", + " }", + "", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " if (cellSize <= 0 || that._allowDiagonals) {", + " return direction;", + " }", + "", + " // Forbid to turn before being aligned on the grid.", + "", + " const timeDelta = object.getElapsedTime() / 1000;", + " const deltaX = Math.abs(that._xVelocity * timeDelta);", + " const deltaY = Math.abs(that._yVelocity * timeDelta);", + "", + " const isTryingToMoveOnX = direction === 4 || direction === 0;", + " const isTryingToMoveOnY = direction === 6 || direction === 2;", + " if (isTryingToMoveOnX) {", + " if (that._yVelocity < 0) {", + " if (Math.abs(this.ceilToCellY(object.y) - object.y) > deltaY) {", + " direction = 6;", + " } else {", + " object.y = this.ceilToCellY(object.y);", + " }", + " }", + " if (that._yVelocity > 0) {", + " if (Math.abs(this.floorToCellY(object.y) - object.y) > deltaY) {", + " direction = 2;", + " } else {", + " object.y = this.floorToCellY(object.y);", + " }", + " }", + " } else if (isTryingToMoveOnY) {", + " if (that._xVelocity < 0) {", + " if (Math.abs(this.ceilToCellX(object.x) - object.x) > deltaX) {", + " direction = 4;", + " } else {", + " object.x = this.ceilToCellX(object.x);", + " }", + " }", + " if (that._xVelocity > 0) {", + " if (Math.abs(this.floorToCellX(object.x) - object.x) > deltaX) {", + " direction = 0;", + " } else {", + " object.x = this.floorToCellX(object.x);", + " }", + " }", + " }", + "", + " // Ensure sharp turn even with Verlet integrations.", + " const speed = Math.abs(that._xVelocity + that._yVelocity);", + " if (direction === 0) {", + " that._xVelocity = speed;", + " that._yVelocity = 0;", + " } else if (direction === 4) {", + " that._xVelocity = -speed;", + " that._yVelocity = 0;", + " } else if (direction === 2) {", + " that._yVelocity = speed;", + " that._xVelocity = 0;", + " } else if (direction === 6) {", + " that._yVelocity = -speed;", + " that._xVelocity = 0;", + " }", + "", + " this.lastDirection = direction;", + " return direction;", + " }", + "", + " /**", + " * Called before the acceleration and new direction is applied to the", + " * velocity.", + " * @param {gdjs.TopDownMovementRuntimeBehavior.TopDownMovementHookContext} context", + " */", + " beforeSpeedUpdate(context) {", + " if (!this.pixelPerfectBehavior.activated()) {", + " return;", + " }", + "", + " const direction = context.getDirection();", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const isMovingOnX =", + " direction !== -1 && direction !== 2 && direction !== 6;", + " if (isMovingOnX) {", + " this.targetX = null;", + " } else if (this.targetX === null) {", + " // Find where the deceleration should stop the object.", + " if (that._xVelocity > 0) {", + " this.targetX = this.ceilToCellX(", + " object.x + this.getBreakingDistanceX()", + " );", + " this.targetDirectionX = 1;", + " }", + " if (that._xVelocity < 0) {", + " this.targetX = this.floorToCellX(", + " object.x - this.getBreakingDistanceX()", + " );", + " this.targetDirectionX = -1;", + " }", + " }", + "", + " const isMovingOnY =", + " direction !== -1 && direction !== 0 && direction !== 4;", + " if (isMovingOnY) {", + " this.targetY = null;", + " } else if (this.targetY === null) {", + " // Find where the deceleration should stop the object.", + " if (that._yVelocity > 0) {", + " this.targetY = this.ceilToCellY(", + " object.y + this.getBreakingDistanceY()", + " );", + " this.targetDirectionY = 1;", + " }", + " if (that._yVelocity < 0) {", + " this.targetY = this.floorToCellY(", + " object.y - this.getBreakingDistanceY()", + " );", + " this.targetDirectionY = -1;", + " }", + " }", + "", + " // Make as if the player had press button a bit longer to reach exactly", + " // the next cell.", + "", + " this.isVelocityAdjustedOnX = this.targetX !== null;", + " if (this.isVelocityAdjustedOnX) {", + " if (this.targetDirectionX > 0) {", + " if (this.targetX > object.getX()) {", + " that._xVelocity = Math.min(", + " that._xVelocity + that._acceleration,", + " that._maxSpeed,", + " this.getSpeedToReach(this.targetX - object.getX())", + " );", + " }", + " const nextFrameX = object.getX() + that._xVelocity * object.getElapsedTime() / 1000;", + " if (this.targetX <= nextFrameX) {", + " that._xVelocity = 0;", + " object.setX(this.roundToCellX(object.getX()));", + " this.targetX = null;", + " }", + " }", + " if (this.targetDirectionX < 0) {", + " if (this.targetX < object.getX()) {", + " that._xVelocity = Math.max(", + " that._xVelocity - that._acceleration,", + " -that._maxSpeed,", + " this.getSpeedToReach(this.targetX - object.getX())", + " );", + " }", + " const nextFrameX = object.getX() + that._xVelocity * object.getElapsedTime() / 1000;", + " if (this.targetX >= nextFrameX) {", + " that._xVelocity = 0;", + " object.setX(this.roundToCellX(object.getX()));", + " this.targetX = null;", + " }", + " }", + " // The velocity is exact. There no need for Verlet integration.", + " this.previousVelocityX = that._xVelocity;", + " }", + "", + " this.isVelocityAdjustedOnY = this.targetY !== null;", + " if (this.isVelocityAdjustedOnY) {", + " if (this.targetDirectionY > 0) {", + " if (this.targetY > object.getY()) {", + " that._yVelocity = Math.min(", + " that._yVelocity + that._acceleration,", + " that._maxSpeed,", + " this.getSpeedToReach(this.targetY - object.getY())", + " );", + " }", + " const nextFrameY = object.getY() + that._yVelocity * object.getElapsedTime() / 1000;", + " if (this.targetY <= nextFrameY) {", + " that._yVelocity = 0;", + " object.setY(this.roundToCellY(object.getY()));", + " this.targetY = null;", + " }", + " }", + " if (this.targetDirectionY < 0) {", + " if (this.targetY < object.getY()) {", + " that._yVelocity = Math.max(", + " that._yVelocity - that._acceleration,", + " -that._maxSpeed,", + " this.getSpeedToReach(this.targetY - object.getY())", + " );", + " }", + " const nextFrameY = object.getY() + that._yVelocity * object.getElapsedTime() / 1000;", + " if (this.targetY >= nextFrameY) {", + " that._yVelocity = 0;", + " object.setY(this.roundToCellY(object.getY()));", + " this.targetY = null;", + " }", + " }", + " // The velocity is exact. There no need for Verlet integration.", + " this.previousVelocityY = that._yVelocity;", + " }", + " }", + "", + " /**", + " * Called before the velocity is applied to the object position and", + " * angle.", + " */", + " beforePositionUpdate() {", + " if (!this.pixelPerfectBehavior.activated()) {", + " return;", + " }", + "", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const that = this.topDownBehavior;", + "", + " if (this.isVelocityAdjustedOnX) {", + " // The velocity is exact. There no need for Verlet integration.", + " that._xVelocity = this.previousVelocityX;", + " }", + " if (this.isVelocityAdjustedOnY) {", + " // The velocity is exact. There no need for Verlet integration.", + " that._yVelocity = this.previousVelocityY;", + " }", + " }", + "", + " doStepPostEvents(instanceContainer) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " const isMovingOnX =", + " this.lastDirection !== -1 &&", + " this.lastDirection !== 2 &&", + " this.lastDirection !== 6;", + " const isMovingOnY =", + " this.lastDirection !== -1 &&", + " this.lastDirection !== 0 &&", + " this.lastDirection !== 4;", + "", + " // Avoid rounding errors after a call to \"separate\" to make characters", + " // move indefinitely in front of a wall because they can't reach the cell.", + " if (!isMovingOnX && that._xVelocity !== 0) {", + " const x = object.getX();", + " const roundedX = this.roundToCellX(x);", + " if (Math.abs(roundedX - x) < epsilon) {", + " object.setX(roundedX);", + " this.targetDirectionX = 0;", + " that._xVelocity = 0;", + " }", + " }", + " if (!isMovingOnY && that._yVelocity !== 0) {", + " const y = object.getY();", + " const roundedY = this.roundToCellY(y);", + " if (Math.abs(roundedY - y) < epsilon) {", + " object.setY(roundedY);", + " this.targetDirectionY = 0;", + " that._yVelocity = 0;", + " }", + " }", + " }", + "", + " /**", + " * @returns {number} the braking distance according to an initial speed and a deceleration.", + " */", + " getBreakingDistanceX() {", + " const that = this.topDownBehavior;", + " return (that._xVelocity * that._xVelocity) / (2 * that._deceleration);", + " }", + "", + " /**", + " * @returns {number} the braking distance according to an initial speed and a deceleration.", + " */", + " getBreakingDistanceY() {", + " const that = this.topDownBehavior;", + " return (that._yVelocity * that._yVelocity) / (2 * that._deceleration);", + " }", + "", + " /**", + " * @param {number} displacement", + " * @returns {number} the speed necessary to cover a distance according to the deceleration.", + " */", + " getSpeedToReach(displacement) {", + " const that = this.topDownBehavior;", + " return (", + " Math.sign(displacement) *", + " Math.sqrt(2 * Math.abs(displacement) * that._deceleration)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " ceilToCellX(x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.ceil((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " roundToCellX(x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.round((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " floorToCellX(x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.floor((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " ceilToCellY(y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.ceil((y - gridOffsetY) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " roundToCellY(y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.round((y - gridOffsetY) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " floorToCellY(y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.floor((y - gridOffsetY) / cellSize)", + " );", + " }", + "}", + "", + "gdjs.__pixelPerfectExtension = {", + " PixelPerfectTopDownMovement", + "}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Seamlessly align big pixels using a top-down movement.", + "fullName": "Pixel perfect top-down movement", + "name": "PixelPerfectTopDownMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::DefineJavaScriptForTopDown" + }, + "parameters": [ + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "\r", + "const object = objects[0];\r", + "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\r", + "const behavior = object.getBehavior(behaviorName);\r", + "\r", + "/** @type {gdjs.TopDownMovementRuntimeBehavior} */\r", + "const topDownBehavior = object.getBehavior(behavior._getTopDownMovement());\r", + "\r", + "const pixelPerfect = new gdjs.__pixelPerfectExtension.PixelPerfectTopDownMovement(behavior, topDownBehavior);\r", + "topDownBehavior.__pixelPerfect = pixelPerfect;\r", + "behavior.__pixelPerfect = pixelPerfect;\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectTopDownMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", + "const behavior = object.getBehavior(behaviorName);", + "", + "behavior.__pixelPerfect.doStepPostEvents(runtimeScene);" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectTopDownMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Pixel size", + "description": "", + "group": "", + "extraInformation": [], + "name": "PixelSize" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset X", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetX" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset Y", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetY" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Seamlessly align big pixels using a platformer character movement.", + "fullName": "Pixel perfect platformer character", + "name": "PixelPerfectPlatformerCharacter", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "X axis", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "We don't know if the deceleration was already applied or not this step, but if the speed drifted from more than 1%, another extension is probably modifying the speed and it must not be overridden." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed() - PreviousSpeedX)", + "<", + "Object.PlatformerCharacter::CurrentSpeed() * 0.01 + Object.PlatformerCharacter::Deceleration() * TimeDelta()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Find how far to go to reach a pixel." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "OffsetX + PixelSize * ceil((Object.X() + PixelPerfectMovement::BrakingDistance(Object.PlatformerCharacter::CurrentSpeed(), Object.PlatformerCharacter::Deceleration()) - OffsetX) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.X()) + \"-->\" + TargetX", + "", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "OffsetX + PixelSize * floor((Object.X() - PixelPerfectMovement::BrakingDistance(Object.PlatformerCharacter::CurrentSpeed(), Object.PlatformerCharacter::Deceleration()) - OffsetX) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.X()) + \"-->\" + TargetX", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to the target as the movement behavior would do." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "TargetX" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "min(Object.PlatformerCharacter::CurrentSpeed() + Object.PlatformerCharacter::Acceleration(), min(Object.PlatformerCharacter::MaxSpeed(), PixelPerfectMovement::SpeedToReach(TargetX - Object.X(), Object.PlatformerCharacter::Deceleration())))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "TargetX" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "max(Object.PlatformerCharacter::CurrentSpeed() - Object.PlatformerCharacter::Acceleration(), max(-Object.PlatformerCharacter::MaxSpeed(), PixelPerfectMovement::SpeedToReach(TargetX - Object.X(), Object.PlatformerCharacter::Deceleration())))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">=", + "TargetX" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<=", + "TargetX" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "OffsetX + PixelSize * round((Object.X() - OffsetX) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "0" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"X: \" + ToString(Object.X()) + \" Speed: \" + ToString(Object.PlatformerCharacter::CurrentSpeed())", + "", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Ladder", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Find how far to go to reach a pixel." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "OffsetY + PixelSize * ceil((Object.Y() - OffsetY) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.Y()) + \"-->\" + TargetY", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "OffsetY + PixelSize * floor((Object.Y() - OffsetY) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.Y()) + \"-->\" + TargetY", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to the target as the movement behavior would do." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "TargetY" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "Object.PlatformerCharacter::MaxSpeed() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "TargetY" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.PlatformerCharacter::MaxSpeed() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">=", + "TargetY" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<=", + "TargetY" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "OffsetY + PixelSize * round((Object.Y() - OffsetY) / PixelSize)" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"X: \" + ToString(Object.X()) + \" Speed: \" + ToString(Object.PlatformerCharacter::CurrentSpeed())", + "", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectPlatformerCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "!=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "!=", + "Object.PlatformerCharacter::MaxSpeed()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "ToString(abs(PreviousSpeedX) - Object.PlatformerCharacter::Deceleration() * TimeDelta() - abs(Object.PlatformerCharacter::CurrentSpeed()))", + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check if the character is decelerating.\nIt's done in doStepPostEvent because there is no way to know if the doStepPreEvents of this behavior is executed before or after the one of PlatformerCharcter.\nAs TimeDelta is used, we have to be sure the last PlatformerCharcter.doStepPreEvents call used the same TimeDelta. Which means this must be done after PlatformerCharcter.doStepPreEvents." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "=", + "abs(PreviousSpeedX) - Object.PlatformerCharacter::Deceleration() * TimeDelta()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save the speed to detect speed changes from outside." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyPreviousSpeedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.PlatformerCharacter::CurrentSpeed()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectPlatformerCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "1", + "type": "Number", + "label": "Pixel size", + "description": "", + "group": "", + "extraInformation": [], + "name": "PixelSize" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset X", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetX" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset Y", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetY" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetX" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetDirectionX" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetY" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetDirectionY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "PreviousSpeedX" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsDecelerating" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Camera", + "extensionNamespace": "", + "fullName": "Smooth Camera", + "gdevelopVersion": "", + "helpPath": "/tutorials/follow-player-with-camera/", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCjwvc3R5bGU+DQo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjQsMTNoLTZjLTEuMSwwLTItMC45LTItMlY1YzAtMS4xLDAuOS0yLDItMmg2YzEuMSwwLDIsMC45LDIsMnY2QzI2LDEyLjEsMjUuMSwxMywyNCwxM3oiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yNiw4djEwYzAsMS4xLTAuOSwyLTIsMkg4Yy0xLjEsMC0yLTAuOS0yLTJWOGMwLTEuMSwwLjktMiwyLTJoOCIvPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMjEiIGN5PSI4IiByPSIyIi8+DQo8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxMSIgY3k9IjE2IiByPSIxIi8+DQo8cmVjdCB4PSI5IiB5PSI5IiBjbGFzcz0ic3QwIiB3aWR0aD0iNCIgaGVpZ2h0PSIzIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIyMSwyOSAyMSwyOSAxMSwyOSAxMSwyOSAiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjE4LDIwIDE4LDI5IDE0LDI5IDE0LDIwICIvPg0KPHJlY3QgeD0iNyIgeT0iMyIgY2xhc3M9InN0MCIgd2lkdGg9IjQiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=", + "name": "SmoothCamera", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Computers and Hardware/Computers and Hardware_camcoder_gopro_go_pro_camera.svg", + "shortDescription": "Smoothly scroll to follow an object.", + "version": "0.3.1", + "description": [ + "The camera follows an object according to:", + "- a frame rate independent catch-up speed to make the scrolling from smooth to strong", + "- a maximum speed to do linear following ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap)) or slow down the camera when teleporting the object", + "- a follow-free zone to avoid scrolling on small movements", + "- an offset to see further in one direction", + "- an extra delay and catch-up speed to give an impression of speed (useful for dash)", + "- position forecasting and delay to simulate a cameraman response time", + "", + "A platformer dedicated behavior allows to switch of settings when the character is in air or on the floor. This can be used to stabilize the camera when jumping." + ], + "origin": { + "identifier": "SmoothCamera", + "name": "gdevelop-extension-store" + }, + "tags": [ + "camera", + "scrolling", + "follow", + "smooth", + "platformer", + "platform" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Smoothly scroll to follow an object.", + "fullName": "Smooth Camera", + "name": "SmoothCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Update private properties through setters to check their values and initialize state." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeed()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyLeftwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetRightwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyRightwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyUpwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyDownwardSpeedMax()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaLeft()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaRight()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaTop()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Behavior::PropertyFollowFreeAreaBottom()", + "log(1 - )" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraDelay()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::PropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object. This action must be called after the object has moved for the frame.", + "fullName": "Move the camera closer", + "functionType": "Action", + "name": "MoveCameraCloser", + "sentence": "Move the camera closer to _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The camera following is called with an action, the call from doStepPreEvents must be disabled to avoid to do it twice." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIsCalledManually" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::DoMoveCameraCloser" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Move the camera closer to the object.", + "fullName": "Do move the camera closer", + "functionType": "Action", + "name": "DoMoveCameraCloser", + "private": true, + "sentence": "Do move the camera closer _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Delaying and forecasting can be used at the same time.\nForecasting only use the positions that are older than the one used for delaying.\nThe behavior uses a position history that is split in 2 arrays:\n- one for delaying the position (from TimeFromStart to TimeFromStart - CamearDelay)\n- one for forecasting the position (from TimeFromStart - CamearDelay to TimeFromStart - CamearDelay - ForecastHistoryDuration" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateDelayedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::UpdateForecastedPosition" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "At each frame, the camera must catchup the target by a given ratio (speed)\ncameraX(t) - targetX = (cameraX(t - 1) - targetX) * speed\n\nThe frame rate must not impact on the catch-up speed, we don't want a speed in ratio per frame but a speed ratio per second, like this:\ncameraX(t) - targetX = (cameraX(t - 1s) - targetX) * speed\n\nOk, but we still need to process each frame, we can use a exponent for this:\ncameraX(t) - targetX = (cameraX(t - timeDelta) - targetX) * speed^timeDelta\ncameraX(t) = targetX + (cameraX(t - timeDelta) - targetX) * exp(timeDelta * ln(speed))\n\npow is probably more efficient than precalculated log if the speed is changed continuously but this might be rare enough." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraX(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaRight()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaRight()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaRight())\n* exp(TimeDelta() * Object.Behavior::PropertyLogLeftwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() - Object.Behavior::PropertyLeftwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaLeft()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaLeft()\n+ (CameraX(Object.Layer(), 0) - Object.Behavior::FreeAreaLeft())\n* exp(TimeDelta() * Object.Behavior::PropertyLogRightwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraX" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraX" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldX() + Object.Behavior::PropertyRightwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyOldY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "CameraY(Object.Layer(), 0)" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::FreeAreaBottom()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaBottom()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaBottom())\n* exp(TimeDelta() * Object.Behavior::PropertyLogUpwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() - Object.Behavior::PropertyUpwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + "<", + "Object.Behavior::FreeAreaTop()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::FreeAreaTop()\n+ (CameraY(Object.Layer(), 0) - Object.Behavior::FreeAreaTop())\n* exp(TimeDelta() * Object.Behavior::PropertyLogDownwardSpeed())", + "Object.Layer()", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CameraY" + }, + "parameters": [ + "", + ">", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetCameraY" + }, + "parameters": [ + "", + "=", + "Object.Behavior::PropertyOldY() + Object.Behavior::PropertyDownwardSpeedMax() * TimeDelta()", + "Object.Layer()", + "0" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Delay the camera according to a maximum speed and catch up the delay.", + "fullName": "Wait and catch up", + "functionType": "Action", + "name": "WaitAndCatchUp", + "sentence": "Delay the camera of _PARAM0_ during: _PARAM2_ seconds according to the maximum speed _PARAM3_;_PARAM4_ seconds and catch up in _PARAM5_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Maybe the catch-up show be done in constant pixel speed instead of constant time speed." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "TimeFromStart() + GetArgumentAsNumber(\"WaitingDuration\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedXMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedXMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyWaitingSpeedYMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"WaitingSpeedYMax\")" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpDuration" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CatchUpDuration\")" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Wait and catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Waiting duration (in seconds)", + "name": "WaitingDuration", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed X", + "name": "WaitingSpeedXMax", + "type": "expression" + }, + { + "description": "Waiting maximum camera target speed Y", + "name": "WaitingSpeedYMax", + "type": "expression" + }, + { + "description": "Catch up duration (in seconds)", + "name": "CatchUpDuration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Draw the targeted and actual camera position.", + "fullName": "Draw debug", + "functionType": "Action", + "name": "DrawDebug", + "sentence": "Draw targeted and actual camera position for _PARAM0_ on _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "ShapePainter", + "=", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Path used by the forecasting", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"245;166;35\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::BeginFillPath" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::PathLineTo" + }, + "parameters": [ + "ShapePainter", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::EndFillPath" + }, + "parameters": [ + "ShapePainter" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Follow-free area.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaLeft" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaRight" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"126;211;33\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::FreeAreaLeft() - 1", + "Object.Behavior::FreeAreaTop() - 1", + "Object.Behavior::FreeAreaRight() + 1", + "Object.Behavior::FreeAreaBottom() + 1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear regression vector used by the forecasting.", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::OutlineColor" + }, + "parameters": [ + "ShapePainter", + "\"208;2;27\"" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyProjectedOldestX()", + "Object.Behavior::PropertyProjectedOldestY()", + "Object.Behavior::PropertyProjectedNewestX()", + "Object.Behavior::PropertyProjectedNewestY()", + "1" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Targeted and actual camera position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "ShapePainter", + "Object.Behavior::PropertyForecastedX()", + "Object.Behavior::PropertyForecastedY()", + "3" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) - 4", + "CameraX(Object.Layer(), 0)", + "CameraY(Object.Layer(), 0) + 4", + "1" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::LineV2" + }, + "parameters": [ + "ShapePainter", + "CameraX(Object.Layer(), 0) - 4", + "CameraY(Object.Layer(), 0)", + "CameraX(Object.Layer(), 0) + 4", + "CameraY(Object.Layer(), 0)", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Shape painter", + "name": "ShapePainter", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "objectList" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on X axis.", + "fullName": "Follow on X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnX", + "sentence": "The camera follows _PARAM0_ on X axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnX\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnX" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on X axis", + "name": "FollowOnX", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Enable or disable the following on Y axis.", + "fullName": "Follow on Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowOnY", + "sentence": "The camera follows _PARAM0_ on Y axis: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"FollowOnY\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowOnY" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow on Y axis", + "name": "FollowOnY", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area right border.", + "fullName": "Follow free area right border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaRight", + "sentence": "Change the camera follow free area right border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaRight\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area right border", + "name": "SetFollowFreeAreaRight", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area left border.", + "fullName": "Follow free area left border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaLeft", + "sentence": "Change the camera follow free area left border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaLeft\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area left border", + "name": "SetFollowFreeAreaLeft", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area top border.", + "fullName": "Follow free area top border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaTop", + "sentence": "Change the camera follow free area top border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"FollowFreeAreaTop\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area top border", + "name": "FollowFreeAreaTop", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera follow free area bottom border.", + "fullName": "Follow free area bottom border", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetFollowFreeAreaBottom", + "sentence": "Change the camera follow free area bottom border of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"SetFollowFreeAreaBottom\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Follow free area bottom border", + "name": "SetFollowFreeAreaBottom", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward maximum speed (in pixels per second).", + "fullName": "Leftward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeedMax", + "sentence": "Change the camera leftward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward maximum speed (in ratio per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward maximum speed (in pixels per second).", + "fullName": "Rightward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeedMax", + "sentence": "Change the camera rightward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward maximum speed (in pixels per second).", + "fullName": "Upward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeedMax", + "sentence": "Change the camera upward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward maximum speed (in pixels per second).", + "fullName": "Downward maximum speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeedMax", + "sentence": "Change the camera downward maximum speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeedMax" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, GetArgumentAsNumber(\"Speed\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward maximum speed (in pixels per second)", + "name": "Speed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera leftward catch-up speed (in ratio per second).", + "fullName": "Leftward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetLeftwardSpeed", + "sentence": "Change the camera leftward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"LeftwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogLeftwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyLeftwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Leftward catch-up speed (in ratio per second)", + "name": "LeftwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera rightward catch-up speed (in ratio per second).", + "fullName": "Rightward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetRightwardSpeed", + "sentence": "Change the camera rightward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"RightwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogRightwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyRightwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Rightward catch-up speed (in ratio per second)", + "name": "RightwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera downward catch-up speed (in ratio per second).", + "fullName": "Downward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetDownwardSpeed", + "sentence": "Change the camera downward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"DownwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogDownwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyDownwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Downward catch-up speed (in ratio per second)", + "name": "DownwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera upward catch-up speed (in ratio per second).", + "fullName": "Upward catch-up speed", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetUpwardSpeed", + "sentence": "Change the camera upward catch-up speed of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(0, 1, GetArgumentAsNumber(\"UpwardSpeed\"))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyLogUpwardSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "log(1 - Object.Behavior::PropertyUpwardSpeed())" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Upward catch-up speed (in ratio per second)", + "name": "UpwardSpeed", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on X axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset X", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetX", + "sentence": "the camera offset on X axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetX", + "name": "SetOffsetXOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on X axis of an object.", + "fullName": "Camera Offset X", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetX", + "private": true, + "sentence": "Change the camera offset on X axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetXOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetXOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetX\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset X", + "name": "CameraOffsetX", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the camera offset on Y axis of the object. This is not the current difference between the object and the camera position.", + "fullName": "Camera offset Y", + "functionType": "ExpressionAndCondition", + "group": "Camera configuration", + "name": "OffsetY", + "sentence": "the camera offset on Y axis", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraOffsetY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "OffsetY", + "name": "SetOffsetYOp", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Deprecated use SetOffsetYOp instead." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraOffsetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera offset on Y axis of an object.", + "fullName": "Camera Offset Y", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetOffsetY", + "private": true, + "sentence": "Change the camera offset on Y axis of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetOffsetYOp" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"CameraOffsetY\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera offset Y", + "name": "CameraOffsetY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera forecast time (in seconds).", + "fullName": "Forecast time", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetForecastTime", + "sentence": "Change the camera forecast time of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"ForecastTime\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Forecast time", + "name": "ForecastTime", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Change the camera delay (in seconds).", + "fullName": "Camera delay", + "functionType": "Action", + "group": "Camera configuration", + "name": "SetCameraDelay", + "sentence": "Change the camera delay of _PARAM0_: _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "min(0, GetArgumentAsNumber(\"CameraDelay\"))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Camera delay", + "name": "CameraDelay", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area left border X.", + "fullName": "Free area left", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaLeft", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() - Object.Behavior::PropertyFollowFreeAreaLeft()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area right border X.", + "fullName": "Free area right", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaRight", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedX() + Object.Behavior::PropertyCameraOffsetX() + Object.Behavior::PropertyFollowFreeAreaRight()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area bottom border Y.", + "fullName": "Free area bottom", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaBottom", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() + Object.Behavior::PropertyFollowFreeAreaBottom()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return follow free area top border Y.", + "fullName": "Free area top", + "functionType": "Expression", + "group": "Private", + "name": "FreeAreaTop", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyForecastedY() + Object.Behavior::PropertyCameraOffsetY() - Object.Behavior::PropertyFollowFreeAreaTop()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Update delayed position and delayed history. This is called in doStepPreEvents.", + "fullName": "Update delayed position", + "functionType": "Action", + "group": "Private", + "name": "UpdateDelayedPosition", + "private": true, + "sentence": "Update delayed position and delayed history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the previous position to have enough (2) positions to evaluate the extra delay for waiting mode." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Use the object center when no delay is asked." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "TimeFromStart()", + "Object.CenterX()", + "Object.CenterY()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "TimeFromStart()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "Object.CenterX()" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "Object.CenterY()" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful for delaying and pass it to the history for forecasting." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[1]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::AddForecastHistoryPosition" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ObjectTime[0])", + "Object.Variable(__SmoothCamera.ObjectX[0])", + "Object.Variable(__SmoothCamera.ObjectY[0])", + "" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Don't move the camera if there is not enough history." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectX[0])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Variable(__SmoothCamera.ObjectY[0])" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ObjectTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime[0]", + "<", + "TimeFromStart() - Object.Behavior::CurrentDelay()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add the extra delay that could be needed to respect the speed limit in waiting mode.\n\nspeedRatio = min(speedMaxX / historySpeedX, speedMaxY / historySpeedY)\ndelay += min(0, timeDelta * (1 - speedRatio))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "max(0, TimeDelta() * (1 - min(Object.Behavior::PropertyWaitingSpeedXMax() * abs(Object.Variable(__SmoothCamera.ObjectX[1]) - Object.Variable(__SmoothCamera.ObjectX[0])), Object.Behavior::PropertyWaitingSpeedYMax() * abs(Object.Variable(__SmoothCamera.ObjectY[1]) - Object.Variable(__SmoothCamera.ObjectY[0]))) / (Object.Variable(__SmoothCamera.ObjectTime[1]) - Object.Variable(__SmoothCamera.ObjectTime[0]))))" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Extra delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The time with delay is now between the first 2 indexes" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectX[1]), Object.Variable(__SmoothCamera.ObjectX[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyDelayedCenterY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "lerp(Object.Variable(__SmoothCamera.ObjectY[1]), Object.Variable(__SmoothCamera.ObjectY[0]), ((TimeFromStart() - Object.Behavior::CurrentDelay()) - Object.Variable(__SmoothCamera.ObjectTime[1])) / (Object.Variable(__SmoothCamera.ObjectTime[0]) - Object.Variable(__SmoothCamera.ObjectTime[1])))" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsDelayed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectTime" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectX" + ] + }, + { + "type": { + "value": "ObjectVariableClearChildren" + }, + "parameters": [ + "Object", + "__SmoothCamera.ObjectY" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraDelayCatchUpSpeed" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyCameraExtraDelay() / Object.Behavior::PropertyCameraDelayCatchUpDuration()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Start to catch up\"", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SmoothCamera::SmoothCamera::IsWaiting" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyCameraExtraDelay" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "max(0, Object.Behavior::PropertyCameraExtraDelay() -Object.Behavior::PropertyCameraDelayCatchUpSpeed() * TimeDelta())" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Catching up delay: \" + ToString(Object.Behavior::PropertyCameraExtraDelay())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following target is delayed from the object.", + "fullName": "Camera is delayed", + "functionType": "Condition", + "name": "IsDelayed", + "private": true, + "sentence": "The camera of _PARAM0_ is delayed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Behavior::CurrentDelay()", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the current camera delay.", + "fullName": "Current delay", + "functionType": "Expression", + "name": "CurrentDelay", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyCameraDelay() + Object.Behavior::PropertyCameraExtraDelay()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the camera following is waiting at a reduced speed.", + "fullName": "Camera is waiting", + "functionType": "Condition", + "name": "IsWaiting", + "private": true, + "sentence": "The camera of _PARAM0_ is waiting", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyWaitingEnd" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "TimeFromStart()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Add a position to the history for forecasting. This is called 2 times in UpadteDelayedPosition.", + "fullName": "Add forecast history position", + "functionType": "Action", + "group": "Private", + "name": "AddForecastHistoryPosition", + "private": true, + "sentence": "Add the time:_PARAM2_ and position: _PARAM3_; _PARAM4_ to the forecast history of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "GetArgumentAsNumber(\"Time\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "GetArgumentAsNumber(\"ObjectX\")" + ] + }, + { + "type": { + "value": "ObjectVariablePushNumber" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "GetArgumentAsNumber(\"ObjectY\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Remove history entries that are too old to be useful.\nKeep at least 2 positions because no forecast can be done with less positions." + }, + { + "infiniteLoopWarning": true, + "type": "BuiltinCommonInstructions::While", + "whileConditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "3" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime[0]", + "<", + "TimeFromStart() - Object.Behavior::PropertyCameraDelay() - Object.Behavior::PropertyCameraExtraDelay() - Object.Behavior::PropertyForecastHistoryDuration()" + ] + } + ], + "conditions": [], + "actions": [ + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryTime", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryX", + "0" + ] + }, + { + "type": { + "value": "ObjectVariableRemoveAt" + }, + "parameters": [ + "Object", + "__SmoothCamera.ForecastHistoryY", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "Time", + "name": "Time", + "type": "expression" + }, + { + "description": "Object X", + "name": "ObjectX", + "type": "expression" + }, + { + "description": "Object Y", + "name": "ObjectY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Update forecasted position. This is called in doStepPreEvents.", + "fullName": "Update forecasted position", + "functionType": "Action", + "group": "Private", + "name": "UpdateForecastedPosition", + "private": true, + "sentence": "Update forecasted position of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Simple linear regression\ny = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX\n\nNote than we could use only one position every N positions to reduce the process time,\nbut if we really need efficient process JavaScript and circular queues are a must." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime)", + ">=", + "2" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastHistoryDuration" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::PropertyForecastTime" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean X", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanX" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Mean Y", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()])" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryMeanY" + }, + "parameters": [ + "Object", + "Behavior", + "/", + "Object.VariableChildCount(__SmoothCamera.ForecastHistoryY)" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Mean: \" + ToString(Object.Behavior::PropertyForecastHistoryMeanX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryMeanY())", + "", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Variance and Covariance", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "VarianceX = sum((X[i] - MeanX)²)\nVarianceY = sum((Y[i] - MeanY)²)\nCovariance = sum((X[i] - MeanX) * (Y[i] - MeanY))" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "Object.VariableChildCount(__SmoothCamera.ForecastHistoryX)", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceX" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryVarianceY" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "pow(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY(), 2)" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryCovariance" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "(Object.Variable(__SmoothCamera.ForecastHistoryX[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanX())\n*\n(Object.Variable(__SmoothCamera.ForecastHistoryY[Object.Behavior::PropertyIndex()]) - Object.Behavior::PropertyForecastHistoryMeanY())" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Variances: \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceX()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryVarianceY()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryCovariance())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + "<", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyDelayedCenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "1" + ] + }, + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())", + ">=", + "1" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Linear function parameters", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "y = A * x + B\n\nA = Covariance / VarianceX\nB = MeanY - A * MeanX" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + ">=", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanY() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanX()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "" + ] + } + ] + } + ], + "parameters": [] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Axis permutation to avoid a ratio between 2 numbers near 0." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "abs(Object.Behavior::PropertyForecastHistoryVarianceX())", + "<", + "abs(Object.Behavior::PropertyForecastHistoryVarianceY())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearA" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryCovariance() / Object.Behavior::PropertyForecastHistoryVarianceY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastHistoryLinearB" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyForecastHistoryMeanX() - Object.Behavior::PropertyForecastHistoryLinearA() * Object.Behavior::PropertyForecastHistoryMeanY()" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Linear: \" + ToString(Object.Behavior::PropertyForecastHistoryLinearA()) + \" \" + ToString(Object.Behavior::PropertyForecastHistoryLinearB())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Projection", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::ProjectHistoryEnds" + }, + "parameters": [ + "Object", + "Behavior", + "Object.Variable(__SmoothCamera.ForecastHistoryY[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[0])", + "Object.Variable(__SmoothCamera.ForecastHistoryY[Object.VariableChildCount(__SmoothCamera.ForecastHistoryY) - 1])", + "Object.Variable(__SmoothCamera.ForecastHistoryX[Object.VariableChildCount(__SmoothCamera.ForecastHistoryX) - 1])", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Permute back axis" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedOldestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyIndex()" + ] + } + ] + } + ], + "parameters": [] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Oldest: \" + ToString(Object.Behavior::PropertyProjectedOldestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedOldestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Newest: \" + ToString(Object.Behavior::PropertyProjectedNewestX()) + \" \" + ToString(Object.Behavior::PropertyProjectedNewestY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Forecasted position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestX() + ( Object.Behavior::PropertyProjectedNewestX() - Object.Behavior::PropertyProjectedOldestX()) * Object.Behavior::ForecastTimeRatio()" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyForecastedY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyProjectedNewestY() + ( Object.Behavior::PropertyProjectedNewestY() - Object.Behavior::PropertyProjectedOldestY()) * Object.Behavior::ForecastTimeRatio()" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Forecasted: \" + ToString(Object.Behavior::PropertyForecastedX()) + \" \" + ToString(Object.Behavior::PropertyForecastedY())", + "\"info\"", + "\"SmoothCamera\"" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Project history ends position to have the vector on the line from linear regression. This function is only called by UpdateForecastedPosition.", + "fullName": "Project history ends", + "functionType": "Action", + "group": "Private", + "name": "ProjectHistoryEnds", + "private": true, + "sentence": "Project history oldest: _PARAM2_;_PARAM3_ and newest position: _PARAM4_;_PARAM5_ of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Perpendicular line:\npA = -1/a; \npB = -pA * x + y\n\nIntersection:\n/ ProjectedY = a * ProjectedX + b\n\\ ProjectedY = pA * ProjectedX + b\n\nSolution that is cleaned out from indeterminism (like 0 / 0 or infinity / infinity):\nProjectedX= (x + (y - b) * a) / (a² + 1)\nProjectedY = y + (x * a - y + b) / (a² + 1)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"NewestX\") + (GetArgumentAsNumber(\"NewestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedNewestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"NewestY\") + (GetArgumentAsNumber(\"NewestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"NewestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "(GetArgumentAsNumber(\"OldestX\") + (GetArgumentAsNumber(\"OldestY\") - Object.Behavior::PropertyForecastHistoryLinearB()) * Object.Behavior::PropertyForecastHistoryLinearA()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetPropertyProjectedOldestY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"OldestY\") + (GetArgumentAsNumber(\"OldestX\") * Object.Behavior::PropertyForecastHistoryLinearA() - GetArgumentAsNumber(\"OldestY\") \n+ Object.Behavior::PropertyForecastHistoryLinearB()) / (1 + pow(Object.Behavior::PropertyForecastHistoryLinearA(), 2))" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + }, + { + "description": "OldestX", + "name": "OldestX", + "type": "expression" + }, + { + "description": "OldestY", + "name": "OldestY", + "type": "expression" + }, + { + "description": "Newest X", + "name": "NewestX", + "type": "expression" + }, + { + "description": "Newest Y", + "name": "NewestY", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the ratio between forecast time and the duration of the history. This function is only called by UpdateForecastedPosition.", + "fullName": "Forecast time ratio", + "functionType": "Expression", + "group": "Private", + "name": "ForecastTimeRatio", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "- Object.Behavior::PropertyForecastTime() / (Object.Variable(__SmoothCamera.ForecastHistoryTime[0]) - Object.Variable(__SmoothCamera.ForecastHistoryTime[Object.VariableChildCount(__SmoothCamera.ForecastHistoryTime) - 1]))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "0.9", + "type": "Number", + "label": "Leftward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "LeftwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Rightward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "RightwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "UpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward catch-up speed (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "DownwardSpeed" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on X axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnX" + }, + { + "value": "true", + "type": "Boolean", + "label": "Follow on Y axis", + "description": "", + "group": "", + "extraInformation": [], + "name": "FollowOnY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area left border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaLeft" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area right border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaRight" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom border", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "FollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset X", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "CameraOffsetX" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Camera offset Y", + "description": "", + "group": "Position", + "extraInformation": [], + "advanced": true, + "name": "CameraOffsetY" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Camera delay", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "CameraDelay" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast time", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "ForecastTime" + }, + { + "value": "0", + "type": "Number", + "unit": "Second", + "label": "Forecast history duration", + "description": "", + "group": "Timing", + "extraInformation": [], + "deprecated": true, + "name": "ForecastHistoryDuration" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogLeftwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogRightwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogDownwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "LogUpwardSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "DelayedCenterY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryMeanY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryCovariance" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearA" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryLinearB" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastedY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedNewestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestX" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ProjectedOldestY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ForecastHistoryVarianceY" + }, + { + "value": "", + "type": "Number", + "label": "Index (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpSpeed" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraExtraDelay" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedXMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingSpeedYMax" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "WaitingEnd" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "CameraDelayCatchUpDuration" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Leftward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "LeftwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Rightward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "RightwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "UpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "advanced": true, + "name": "DownwardSpeedMax" + }, + { + "value": "", + "type": "Number", + "label": "OldX (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldX" + }, + { + "value": "", + "type": "Number", + "label": "OldY (local variable)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "OldY" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsCalledManually" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly scroll to follow a character and stabilize the camera when jumping.", + "fullName": "Smooth platformer camera", + "name": "SmoothPlatformerCamera", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyFloorDownwardSpeedMax()", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::IsJumping" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + }, + { + "type": { + "value": "PlatformBehavior::IsFalling" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaBottom" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaTop()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetFollowFreeAreaTop" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirFollowFreeAreaBottom()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeed" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeed()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetUpwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirUpwardSpeedMax()", + "" + ] + }, + { + "type": { + "value": "SmoothCamera::SmoothCamera::SetDownwardSpeedMax" + }, + "parameters": [ + "Object", + "SmoothCamera", + "Object.Behavior::PropertyAirDownwardSpeedMax()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SmoothCamera::SmoothPlatformerCamera", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "", + "type": "Behavior", + "label": "Smooth camera behavior", + "description": "", + "group": "", + "extraInformation": [ + "SmoothCamera::SmoothCamera" + ], + "name": "SmoothCamera" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JumpOriginY" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom in the air", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "AirFollowFreeAreaBottom" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area top on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaTop" + }, + { + "value": "0", + "type": "Number", + "unit": "Pixel", + "label": "Follow free area bottom on the floor", + "description": "", + "group": "Position", + "extraInformation": [], + "name": "FloorFollowFreeAreaBottom" + }, + { + "value": "0.95", + "type": "Number", + "label": "Upward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirUpwardSpeed" + }, + { + "value": "0.95", + "type": "Number", + "label": "Downward speed in the air (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "AirDownwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Upward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorUpwardSpeed" + }, + { + "value": "0.9", + "type": "Number", + "label": "Downward speed on the floor (in ratio per second)", + "description": "", + "group": "Catch-up speed", + "extraInformation": [], + "name": "FloorDownwardSpeed" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed in the air", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "AirDownwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Upward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorUpwardSpeedMax" + }, + { + "value": "9000", + "type": "Number", + "unit": "PixelSpeed", + "label": "Downward maximum speed on the floor", + "description": "", + "group": "Maximum speed", + "extraInformation": [], + "name": "FloorDownwardSpeedMax" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "description": "", + "group": "", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/timer/assets/Fail.wav b/templates/timer/assets/Fail.wav new file mode 100644 index 0000000..46d30f5 Binary files /dev/null and b/templates/timer/assets/Fail.wav differ diff --git a/templates/timer/assets/Key_Filled.png b/templates/timer/assets/Key_Filled.png new file mode 100644 index 0000000..c242339 Binary files /dev/null and b/templates/timer/assets/Key_Filled.png differ diff --git a/templates/timer/assets/Large Blue Hole_Unlocked.png b/templates/timer/assets/Large Blue Hole_Unlocked.png new file mode 100644 index 0000000..b4486e1 Binary files /dev/null and b/templates/timer/assets/Large Blue Hole_Unlocked.png differ diff --git a/templates/timer/assets/LargeKeyHole-export.png b/templates/timer/assets/LargeKeyHole-export.png new file mode 100644 index 0000000..3e1a0d6 Binary files /dev/null and b/templates/timer/assets/LargeKeyHole-export.png differ diff --git a/templates/timer/assets/Pathway.png b/templates/timer/assets/Pathway.png new file mode 100644 index 0000000..ab62afd Binary files /dev/null and b/templates/timer/assets/Pathway.png differ diff --git a/templates/timer/assets/You Win.png b/templates/timer/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/timer/assets/You Win.png differ diff --git a/templates/timer/assets/YouWin.wav b/templates/timer/assets/YouWin.wav new file mode 100644 index 0000000..28ef425 Binary files /dev/null and b/templates/timer/assets/YouWin.wav differ diff --git a/templates/timer/game.json b/templates/timer/game.json new file mode 100644 index 0000000..10e7950 --- /dev/null +++ b/templates/timer/game.json @@ -0,0 +1,7106 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 227, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": true, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.timer-tutorial", + "pixelsRounding": false, + "projectUuid": "fe846a3b-b0bc-4d7b-b74f-06220320d73d", + "scaleMode": "linear", + "sizeOnStartupMode": "", + "templateSlug": "timer-tutorial", + "version": "1.0.0", + "name": "Timer Tutorial", + "description": "Game example showing how to set up a timer and to use that timer to check the time taken to win a game.", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": {}, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [], + "playableDevices": [], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/Large Blue Hole_Unlocked.png", + "kind": "image", + "metadata": "", + "name": "Large Blue Hole_Unlocked.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Rolling Ball Pack/Hole/6f5d764133b9831feabd89a3525034a4ca5368269ddd58bf237040d68faf6f2c_Large Blue Hole_Unlocked.png", + "name": "Large Blue Hole_Unlocked.png" + } + }, + { + "file": "assets/Key_Filled.png", + "kind": "image", + "metadata": "", + "name": "Key_Filled.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Rolling Ball Pack/Interface/7bb3db5bbfaf32c67bd19d326370f4cd2f7a3ae8fcb99f38a7c7805cb117d8d4_Key_Filled.png", + "name": "Key_Filled.png" + } + }, + { + "file": "assets/LargeKeyHole-export.png", + "kind": "image", + "metadata": "", + "name": "assets\\LargeKeyHole-export.png", + "smoothed": true, + "userAdded": false + }, + { + "file": "assets/Pathway.png", + "kind": "image", + "metadata": "", + "name": "assets\\Pathway.png", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Fail.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0,\\\"sustainPunch\\\":0,\\\"decay\\\":0.1,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":500,\\\"frequencySweep\\\":-200,\\\"frequencyDeltaSweep\\\":-900,\\\"repeatFrequency\\\":0,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"square\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":0,\\\"vibratoFrequency\\\":25,\\\"squareDuty\\\":55,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":7,\\\"flangerOffsetSweep\\\":7,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":10900,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"Fail\"}}", + "name": "Fail", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": true + }, + { + "file": "assets/YouWin.wav", + "kind": "audio", + "metadata": "{\"extension\":\".wav\",\"jfxr\":{\"data\":\"{\\\"_version\\\":1,\\\"_name\\\":\\\"Jump 1\\\",\\\"_locked\\\":[],\\\"sampleRate\\\":44100,\\\"attack\\\":0,\\\"sustain\\\":0.33,\\\"sustainPunch\\\":90,\\\"decay\\\":0.21,\\\"tremoloDepth\\\":0,\\\"tremoloFrequency\\\":10,\\\"frequency\\\":900,\\\"frequencySweep\\\":2200,\\\"frequencyDeltaSweep\\\":100,\\\"repeatFrequency\\\":8.9,\\\"frequencyJump1Onset\\\":33,\\\"frequencyJump1Amount\\\":0,\\\"frequencyJump2Onset\\\":66,\\\"frequencyJump2Amount\\\":0,\\\"harmonics\\\":0,\\\"harmonicsFalloff\\\":0.5,\\\"waveform\\\":\\\"sawtooth\\\",\\\"interpolateNoise\\\":true,\\\"vibratoDepth\\\":210,\\\"vibratoFrequency\\\":1000,\\\"squareDuty\\\":85,\\\"squareDutySweep\\\":0,\\\"flangerOffset\\\":0,\\\"flangerOffsetSweep\\\":-5,\\\"bitCrush\\\":16,\\\"bitCrushSweep\\\":0,\\\"lowPassCutoff\\\":22050,\\\"lowPassCutoffSweep\\\":0,\\\"highPassCutoff\\\":0,\\\"highPassCutoffSweep\\\":0,\\\"compression\\\":1,\\\"normalization\\\":true,\\\"amplification\\\":100}\",\"name\":\"YouWin\"}}", + "name": "YouWin", + "preloadAsMusic": false, + "preloadAsSound": true, + "preloadInCache": false, + "userAdded": false + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": true, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [], + "objectsFolderStructure": { + "folderName": "__ROOT" + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "GameScene", + "name": "GameScene", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": false, + "title": "", + "v": 209, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.5236892941320315, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "LevelPieces", + "objects": [ + { + "name": "LargeBlueHole" + }, + { + "name": "LargeKeyHole" + }, + { + "name": "Pathway" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "LargeBlueHole", + "persistentUuid": "fe998480-8786-418b-98b1-f9951952878f", + "width": 0, + "x": 64, + "y": 64, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Key", + "persistentUuid": "726cfb88-deb5-47b9-bc5e-c99042880c3e", + "width": 0, + "x": 144, + "y": 141, + "zOrder": 25, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "LargeKeyHole", + "persistentUuid": "2b9e7684-5101-45a8-8390-ad544025e9ab", + "width": 0, + "x": 1040, + "y": 384, + "zOrder": 20, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 176, + "layer": "", + "name": "Pathway", + "persistentUuid": "cdcbc4bf-7cd1-4d9e-921a-f7866d0a3ee2", + "width": 128, + "x": 528, + "y": 496, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 1104, + "layer": "", + "name": "Pathway", + "persistentUuid": "bd1518e0-3dc9-4aac-86a6-c3ec12f4e06f", + "width": 96, + "x": 600, + "y": -408, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 176, + "layer": "", + "name": "Pathway", + "persistentUuid": "279b0623-e3cb-4112-8b7a-6d1eaaacf0ac", + "width": 128, + "x": 48, + "y": 384, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 256, + "layer": "", + "name": "Pathway", + "persistentUuid": "fd4f0435-cccc-4262-a35e-1312c0a0866b", + "width": 96, + "x": 1072, + "y": 416, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 176, + "layer": "", + "name": "Pathway", + "persistentUuid": "f3408b25-fab3-4348-8141-431841a3511a", + "width": 64, + "x": 592, + "y": 272, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "height": 256, + "layer": "", + "name": "Pathway", + "persistentUuid": "1ef93475-b28d-4a2a-9247-78c6d875074d", + "width": 128, + "x": 1136, + "y": 96, + "zOrder": 6, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 624, + "layer": "", + "name": "Pathway", + "persistentUuid": "3e8d09af-cb59-4da3-adf9-7576f18fb2d2", + "width": 112, + "x": 784, + "y": 304, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 656, + "layer": "", + "name": "Pathway", + "persistentUuid": "241c574c-0ea8-4d26-bfee-7a7adefdefa1", + "width": 112, + "x": 816, + "y": -32, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 608, + "layer": "", + "name": "Pathway", + "persistentUuid": "a01b122e-e945-41f9-84b7-85fc45524b60", + "width": 112, + "x": 296, + "y": 88, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 90, + "customSize": true, + "height": 608, + "layer": "", + "name": "Pathway", + "persistentUuid": "36ef8f28-16bb-4d44-87f9-ffac2f6cb355", + "width": 96, + "x": 304, + "y": 240, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Instructions", + "persistentUuid": "292ed7f1-5317-4eb8-a68c-bd3b1a3650cc", + "width": 0, + "x": 16, + "y": 660, + "zOrder": 27, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "db8784c99a3af8e5d991ea8b78bf106ba9682c9703f93d91f60666251ab57a37", + "name": "LargeBlueHole", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Unlocked", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Large Blue Hole_Unlocked.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "db8784c99a3af8e5d991ea8b78bf106ba9682c9703f93d91f60666251ab57a37", + "name": "LargeKeyHole", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Unlocked", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "assets\\LargeKeyHole-export.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "fc2056e93d67c0f9c0bbc0b5fd35264bce619b4ea8d1896ba95cc8e91da5df7e", + "name": "Key", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "Draggable", + "type": "DraggableBehavior::Draggable", + "checkCollisionMask": true + } + ], + "animations": [ + { + "name": "Filled", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Key_Filled.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 36.5, + "y": 34 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Pathway", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "assets\\Pathway.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "Instructions", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [], + "string": "Drag the key to the keyhole.", + "font": "", + "textAlignment": "left", + "characterSize": 40, + "color": { + "b": 0, + "g": 0, + "r": 0 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Drag the key to the keyhole.", + "font": "", + "textAlignment": "left", + "verticalTextAlignment": "top", + "characterSize": 40, + "color": "0;0;0" + } + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 500, + "y": 0 + }, + { + "x": 500, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "LargeBlueHole" + }, + { + "objectName": "LargeKeyHole" + }, + { + "objectName": "EndingDialog" + }, + { + "objectName": "Key" + }, + { + "objectName": "Pathway" + }, + { + "objectName": "Instructions" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Event for starting the timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Event to modify text to show the time" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [] + }, + { + "colorB": 116, + "colorG": 116, + "colorR": 116, + "creationTime": 0, + "folded": true, + "name": "Game management", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Setting up the start of the game." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Key", + "=", + "LargeBlueHole.CenterX()", + "=", + "LargeBlueHole.CenterY()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If the key is off the track" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Not" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "LevelPieces", + "Key.CenterX()", + "Key.CenterY()" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "Fail", + "", + "", + "RandomFloatInRange(0.8,1.2)" + ] + }, + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"GameScene\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Winning the game" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "LargeKeyHole", + "Key.CenterX()", + "Key.CenterY()" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Key", + "Draggable", + "no" + ] + }, + { + "type": { + "value": "PlaySound" + }, + "parameters": [ + "", + "YouWin", + "", + "", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "EndingDialog", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "EndingDialog", + "=", + "CameraCenterX()", + "=", + "CameraCenterY()" + ] + }, + { + "type": { + "value": "ChangeTimeScale" + }, + "parameters": [ + "", + "0" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 0, + "ambientLightColorG": 22188544, + "ambientLightColorR": 16, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "description": "", + "group": "", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/templates/topDownRPGMovement/assets/ACgarRight1.png b/templates/topDownRPGMovement/assets/ACgarRight1.png new file mode 100644 index 0000000..c053253 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACgarRight1.png differ diff --git a/templates/topDownRPGMovement/assets/ACgarRight2.png b/templates/topDownRPGMovement/assets/ACgarRight2.png new file mode 100644 index 0000000..2da3070 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACgarRight2.png differ diff --git a/templates/topDownRPGMovement/assets/ACgarRight3.png b/templates/topDownRPGMovement/assets/ACgarRight3.png new file mode 100644 index 0000000..9403bea Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACgarRight3.png differ diff --git a/templates/topDownRPGMovement/assets/ACgarRight4.png b/templates/topDownRPGMovement/assets/ACgarRight4.png new file mode 100644 index 0000000..c235c98 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACgarRight4.png differ diff --git a/templates/topDownRPGMovement/assets/ACharDown1.png b/templates/topDownRPGMovement/assets/ACharDown1.png new file mode 100644 index 0000000..43ae72b Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharDown1.png differ diff --git a/templates/topDownRPGMovement/assets/ACharDown2.png b/templates/topDownRPGMovement/assets/ACharDown2.png new file mode 100644 index 0000000..d9fd12b Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharDown2.png differ diff --git a/templates/topDownRPGMovement/assets/ACharDown3.png b/templates/topDownRPGMovement/assets/ACharDown3.png new file mode 100644 index 0000000..f2aed14 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharDown3.png differ diff --git a/templates/topDownRPGMovement/assets/ACharDown4.png b/templates/topDownRPGMovement/assets/ACharDown4.png new file mode 100644 index 0000000..87dce8c Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharDown4.png differ diff --git a/templates/topDownRPGMovement/assets/ACharLeft1.png b/templates/topDownRPGMovement/assets/ACharLeft1.png new file mode 100644 index 0000000..97ffe98 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharLeft1.png differ diff --git a/templates/topDownRPGMovement/assets/ACharLeft2.png b/templates/topDownRPGMovement/assets/ACharLeft2.png new file mode 100644 index 0000000..28adff4 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharLeft2.png differ diff --git a/templates/topDownRPGMovement/assets/ACharLeft3.png b/templates/topDownRPGMovement/assets/ACharLeft3.png new file mode 100644 index 0000000..699879a Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharLeft3.png differ diff --git a/templates/topDownRPGMovement/assets/ACharLeft4.png b/templates/topDownRPGMovement/assets/ACharLeft4.png new file mode 100644 index 0000000..e6d44f2 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharLeft4.png differ diff --git a/templates/topDownRPGMovement/assets/ACharUp1.png b/templates/topDownRPGMovement/assets/ACharUp1.png new file mode 100644 index 0000000..a03a9cf Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharUp1.png differ diff --git a/templates/topDownRPGMovement/assets/ACharUp2.png b/templates/topDownRPGMovement/assets/ACharUp2.png new file mode 100644 index 0000000..203a663 Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharUp2.png differ diff --git a/templates/topDownRPGMovement/assets/ACharUp3.png b/templates/topDownRPGMovement/assets/ACharUp3.png new file mode 100644 index 0000000..a03a9cf Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharUp3.png differ diff --git a/templates/topDownRPGMovement/assets/ACharUp4.png b/templates/topDownRPGMovement/assets/ACharUp4.png new file mode 100644 index 0000000..f977e5d Binary files /dev/null and b/templates/topDownRPGMovement/assets/ACharUp4.png differ diff --git a/templates/topDownRPGMovement/assets/Bush1.png b/templates/topDownRPGMovement/assets/Bush1.png new file mode 100644 index 0000000..95119d6 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Bush1.png differ diff --git a/templates/topDownRPGMovement/assets/Chevron-Arrow-Left.png b/templates/topDownRPGMovement/assets/Chevron-Arrow-Left.png new file mode 100644 index 0000000..9096e86 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Chevron-Arrow-Left.png differ diff --git a/templates/topDownRPGMovement/assets/Chevron-Arrow-Up.png b/templates/topDownRPGMovement/assets/Chevron-Arrow-Up.png new file mode 100644 index 0000000..a51e5d1 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Chevron-Arrow-Up.png differ diff --git a/templates/topDownRPGMovement/assets/Dock1.png b/templates/topDownRPGMovement/assets/Dock1.png new file mode 100644 index 0000000..c4f469d Binary files /dev/null and b/templates/topDownRPGMovement/assets/Dock1.png differ diff --git a/templates/topDownRPGMovement/assets/Enemy_Spawn_Location.png b/templates/topDownRPGMovement/assets/Enemy_Spawn_Location.png new file mode 100644 index 0000000..b466cec Binary files /dev/null and b/templates/topDownRPGMovement/assets/Enemy_Spawn_Location.png differ diff --git a/templates/topDownRPGMovement/assets/Grass1.png b/templates/topDownRPGMovement/assets/Grass1.png new file mode 100644 index 0000000..6982348 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Grass1.png differ diff --git a/templates/topDownRPGMovement/assets/House2.png b/templates/topDownRPGMovement/assets/House2.png new file mode 100644 index 0000000..f7a2f65 Binary files /dev/null and b/templates/topDownRPGMovement/assets/House2.png differ diff --git a/templates/topDownRPGMovement/assets/Road1.png b/templates/topDownRPGMovement/assets/Road1.png new file mode 100644 index 0000000..cfecd23 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Road1.png differ diff --git a/templates/topDownRPGMovement/assets/RoadEdge1.png b/templates/topDownRPGMovement/assets/RoadEdge1.png new file mode 100644 index 0000000..bc320b4 Binary files /dev/null and b/templates/topDownRPGMovement/assets/RoadEdge1.png differ diff --git a/templates/topDownRPGMovement/assets/Roboto-Bold.ttf b/templates/topDownRPGMovement/assets/Roboto-Bold.ttf new file mode 100644 index 0000000..43da14d Binary files /dev/null and b/templates/topDownRPGMovement/assets/Roboto-Bold.ttf differ diff --git a/templates/topDownRPGMovement/assets/Shaded dark joystick border.png b/templates/topDownRPGMovement/assets/Shaded dark joystick border.png new file mode 100644 index 0000000..3d6f08b Binary files /dev/null and b/templates/topDownRPGMovement/assets/Shaded dark joystick border.png differ diff --git a/templates/topDownRPGMovement/assets/Shaded dark joystick thumb.png b/templates/topDownRPGMovement/assets/Shaded dark joystick thumb.png new file mode 100644 index 0000000..e910646 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Shaded dark joystick thumb.png differ diff --git a/templates/topDownRPGMovement/assets/Tree1.png b/templates/topDownRPGMovement/assets/Tree1.png new file mode 100644 index 0000000..9190d14 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Tree1.png differ diff --git a/templates/topDownRPGMovement/assets/Tree2.png b/templates/topDownRPGMovement/assets/Tree2.png new file mode 100644 index 0000000..5b7164f Binary files /dev/null and b/templates/topDownRPGMovement/assets/Tree2.png differ diff --git a/templates/topDownRPGMovement/assets/Water1.png b/templates/topDownRPGMovement/assets/Water1.png new file mode 100644 index 0000000..464ad95 Binary files /dev/null and b/templates/topDownRPGMovement/assets/Water1.png differ diff --git a/templates/topDownRPGMovement/assets/WaterCorner.png b/templates/topDownRPGMovement/assets/WaterCorner.png new file mode 100644 index 0000000..2dc109d Binary files /dev/null and b/templates/topDownRPGMovement/assets/WaterCorner.png differ diff --git a/templates/topDownRPGMovement/assets/WaterCorner2.png b/templates/topDownRPGMovement/assets/WaterCorner2.png new file mode 100644 index 0000000..764390c Binary files /dev/null and b/templates/topDownRPGMovement/assets/WaterCorner2.png differ diff --git a/templates/topDownRPGMovement/assets/WaterEdgeRight.png b/templates/topDownRPGMovement/assets/WaterEdgeRight.png new file mode 100644 index 0000000..2fe38ab Binary files /dev/null and b/templates/topDownRPGMovement/assets/WaterEdgeRight.png differ diff --git a/templates/topDownRPGMovement/assets/WaterEdgeUp.png b/templates/topDownRPGMovement/assets/WaterEdgeUp.png new file mode 100644 index 0000000..c71d55a Binary files /dev/null and b/templates/topDownRPGMovement/assets/WaterEdgeUp.png differ diff --git a/templates/topDownRPGMovement/assets/WinCollision.png b/templates/topDownRPGMovement/assets/WinCollision.png new file mode 100644 index 0000000..e8fbaf1 Binary files /dev/null and b/templates/topDownRPGMovement/assets/WinCollision.png differ diff --git a/templates/topDownRPGMovement/assets/You Win.png b/templates/topDownRPGMovement/assets/You Win.png new file mode 100644 index 0000000..f632dc8 Binary files /dev/null and b/templates/topDownRPGMovement/assets/You Win.png differ diff --git a/templates/topDownRPGMovement/game.json b/templates/topDownRPGMovement/game.json new file mode 100644 index 0000000..05702d5 --- /dev/null +++ b/templates/topDownRPGMovement/game.json @@ -0,0 +1,22808 @@ +{ + "firstLayout": "", + "gdVersion": { + "build": 226, + "major": 5, + "minor": 5, + "revision": 0 + }, + "properties": { + "adaptGameResolutionAtRuntime": false, + "antialiasingMode": "MSAA", + "antialisingEnabledOnMobile": false, + "folderProject": false, + "orientation": "landscape", + "packageName": "com.example.topdownrpgtutorial", + "pixelsRounding": false, + "projectUuid": "17ab4c4f-d152-49a4-9990-ae19add06e3e", + "scaleMode": "nearest", + "sizeOnStartupMode": "", + "templateSlug": "top-down-rpg-tutorial", + "version": "1.0.0", + "name": "Top down RPG movement Tutorial", + "description": "A top down RPG style movement game example with mobile controls.", + "author": "", + "windowWidth": 1280, + "windowHeight": 720, + "latestCompilationDirectory": "", + "maxFPS": 60, + "minFPS": 20, + "verticalSync": false, + "platformSpecificAssets": { + "android-icon-144": "", + "android-icon-192": "", + "android-icon-36": "", + "android-icon-48": "", + "android-icon-72": "", + "android-icon-96": "", + "android-windowSplashScreenAnimatedIcon": "", + "desktop-icon-512": "", + "ios-icon-100": "", + "ios-icon-1024": "", + "ios-icon-114": "", + "ios-icon-120": "", + "ios-icon-144": "", + "ios-icon-152": "", + "ios-icon-167": "", + "ios-icon-180": "", + "ios-icon-20": "", + "ios-icon-29": "", + "ios-icon-40": "", + "ios-icon-50": "", + "ios-icon-57": "", + "ios-icon-58": "", + "ios-icon-60": "", + "ios-icon-72": "", + "ios-icon-76": "", + "ios-icon-80": "", + "ios-icon-87": "", + "liluo-thumbnail": "" + }, + "loadingScreen": { + "backgroundColor": 0, + "backgroundFadeInDuration": 0.2, + "backgroundImageResourceName": "", + "gdevelopLogoStyle": "light", + "logoAndProgressFadeInDuration": 0.2, + "logoAndProgressLogoFadeInDelay": 0.2, + "minDuration": 1.5, + "progressBarColor": 16777215, + "progressBarHeight": 20, + "progressBarMaxWidth": 200, + "progressBarMinWidth": 40, + "progressBarWidthPercent": 30, + "showGDevelopSplash": true, + "showProgressBar": true + }, + "watermark": { + "placement": "bottom-left", + "showWatermark": true + }, + "authorIds": [], + "authorUsernames": [], + "categories": [ + "rpg" + ], + "playableDevices": [ + "keyboard" + ], + "extensionProperties": [], + "platforms": [ + { + "name": "GDevelop JS platform" + } + ], + "currentPlatform": "GDevelop JS platform" + }, + "resources": { + "resources": [ + { + "file": "assets/ACharDown1.png", + "kind": "image", + "metadata": "", + "name": "ACharDown1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharDown2.png", + "kind": "image", + "metadata": "", + "name": "ACharDown2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharDown3.png", + "kind": "image", + "metadata": "", + "name": "ACharDown3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharDown4.png", + "kind": "image", + "metadata": "", + "name": "ACharDown4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACgarRight1.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACgarRight2.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACgarRight3.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACgarRight4.png", + "kind": "image", + "metadata": "", + "name": "ACgarRight4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharLeft1.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharLeft2.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharLeft3.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharLeft4.png", + "kind": "image", + "metadata": "", + "name": "ACharLeft4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharUp1.png", + "kind": "image", + "metadata": "", + "name": "ACharUp1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharUp2.png", + "kind": "image", + "metadata": "", + "name": "ACharUp2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharUp3.png", + "kind": "image", + "metadata": "", + "name": "ACharUp3.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/ACharUp4.png", + "kind": "image", + "metadata": "", + "name": "ACharUp4.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Dock1.png", + "kind": "image", + "metadata": "", + "name": "Dock1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Tree1.png", + "kind": "image", + "metadata": "", + "name": "Tree1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Tree2.png", + "kind": "image", + "metadata": "", + "name": "Tree2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Bush1.png", + "kind": "image", + "metadata": "", + "name": "Bush1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/House2.png", + "kind": "image", + "metadata": "", + "name": "House2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/WaterCorner.png", + "kind": "image", + "metadata": "", + "name": "WaterCorner.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Grass1.png", + "kind": "image", + "metadata": "{\"localFilePath\":\"assets/Grass1.png\",\"extension\":\".png\",\"pskl\":{}}", + "name": "Grass1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/WaterEdgeRight.png", + "kind": "image", + "metadata": "", + "name": "WaterEdgeRight.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/WaterEdgeUp.png", + "kind": "image", + "metadata": "", + "name": "WaterEdgeUp.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Water1.png", + "kind": "image", + "metadata": "", + "name": "Water1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/RoadEdge1.png", + "kind": "image", + "metadata": "", + "name": "RoadEdge1.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Enemy_Spawn_Location.png", + "kind": "image", + "metadata": "", + "name": "Enemy_Spawn_Location.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Road1.png", + "kind": "image", + "metadata": "", + "name": "Road1.png", + "smoothed": false, + "userAdded": false + }, + { + "file": "assets/WaterCorner2.png", + "kind": "image", + "metadata": "", + "name": "WaterCorner2.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/thumbnail.png", + "kind": "image", + "metadata": "", + "name": "thumbnail.png", + "smoothed": false, + "userAdded": true + }, + { + "file": "assets/Shaded dark joystick border.png", + "kind": "image", + "metadata": "", + "name": "Shaded dark joystick border.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/dd6e3c2d11ba02bd5a052cd47908e851b656d0fb492b52006afa4843e597d0cc_Shaded dark joystick border.png", + "name": "Shaded dark joystick border.png" + } + }, + { + "file": "assets/Shaded dark joystick thumb.png", + "kind": "image", + "metadata": "", + "name": "Shaded dark joystick thumb.png", + "smoothed": true, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Multitouch joysticks/13d8225be69d0f11b6de965cac0d840e7e63e2510a638af89ae42b052caa2460_Shaded dark joystick thumb.png", + "name": "Shaded dark joystick thumb.png" + } + }, + { + "file": "assets/WinCollision.png", + "kind": "image", + "metadata": "{\"extension\":\".png\"}", + "name": "WinCollision", + "smoothed": true, + "userAdded": true + }, + { + "file": "assets/Roboto-Bold.ttf", + "kind": "font", + "metadata": "", + "name": "3bd40ac788d44626fd640ec67ef04ab0364816b5e8c831f2077bff8805cfe689_Roboto-Bold.ttf", + "userAdded": true, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Menu buttons/3bd40ac788d44626fd640ec67ef04ab0364816b5e8c831f2077bff8805cfe689_Roboto-Bold.ttf", + "name": "gdevelop-asset-store" + } + }, + { + "file": "assets/Chevron-Arrow-Left.png", + "kind": "image", + "metadata": "", + "name": "Chevron-Arrow-Left.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Lucid Icons Pack/Shadow/4d60f7b4465cbd647b3569d9ffaf5589b3dacdf5db475e7a175335167fb92683_Chevron-Arrow-Left.png", + "name": "Chevron-Arrow-Left.png" + } + }, + { + "file": "assets/Chevron-Arrow-Up.png", + "kind": "image", + "metadata": "", + "name": "Chevron-Arrow-Up.png", + "smoothed": false, + "userAdded": false, + "origin": { + "identifier": "https://asset-resources.gdevelop.io/public-resources/Lucid Icons Pack/Shadow/36d8c56187710c0ea7742d44eb20825ee099bf2e0976f342bca1c04da5f1644a_Chevron-Arrow-Up.png", + "name": "Chevron-Arrow-Up.png" + } + }, + { + "file": "assets/You Win.png", + "kind": "image", + "metadata": "", + "name": "assets\\You Win.png", + "smoothed": false, + "userAdded": false + } + ], + "resourceFolders": [] + }, + "objects": [ + { + "assetStoreId": "", + "name": "Transition", + "type": "PrimitiveDrawing::Drawer", + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter", + "Timer": 1, + "Color": "255;255;255", + "Type": "", + "Direction": "", + "MaxOpacity": 255 + } + ], + "fillOpacity": 255, + "outlineSize": 1, + "outlineOpacity": 255, + "absoluteCoordinates": false, + "clearBetweenFrames": true, + "antialiasing": "none", + "fillColor": { + "r": 255, + "g": 255, + "b": 255 + }, + "outlineColor": { + "r": 0, + "g": 0, + "b": 0 + } + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Transition" + } + ] + }, + "objectsGroups": [], + "variables": [], + "layouts": [ + { + "b": 209, + "disableInputWhenNotFocused": true, + "mangledName": "Overworld", + "name": "Overworld", + "r": 209, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 209, + "uiSettings": { + "grid": true, + "gridType": "rectangular", + "gridWidth": 16, + "gridHeight": 16, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": true, + "zoomFactor": 2.795727157437007, + "windowMask": false + }, + "objectsGroups": [ + { + "name": "Collisions", + "objects": [ + { + "name": "CameraBoundaryTop" + }, + { + "name": "CameraBoundaryLeft" + }, + { + "name": "CollisionDetect" + } + ] + }, + { + "name": "WorldObjects", + "objects": [ + { + "name": "Tree2" + }, + { + "name": "Tree1" + }, + { + "name": "Bush1" + }, + { + "name": "House1" + } + ] + } + ], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 128, + "layer": "", + "name": "Grass", + "persistentUuid": "15a3b7f4-f78f-4898-9037-58d9fc07eab8", + "width": 688, + "x": 336, + "y": 192, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "CornerWater", + "persistentUuid": "c4db8498-f834-4193-851a-6edf548d92a7", + "width": 0, + "x": 768, + "y": 320, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 80, + "layer": "", + "name": "WaterEdgeRight", + "persistentUuid": "06e0d51e-cafa-4f12-80ad-c7e158682e81", + "width": 16, + "x": 768, + "y": 336, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "", + "name": "NewTiledSprite", + "persistentUuid": "e7946e06-fbb2-4d69-a4de-8257e68caf91", + "width": 240, + "x": 784, + "y": 320, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 180, + "customSize": true, + "depth": 1, + "height": 5, + "layer": "", + "name": "RoadEdge1", + "persistentUuid": "d0d4b9a5-3ba0-4ffb-a30c-d5c9b19b58aa", + "width": 240, + "x": 528, + "y": 368, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 32, + "layer": "", + "name": "Road1", + "persistentUuid": "859ff938-47b0-4884-a81b-647e4e158ae7", + "width": 263, + "x": 513, + "y": 336, + "zOrder": -92, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 5, + "layer": "", + "name": "RoadEdge1", + "persistentUuid": "23e1b8be-0d93-433c-b724-582f9e59c65f", + "width": 256, + "x": 512, + "y": 331, + "zOrder": 9, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Dock1", + "persistentUuid": "6d1893bf-7a30-4d60-9821-9367ab6b28ef", + "width": 0, + "x": 770, + "y": 341, + "zOrder": -90, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "", + "name": "NewTiledSprite", + "persistentUuid": "9a418a0e-ca5b-43c6-bc5a-47dd3e7c9395", + "width": 432, + "x": 336, + "y": 416, + "zOrder": -100, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 96, + "layer": "", + "name": "Water1", + "persistentUuid": "22e45ac6-7fa4-4192-b80b-2627af6c404c", + "width": 448, + "x": 337, + "y": 432, + "zOrder": -10000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "House1", + "persistentUuid": "50cf5a76-1b21-413d-b097-4006410e19a0", + "width": 0, + "x": 576, + "y": 312, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "Transition", + "name": "Transition", + "persistentUuid": "f51be381-f77f-4bdb-a630-df379ad3f9f6", + "width": 0, + "x": 1309, + "y": 319, + "zOrder": 503, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Player", + "persistentUuid": "eb3eb9c8-9e76-4d2e-89c0-600889f54713", + "width": 0, + "x": 800, + "y": 352, + "zOrder": 600, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "WaterCorner2", + "persistentUuid": "35b1989e-4eec-45cf-95f5-0e883f81f798", + "width": 0, + "x": 768, + "y": 416, + "zOrder": 512, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 32, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "8256bb0e-129f-40a9-a043-6d00aa892d9e", + "width": 32, + "x": 576, + "y": 304, + "zOrder": 37, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 24, + "height": 161, + "layer": "UI", + "name": "ShadedDarkJoystick", + "persistentUuid": "2e6a52d3-dbe7-4098-bc0f-d1d94d977d0f", + "width": 160, + "x": 128, + "y": 592, + "zOrder": 1, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "117271b2-0854-4285-859b-eff1f76aa827", + "width": 0, + "x": 832, + "y": 315, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "b37f8d2f-bbe3-46bb-bf50-527d2194d607", + "width": 0, + "x": 672, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "89319449-88e2-45ef-9a81-20cfb0911250", + "width": 0, + "x": 640, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "fc862578-f7d7-4931-a156-02e7064289b0", + "width": 0, + "x": 608, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "2caf059a-c395-4dd3-901b-3b65efd121a2", + "width": 0, + "x": 576, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "712cc7b2-5fbf-40fe-9403-8bd640b60b29", + "width": 0, + "x": 544, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "1ab83325-fd86-4ae7-8c90-e355d2d3bc13", + "width": 0, + "x": 512, + "y": 286, + "zOrder": -3, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "9c2d3d79-48f0-4012-b2e6-7b4952ea2996", + "width": 0, + "x": 704, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "32e397ee-c110-4e61-930f-a1484e936bb8", + "width": 0, + "x": 681, + "y": 399, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree2", + "persistentUuid": "a76cb77e-47cf-4c2b-b49f-8224b59c3c3e", + "width": 0, + "x": 585, + "y": 399, + "zOrder": 32, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "b8793104-b06b-4da5-9d7b-9416cf22662d", + "width": 0, + "x": 680, + "y": 316, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "d73d3965-8c68-4bdd-a87b-d6b00532c06d", + "width": 16, + "x": 672, + "y": 304, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "5935199e-8198-4eeb-8e48-5b7d8dbd9213", + "width": 0, + "x": 728, + "y": 316, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Bush1", + "persistentUuid": "cf2ea1be-e0b8-4707-a10e-e26fc02f29c2", + "width": 0, + "x": 728, + "y": 396, + "zOrder": 34, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "4c7a8282-332c-4d5b-bc7a-5231c3cb2e08", + "width": 16, + "x": 720, + "y": 384, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 207, + "layer": "", + "name": "Water1", + "persistentUuid": "f232ff55-d911-4a03-ad1d-60f9d2679168", + "width": 240, + "x": 784, + "y": 320, + "zOrder": -10000, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "", + "name": "CameraBoundaryTop", + "persistentUuid": "53f479ea-6a01-4251-8851-7603058b9984", + "width": 480, + "x": 336, + "y": 192, + "zOrder": 513, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 224, + "keepRatio": true, + "layer": "", + "name": "CameraBoundaryLeft", + "persistentUuid": "5640b585-e779-436f-b21e-075ed63dd151", + "width": 16, + "x": 336, + "y": 208, + "zOrder": 514, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "f930efde-8901-442f-8032-af76914eab63", + "width": 320, + "x": 512, + "y": 416, + "zOrder": 515, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "5183342d-1b2a-4c03-86b6-4edf0b854812", + "width": 288, + "x": 528, + "y": 272, + "zOrder": 516, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "93027125-bdab-4134-b0e2-9ec51d0b4dfe", + "width": 0, + "x": 672, + "y": 384, + "zOrder": 517, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "227584a4-9b89-405e-a07f-4ee553eea78e", + "width": 0, + "x": 576, + "y": 384, + "zOrder": 517, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "WinMarker", + "persistentUuid": "353b498a-ad06-4b3e-8a93-93725c7b2a9f", + "width": 0, + "x": 560, + "y": 320, + "zOrder": 518, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 32, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "ae603ccd-b675-4734-bd81-7a18ec37836b", + "width": 16, + "x": 544, + "y": 304, + "zOrder": 519, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "4a6752da-ff30-4d17-9867-9a1dde709513", + "width": 0, + "x": 560, + "y": 304, + "zOrder": 520, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "09f9b85a-f18d-4986-ab3d-517b4ffe41dc", + "width": 48, + "x": 768, + "y": 320, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "05405897-51fb-4c80-9994-9b527792b9bc", + "width": 0, + "x": 832, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "5b170436-187e-4b6b-b313-4ca60ccb3e9a", + "width": 0, + "x": 800, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "eb1eb2f7-61dc-40ee-9e84-914b4784016c", + "width": 0, + "x": 768, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "5889754e-9657-46c6-a6da-8fb92cfb3d77", + "width": 0, + "x": 736, + "y": 286, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "aafc02e9-d122-442a-a39f-5f676fcd17f1", + "width": 0, + "x": 512, + "y": 302, + "zOrder": 5, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "a92f670c-5cec-4620-a91b-7dc444d3bf48", + "width": 0, + "x": 512, + "y": 318, + "zOrder": 7, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "2eb3a8a3-0c36-4bc1-869a-a782e0b4de2f", + "width": 0, + "x": 512, + "y": 334, + "zOrder": 11, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "67dba107-f32e-46ab-bfb3-c04c4b7bfd81", + "width": 0, + "x": 512, + "y": 414, + "zOrder": 28, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "f6f42492-94f7-42de-8b9a-b62681f1a038", + "width": 0, + "x": 512, + "y": 350, + "zOrder": 13, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "d8bede98-c286-4628-9dd1-6df1a4edd436", + "width": 0, + "x": 512, + "y": 366, + "zOrder": 18, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "379fc1c5-2b0b-4d13-8b0a-06914cd84b57", + "width": 0, + "x": 512, + "y": 382, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "layer": "", + "name": "Tree1", + "persistentUuid": "cfe14151-caf8-47dc-9a14-c2b2bd907489", + "width": 0, + "x": 512, + "y": 398, + "zOrder": 22, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 16, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "44b6e830-4ced-4086-8fcb-e0e13495545c", + "width": 16, + "x": 720, + "y": 304, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 48, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "07c058fd-7929-4d0f-acac-2420fba1248b", + "width": 48, + "x": 768, + "y": 368, + "zOrder": 42, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 144, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "37405abd-7167-40f5-a31c-f2deba2ff182", + "width": 16, + "x": 816, + "y": 272, + "zOrder": 516, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 144, + "keepRatio": true, + "layer": "Collision", + "name": "CollisionDetect", + "persistentUuid": "285fba02-6539-4bd0-98bb-24ef4e3d91ed", + "width": 16, + "x": 512, + "y": 272, + "zOrder": 516, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "ChevronArrowLeft", + "persistentUuid": "4ebde66f-24e9-4283-afba-2143049b1744", + "width": 0, + "x": 612, + "y": 345, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "ChevronArrowLeft", + "persistentUuid": "00f1f4c6-4224-4b85-b863-c377d5751684", + "width": 0, + "x": 756, + "y": 345, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "ChevronArrowLeft", + "persistentUuid": "b8879e8b-f6f6-4017-a58d-dbd20286b0cc", + "width": 0, + "x": 708, + "y": 345, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "ChevronArrowLeft", + "persistentUuid": "0f679e6d-269e-403d-b6de-9b09b4b95d3e", + "width": 0, + "x": 660, + "y": 345, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "ChevronArrowUp", + "persistentUuid": "182b95dd-be64-4cb5-86af-0118d8bcf73b", + "width": 0, + "x": 561, + "y": 347, + "zOrder": 21, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 96, + "layer": "", + "name": "Grass", + "persistentUuid": "9a84e3c8-66e4-4d9f-9b31-66a5515d3267", + "width": 432, + "x": 336, + "y": 320, + "zOrder": -200, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "ACharDown1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Right", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "ACgarRight1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACgarRight2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACgarRight3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACgarRight4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Left", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "ACharLeft1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharLeft2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharLeft3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharLeft4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + }, + { + "name": "Up", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "ACharUp1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharUp2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharUp3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharUp4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Dock1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Dock1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Tree1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Tree1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 15.854545593261719, + "y": 27.40909194946289 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Tree2", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Tree2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 16.000001907348633, + "y": 30.618200302124023 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Bush1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Bush1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 8.318181991577148, + "y": 11.963641166687012 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "House1", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "House2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 32, + "y": 24 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "CornerWater", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "WaterCorner.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "WaterCorner2", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "WaterCorner2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Grass", + "texture": "Grass1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 16, + "name": "WaterEdgeRight", + "texture": "WaterEdgeRight.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 32, + "name": "NewTiledSprite", + "texture": "WaterEdgeUp.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 32, + "name": "Water1", + "texture": "Water1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 32, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 16, + "name": "Road1", + "texture": "Road1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 16, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "assetStoreId": "", + "height": 5, + "name": "RoadEdge1", + "texture": "RoadEdge1.png", + "type": "TiledSpriteObject::TiledSprite", + "width": 36, + "variables": [], + "effects": [], + "behaviors": [] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "CollisionDetect", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Enemy_Spawn_Location.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "assetStoreId": "9be1b0d0d5a1afad4537db989ea5e3a4a4564dfd123630a9bf61330a73803c63", + "name": "ShadedDarkJoystick", + "type": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "variables": [], + "effects": [], + "behaviors": [], + "content": {}, + "childrenContent": { + "Border": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Shaded dark joystick border.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + "Thumb": { + "adaptCollisionMaskAutomatically": false, + "updateIfNotVisible": false, + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Shaded dark joystick thumb.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + } + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "CameraBoundaryTop", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Enemy_Spawn_Location.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "CameraBoundaryLeft", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "Enemy_Spawn_Location.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "WinMarker", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "WinCollision", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "metadata": "{\"pskl\":{}}", + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "WinCollision", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "7844d6869edba6e65f65bb2c5f5b06bafbe542f3b0fbfa464d6788e579b7a0a4", + "name": "ChevronArrowLeft", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Chevron-Arrow-Left.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 9, + "y": 0 + }, + { + "x": 9, + "y": 14 + }, + { + "x": 0, + "y": 14 + } + ] + ] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "00a1702ecb9e41fef7bfdb3f1c4b0de7a9c99ddcdd1a5c13da577d5c3a89f3e4", + "name": "ChevronArrowUp", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.025, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "Chevron-Arrow-Up.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 14, + "y": 0 + }, + { + "x": 14, + "y": 9 + }, + { + "x": 0, + "y": 9 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Player" + }, + { + "objectName": "ChevronArrowUp" + }, + { + "objectName": "ChevronArrowLeft" + }, + { + "objectName": "ShadedDarkJoystick" + }, + { + "folderName": "Background", + "children": [ + { + "objectName": "Grass" + }, + { + "objectName": "CornerWater" + }, + { + "objectName": "WaterEdgeRight" + }, + { + "objectName": "WaterCorner2" + }, + { + "objectName": "NewTiledSprite" + }, + { + "objectName": "Water1" + }, + { + "objectName": "Road1" + }, + { + "objectName": "RoadEdge1" + }, + { + "objectName": "Dock1" + } + ] + }, + { + "folderName": "Obstacles", + "children": [ + { + "objectName": "House1" + }, + { + "objectName": "Tree1" + }, + { + "objectName": "Tree2" + }, + { + "objectName": "Bush1" + } + ] + }, + { + "folderName": "CollisionBoxes", + "children": [ + { + "objectName": "CollisionDetect" + }, + { + "objectName": "WinMarker" + }, + { + "objectName": "CameraBoundaryLeft" + }, + { + "objectName": "CameraBoundaryTop" + } + ] + } + ] + }, + "events": [ + { + "colorB": 155, + "colorG": 155, + "colorR": 155, + "creationTime": 0, + "name": "Gameplay", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "4", + "", + "" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "1.5", + "\"Transition\"", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "WorldObjects", + "=", + "WorldObjects.Y()" + ] + }, + { + "type": { + "value": "HideLayer" + }, + "parameters": [ + "", + "\"Collision\"" + ] + }, + { + "type": { + "value": "Cache" + }, + "parameters": [ + "WinMarker" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SeparateFromObjects" + }, + "parameters": [ + "Player", + "Collisions", + "yes" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Player", + "=", + "Player.Y()" + ] + }, + { + "type": { + "value": "CentreCamera" + }, + "parameters": [ + "", + "Player", + "", + "", + "" + ] + }, + { + "type": { + "value": "ClampCamera" + }, + "parameters": [ + "", + "CameraBoundaryLeft.BoundingBoxRight()", + "CameraBoundaryTop.BoundingBoxBottom()", + "Player.CenterX()+1000", + "Player.CenterY()+1000", + "", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Mobile controls", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + }, + { + "type": { + "inverted": true, + "value": "SystemInfo::HasTouchScreen" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Delete" + }, + "parameters": [ + "ShadedDarkJoystick", + "" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "ShadedDarkJoystick", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Up\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "ShadedDarkJoystick", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Right\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "ShadedDarkJoystick", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Left\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "ShadedDarkJoystick", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Down\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Player movement", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Up\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Player", + "Animation", + "=", + "\"Up\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Player", + "Animation", + "=", + "\"Down\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Right\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Player", + "Animation", + "=", + "\"Right\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::TopDownMovementBehavior::IsUsingControl" + }, + "parameters": [ + "Player", + "TopDownMovement", + "\"Left\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Player", + "Animation", + "=", + "\"Left\"" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "Player", + "TopDownMovement" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PauseAnimation" + }, + "parameters": [ + "Player", + "Animation" + ] + } + ] + }, + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "Player", + "TopDownMovement" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::PlayAnimation" + }, + "parameters": [ + "Player", + "Animation" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "End screen", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "folded": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "WinMarker", + "Player.CenterX()", + "Player.CenterY()" + ] + }, + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::IsMoving" + }, + "parameters": [ + "Player", + "TopDownMovement" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Player", + "TopDownMovement", + "" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect" + }, + "parameters": [ + "Transition", + "FlashTransitionPainter", + "\"0;0;0\"", + "1", + "\"Circular\"", + "\"Forward\"", + "", + "" + ] + }, + { + "type": { + "value": "Wait" + }, + "parameters": [ + "1" + ] + }, + { + "type": { + "value": "Scene" + }, + "parameters": [ + "", + "\"EndScreen\"", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 0, + "ambientLightColorG": 19942824, + "ambientLightColorR": 16, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + }, + { + "ambientLightColorB": 13920576, + "ambientLightColorG": 6050880, + "ambientLightColorR": 11874240, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Dialogue", + "renderingType": "", + "visibility": false, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 15350824, + "ambientLightColorG": 6062928, + "ambientLightColorR": 15732720, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "UI", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 8799112, + "ambientLightColorG": 6050880, + "ambientLightColorR": 12506048, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Transition", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 15506000, + "ambientLightColorG": 6062928, + "ambientLightColorR": 17727712, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 0.1, + "cameraType": "perspective", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Collision", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "MobileControls", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + } + ] + }, + { + "b": 0, + "disableInputWhenNotFocused": true, + "mangledName": "EndScreen", + "name": "EndScreen", + "r": 0, + "standardSortMethod": true, + "stopSoundsOnStartup": true, + "title": "", + "v": 0, + "uiSettings": { + "grid": false, + "gridType": "rectangular", + "gridWidth": 32, + "gridHeight": 32, + "gridOffsetX": 0, + "gridOffsetY": 0, + "gridColor": 10401023, + "gridAlpha": 0.8, + "snap": false, + "zoomFactor": 0.4789341884535247, + "windowMask": false + }, + "objectsGroups": [], + "variables": [], + "instances": [ + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "Transition", + "name": "Transition", + "persistentUuid": "3ab32943-48d1-44bd-ad80-16b566cc4b39", + "width": 0, + "x": 1395, + "y": 173, + "zOrder": 81, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 1, + "height": 231, + "keepRatio": true, + "layer": "", + "name": "EndGame", + "persistentUuid": "ccbbaedd-a7c5-47b5-8036-ec8372a6a64f", + "width": 1281, + "x": 1, + "y": 117, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": true, + "depth": 0, + "height": 160, + "keepRatio": true, + "layer": "", + "name": "Player", + "persistentUuid": "aedbba8e-30bf-4d6e-bcbe-8c84325d3dfc", + "width": 160, + "x": 1044, + "y": 489, + "zOrder": 0, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + }, + { + "angle": 0, + "customSize": false, + "height": 0, + "keepRatio": true, + "layer": "", + "name": "EndingDialog", + "persistentUuid": "003936ed-15a1-4016-ab3f-084a1fa77bcc", + "width": 0, + "x": 401, + "y": 46, + "zOrder": 82, + "numberProperties": [], + "stringProperties": [], + "initialVariables": [] + } + ], + "objects": [ + { + "assetStoreId": "", + "bold": false, + "italic": false, + "name": "EndGame", + "smoothed": true, + "type": "TextObject::Text", + "underlined": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + } + ], + "string": "Game End", + "font": "3bd40ac788d44626fd640ec67ef04ab0364816b5e8c831f2077bff8805cfe689_Roboto-Bold.ttf", + "textAlignment": "center", + "characterSize": 200, + "color": { + "b": 255, + "g": 255, + "r": 255 + }, + "content": { + "bold": false, + "isOutlineEnabled": false, + "isShadowEnabled": false, + "italic": false, + "outlineColor": "255;255;255", + "outlineThickness": 2, + "shadowAngle": 90, + "shadowBlurRadius": 2, + "shadowColor": "0;0;0", + "shadowDistance": 4, + "shadowOpacity": 127, + "smoothed": true, + "underlined": false, + "text": "Game End", + "font": "3bd40ac788d44626fd640ec67ef04ab0364816b5e8c831f2077bff8805cfe689_Roboto-Bold.ttf", + "textAlignment": "center", + "verticalTextAlignment": "top", + "characterSize": 200, + "color": "255;255;255" + } + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Player", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "PixelPerfectTopDownMovement", + "type": "PixelPerfectMovement::PixelPerfectTopDownMovement", + "TopDownMovement": "TopDownMovement", + "PixelSize": 16, + "OffsetX": 0, + "OffsetY": 0 + }, + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior", + "acceleration": 900000, + "allowDiagonals": false, + "angleOffset": 0, + "angularMaxSpeed": 180, + "customIsometryAngle": 30, + "deceleration": 900000, + "ignoreDefaultControls": false, + "maxSpeed": 50, + "movementAngleOffset": 0, + "rotateObject": false, + "viewpoint": "TopDown" + } + ], + "animations": [ + { + "name": "Down", + "useMultipleDirections": false, + "directions": [ + { + "looping": true, + "timeBetweenFrames": 0.20000000298023224, + "sprites": [ + { + "hasCustomCollisionMask": false, + "image": "ACharDown1.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown2.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown3.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + }, + { + "hasCustomCollisionMask": false, + "image": "ACharDown4.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [] + } + ] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": true, + "assetStoreId": "", + "name": "EndingDialog", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM", + "ShouldCheckHovering": true, + "State": "Idle", + "TouchId": 0, + "TouchIsInside": false, + "MouseIsInside": false, + "Index": 2.0247e-320 + } + ], + "animations": [ + { + "name": "", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [ + { + "hasCustomCollisionMask": true, + "image": "assets\\You Win.png", + "points": [], + "originPoint": { + "name": "origine", + "x": 0, + "y": 0 + }, + "centerPoint": { + "automatic": true, + "name": "centre", + "x": 0, + "y": 0 + }, + "customCollisionMask": [ + [ + { + "x": 0, + "y": 0 + }, + { + "x": 501, + "y": 0 + }, + { + "x": 501, + "y": 600 + }, + { + "x": 0, + "y": 600 + } + ] + ] + } + ] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "EndGame" + }, + { + "objectName": "Player" + }, + { + "objectName": "EndingDialog" + } + ] + }, + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Cache" + }, + "parameters": [ + "EndingDialog" + ] + }, + { + "type": { + "value": "ZoomCamera" + }, + "parameters": [ + "", + "1.5", + "\"Transition\"", + "" + ] + }, + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::ShakeObject_PositionAngle" + }, + "parameters": [ + "EndGame", + "ShakeObject_PositionAngle", + "0", + "0", + "25", + "0", + "1", + "yes", + "" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PaintEffect" + }, + "parameters": [ + "Transition", + "FlashTransitionPainter", + "\"0;0;0\"", + "1", + "\"Circular\"", + "\"Backward\"", + "", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Ending dialog", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "DepartScene" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "Wait" + }, + "parameters": [ + "2" + ] + }, + { + "type": { + "value": "Montre" + }, + "parameters": [ + "EndingDialog", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsClicked" + }, + "parameters": [ + "EndingDialog", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "Visible" + }, + "parameters": [ + "EndingDialog" + ] + } + ], + "actions": [ + { + "type": { + "value": "Quit" + }, + "parameters": [ + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + }, + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "Transition", + "renderingType": "", + "visibility": true, + "cameras": [], + "effects": [ + { + "effectType": "Scene3D::HemisphereLight", + "name": "3D Light", + "doubleParameters": { + "elevation": 45, + "intensity": 1, + "rotation": 0 + }, + "stringParameters": { + "groundColor": "64;64;64", + "skyColor": "255;255;255", + "top": "Y-" + }, + "booleanParameters": {} + } + ] + } + ], + "behaviorsSharedData": [ + { + "name": "Animation", + "type": "AnimatableCapability::AnimatableBehavior" + }, + { + "name": "ButtonFSM", + "type": "ButtonStates::ButtonFSM" + }, + { + "name": "Effect", + "type": "EffectCapability::EffectBehavior" + }, + { + "name": "FlashTransitionPainter", + "type": "FlashTransitionPainter::FlashTransitionPainter" + }, + { + "name": "Flippable", + "type": "FlippableCapability::FlippableBehavior" + }, + { + "name": "Opacity", + "type": "OpacityCapability::OpacityBehavior" + }, + { + "name": "PixelPerfectTopDownMovement", + "type": "PixelPerfectMovement::PixelPerfectTopDownMovement" + }, + { + "name": "Resizable", + "type": "ResizableCapability::ResizableBehavior" + }, + { + "name": "Scale", + "type": "ScalableCapability::ScalableBehavior" + }, + { + "name": "ShakeObject_PositionAngle", + "type": "ShakeObject::ShakeObject_PositionAngle" + }, + { + "name": "Text", + "type": "TextContainerCapability::TextContainerBehavior" + }, + { + "name": "TopDownMovement", + "type": "TopDownMovementBehavior::TopDownMovementBehavior" + } + ] + } + ], + "externalEvents": [], + "eventsFunctionsExtensions": [ + { + "author": "", + "category": "Movement", + "extensionNamespace": "", + "fullName": "Pixel perfect movement", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30NCgkuc3Qye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWRhc2hhcnJheTo2LDY7fQ0KCS5zdDN7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtZGFzaGFycmF5OjQsNDt9DQoJLnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7fQ0KCS5zdDV7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1kYXNoYXJyYXk6My4xMDgxLDMuMTA4MTt9DQoJDQoJCS5zdDZ7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtZGFzaGFycmF5OjQsMzt9DQo8L3N0eWxlPg0KPHJlY3QgeD0iNCIgeT0iNCIgY2xhc3M9InN0MCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ii8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMTIiIHkxPSIyOCIgeDI9IjEyIiB5Mj0iNCIvPg0KPGxpbmUgY2xhc3M9InN0MCIgeDE9IjIwIiB5MT0iMjgiIHgyPSIyMCIgeTI9IjQiLz4NCjxsaW5lIGNsYXNzPSJzdDAiIHgxPSIyOCIgeTE9IjIwIiB4Mj0iNCIgeTI9IjIwIi8+DQo8bGluZSBjbGFzcz0ic3QwIiB4MT0iMjgiIHkxPSIxMiIgeDI9IjQiIHkyPSIxMiIvPg0KPC9zdmc+DQo=", + "name": "PixelPerfectMovement", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Graphic Design/Graphic Design_grid.svg", + "shortDescription": "Grid-based or pixel perfect platformer and top-down movements.", + "version": "0.2.0", + "description": [ + "Games with pixel art usually use pixels bigger than actual pixels of the screen. This can lead to big pixels partially overlapping each other which doesn't look good.", + "", + "This extension allows to seamlessly keep big pixels aligned when the object is stopped and still beneficiate from the high resolution of the screen to have smooth movements.", + "", + "It can be used for:", + "* Pixel-perfect platformers ([open the project online](https://editor.gdevelop.io/?project=example://platformer-with-tilemap))", + "* Align top-down characters on a grid ([open the project online](https://editor.gdevelop.io/?project=example://top-down-grid-movement))" + ], + "origin": { + "identifier": "PixelPerfectMovement", + "name": "gdevelop-extension-store" + }, + "tags": [ + "pixel perfect", + "platformer", + "platform", + "top-down", + "movement", + "grid" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "mkJFlZEo4aXeAZxt8CsXjEkW4Oq1", + "mMR36hCjO5dlcYmhNSuVtcREM473" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Return the speed necessary to cover a distance according to the deceleration.", + "fullName": "Speed to reach", + "functionType": "Expression", + "name": "SpeedToReach", + "private": true, + "sentence": "Braking distance from an initial speed: _PARAM2_ and a deceleration: _PARAM3_ is less than _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "GetArgumentAsNumber(\"Distance\")", + ">=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "sqrt(2 * GetArgumentAsNumber(\"Distance\") * GetArgumentAsNumber(\"Deceleration\"))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "GetArgumentAsNumber(\"Distance\")", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "-sqrt(-2 * GetArgumentAsNumber(\"Distance\") * GetArgumentAsNumber(\"Deceleration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Distance", + "name": "Distance", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the braking distance according to an initial speed and a deceleration.", + "fullName": "Braking distance", + "functionType": "Expression", + "name": "BrakingDistance", + "private": true, + "sentence": "Braking distance from an initial speed: _PARAM2_ and a deceleration: _PARAM3_ is less than _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "GetArgumentAsNumber(\"Speed\") * GetArgumentAsNumber(\"Speed\") / (2 * GetArgumentAsNumber(\"Deceleration\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Speed", + "name": "Speed", + "type": "expression" + }, + { + "description": "Deceleration", + "name": "Deceleration", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Define JavaScript classes for top-down.", + "fullName": "Define JavaScript classes for top-down", + "functionType": "Action", + "name": "DefineJavaScriptForTopDown", + "private": true, + "sentence": "Define JavaScript classes for top-down", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GlobalVariableAsBoolean" + }, + "parameters": [ + "__pixelPerfect.TopDownClassesDefined", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetGlobalVariableAsBoolean" + }, + "parameters": [ + "__pixelPerfect.TopDownClassesDefined", + "True" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "gdjs.__pixelPerfectExtension = gdjs.__pixelPerfectExtension || {};", + "", + "gdjs.__pixelPerfectExtension.PixelPerfectTopDownMovement = /** @class */ (function () {", + "", + " /**", + " * @param {gdjs.RuntimeBehavior} pixelPerfectBehavior", + " * @param {gdjs.TopDownMovementRuntimeBehavior} topDownBehavior", + " */", + " function PixelPerfectTopDownMovement(pixelPerfectBehavior, topDownBehavior) {", + " /** @type {gdjs.RuntimeBehavior} */", + " this.pixelPerfectBehavior = pixelPerfectBehavior;", + " /** @type {gdjs.TopDownMovementRuntimeBehavior} */", + " this.topDownBehavior = topDownBehavior;", + "", + " topDownBehavior.registerHook(this);", + "", + " /** @type {number | null} */", + " this.targetX = null;", + " /** @type {number | null} */", + " this.targetY = null;", + " this.targetDirectionX = 0;", + " this.targetDirectionY = 0;", + " this.lastDirection = -1;", + " this.isVelocityAdjusted = false;", + " this.isVelocityAdjustedOnX = false;", + " this.isVelocityAdjustedOnY = false;", + " }", + "", + " /**", + " * Return the direction to use instead of the direction given in", + " * parameter.", + " * @param {gdjs.TopDownMovementRuntimeBehavior.TopDownMovementHookContext} context", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.overrideDirection = function (context) {", + " let direction = context.getDirection();", + " if (!this.pixelPerfectBehavior.activated()) {", + " return direction;", + " }", + "", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " if (cellSize <= 0 || that._allowDiagonals) {", + " return direction;", + " }", + "", + " // Forbid to turn before being aligned on the grid.", + "", + " const timeDelta = object.getElapsedTime() / 1000;", + " const deltaX = Math.abs(that._xVelocity * timeDelta);", + " const deltaY = Math.abs(that._yVelocity * timeDelta);", + "", + " const isTryingToMoveOnX = direction === 4 || direction === 0;", + " const isTryingToMoveOnY = direction === 6 || direction === 2;", + " if (isTryingToMoveOnX) {", + " if (that._yVelocity < 0) {", + " if (Math.abs(this.ceilToCellY(object.y) - object.y) > deltaY) {", + " direction = 6;", + " } else {", + " object.y = this.ceilToCellY(object.y);", + " }", + " }", + " if (that._yVelocity > 0) {", + " if (Math.abs(this.floorToCellY(object.y) - object.y) > deltaY) {", + " direction = 2;", + " } else {", + " object.y = this.floorToCellY(object.y);", + " }", + " }", + " } else if (isTryingToMoveOnY) {", + " if (that._xVelocity < 0) {", + " if (Math.abs(this.ceilToCellX(object.x) - object.x) > deltaX) {", + " direction = 4;", + " } else {", + " object.x = this.ceilToCellX(object.x);", + " }", + " }", + " if (that._xVelocity > 0) {", + " if (Math.abs(this.floorToCellX(object.x) - object.x) > deltaX) {", + " direction = 0;", + " } else {", + " object.x = this.floorToCellX(object.x);", + " }", + " }", + " }", + "", + " // Ensure sharp turn even with Verlet integrations.", + " const speed = Math.abs(that._xVelocity + that._yVelocity);", + " if (direction === 0) {", + " that._xVelocity = speed;", + " that._yVelocity = 0;", + " } else if (direction === 4) {", + " that._xVelocity = -speed;", + " that._yVelocity = 0;", + " } else if (direction === 2) {", + " that._yVelocity = speed;", + " that._xVelocity = 0;", + " } else if (direction === 6) {", + " that._yVelocity = -speed;", + " that._xVelocity = 0;", + " }", + "", + " this.lastDirection = direction;", + " return direction;", + " }", + "", + " /**", + " * Called before the acceleration and new direction is applied to the", + " * velocity.", + " * @param {gdjs.TopDownMovementRuntimeBehavior.TopDownMovementHookContext} context", + " */", + " PixelPerfectTopDownMovement.prototype.beforeSpeedUpdate = function (context) {", + " if (!this.pixelPerfectBehavior.activated()) {", + " return;", + " }", + "", + " const direction = context.getDirection();", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const isMovingOnX =", + " direction !== -1 && direction !== 2 && direction !== 6;", + " if (isMovingOnX) {", + " this.targetX = null;", + " } else if (this.targetX === null) {", + " // Find where the deceleration should stop the object.", + " if (that._xVelocity > 0) {", + " this.targetX = this.ceilToCellX(", + " object.x + this.getBreakingDistanceX()", + " );", + " this.targetDirectionX = 1;", + " }", + " if (that._xVelocity < 0) {", + " this.targetX = this.floorToCellX(", + " object.x - this.getBreakingDistanceX()", + " );", + " this.targetDirectionX = -1;", + " }", + " }", + "", + " const isMovingOnY =", + " direction !== -1 && direction !== 0 && direction !== 4;", + " if (isMovingOnY) {", + " this.targetY = null;", + " } else if (this.targetY === null) {", + " // Find where the deceleration should stop the object.", + " if (that._yVelocity > 0) {", + " this.targetY = this.ceilToCellY(", + " object.y + this.getBreakingDistanceY()", + " );", + " this.targetDirectionY = 1;", + " }", + " if (that._yVelocity < 0) {", + " this.targetY = this.floorToCellY(", + " object.y - this.getBreakingDistanceY()", + " );", + " this.targetDirectionY = -1;", + " }", + " }", + "", + " // Make as if the player had press button a bit longer to reach exactly", + " // the next cell.", + "", + " this.isVelocityAdjustedOnX = this.targetX !== null;", + " if (this.isVelocityAdjustedOnX) {", + " if (this.targetDirectionX > 0) {", + " if (this.targetX > object.getX()) {", + " that._xVelocity = Math.min(", + " that._xVelocity + that._acceleration,", + " that._maxSpeed,", + " this.getSpeedToReach(this.targetX - object.getX())", + " );", + " }", + " const nextFrameX = object.getX() + that._xVelocity * object.getElapsedTime() / 1000;", + " if (this.targetX <= nextFrameX) {", + " that._xVelocity = 0;", + " object.setX(this.roundToCellX(object.getX()));", + " this.targetX = null;", + " }", + " }", + " if (this.targetDirectionX < 0) {", + " if (this.targetX < object.getX()) {", + " that._xVelocity = Math.max(", + " that._xVelocity - that._acceleration,", + " -that._maxSpeed,", + " this.getSpeedToReach(this.targetX - object.getX())", + " );", + " }", + " const nextFrameX = object.getX() + that._xVelocity * object.getElapsedTime() / 1000;", + " if (this.targetX >= nextFrameX) {", + " that._xVelocity = 0;", + " object.setX(this.roundToCellX(object.getX()));", + " this.targetX = null;", + " }", + " }", + " // The velocity is exact. There no need for Verlet integration.", + " this.previousVelocityX = that._xVelocity;", + " }", + "", + " this.isVelocityAdjustedOnY = this.targetY !== null;", + " if (this.isVelocityAdjustedOnY) {", + " if (this.targetDirectionY > 0) {", + " if (this.targetY > object.getY()) {", + " that._yVelocity = Math.min(", + " that._yVelocity + that._acceleration,", + " that._maxSpeed,", + " this.getSpeedToReach(this.targetY - object.getY())", + " );", + " }", + " const nextFrameY = object.getY() + that._yVelocity * object.getElapsedTime() / 1000;", + " if (this.targetY <= nextFrameY) {", + " that._yVelocity = 0;", + " object.setY(this.roundToCellY(object.getY()));", + " this.targetY = null;", + " }", + " }", + " if (this.targetDirectionY < 0) {", + " if (this.targetY < object.getY()) {", + " that._yVelocity = Math.max(", + " that._yVelocity - that._acceleration,", + " -that._maxSpeed,", + " this.getSpeedToReach(this.targetY - object.getY())", + " );", + " }", + " const nextFrameY = object.getY() + that._yVelocity * object.getElapsedTime() / 1000;", + " if (this.targetY >= nextFrameY) {", + " that._yVelocity = 0;", + " object.setY(this.roundToCellY(object.getY()));", + " this.targetY = null;", + " }", + " }", + " // The velocity is exact. There no need for Verlet integration.", + " this.previousVelocityY = that._yVelocity;", + " }", + " }", + "", + " /**", + " * Called before the velocity is applied to the object position and", + " * angle.", + " */", + " PixelPerfectTopDownMovement.prototype.beforePositionUpdate = function () {", + " if (!this.pixelPerfectBehavior.activated()) {", + " return;", + " }", + "", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const that = this.topDownBehavior;", + "", + " if (this.isVelocityAdjustedOnX) {", + " // The velocity is exact. There no need for Verlet integration.", + " that._xVelocity = this.previousVelocityX;", + " }", + " if (this.isVelocityAdjustedOnY) {", + " // The velocity is exact. There no need for Verlet integration.", + " that._yVelocity = this.previousVelocityY;", + " }", + " }", + "", + " const epsilon = 1 / (1 << 20);", + "", + " PixelPerfectTopDownMovement.prototype.doStepPostEvents = function (instanceContainer) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " if (cellSize <= 0) {", + " return;", + " }", + "", + " const that = this.topDownBehavior;", + " const object = that.owner;", + "", + " const isMovingOnX =", + " this.lastDirection !== -1 &&", + " this.lastDirection !== 2 &&", + " this.lastDirection !== 6;", + " const isMovingOnY =", + " this.lastDirection !== -1 &&", + " this.lastDirection !== 0 &&", + " this.lastDirection !== 4;", + "", + " // Avoid rounding errors after a call to \"separate\" to make characters", + " // move indefinitely in front of a wall because they can't reach the cell.", + " if (!isMovingOnX && that._xVelocity !== 0) {", + " const x = object.getX();", + " const roundedX = this.roundToCellX(x);", + " if (Math.abs(roundedX - x) < epsilon) {", + " object.setX(roundedX);", + " this.targetDirectionX = 0;", + " that._xVelocity = 0;", + " }", + " }", + " if (!isMovingOnY && that._yVelocity !== 0) {", + " const y = object.getY();", + " const roundedY = this.roundToCellY(y);", + " if (Math.abs(roundedY - y) < epsilon) {", + " object.setY(roundedY);", + " this.targetDirectionY = 0;", + " that._yVelocity = 0;", + " }", + " }", + " }", + "", + " /**", + " * @returns {number} the braking distance according to an initial speed and a deceleration.", + " */", + " PixelPerfectTopDownMovement.prototype.getBreakingDistanceX = function () {", + " const that = this.topDownBehavior;", + " return (that._xVelocity * that._xVelocity) / (2 * that._deceleration);", + " }", + "", + " /**", + " * @returns {number} the braking distance according to an initial speed and a deceleration.", + " */", + " PixelPerfectTopDownMovement.prototype.getBreakingDistanceY = function () {", + " const that = this.topDownBehavior;", + " return (that._yVelocity * that._yVelocity) / (2 * that._deceleration);", + " }", + "", + " /**", + " * @param {number} displacement", + " * @returns {number} the speed necessary to cover a distance according to the deceleration.", + " */", + " PixelPerfectTopDownMovement.prototype.getSpeedToReach = function (displacement) {", + " const that = this.topDownBehavior;", + " return (", + " Math.sign(displacement) *", + " Math.sqrt(2 * Math.abs(displacement) * that._deceleration)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.ceilToCellX = function (x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.ceil((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.roundToCellX = function (x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.round((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} x", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.floorToCellX = function (x) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetX = this.pixelPerfectBehavior._getOffsetX();", + "", + " return (", + " gridOffsetX +", + " cellSize * Math.floor((x - gridOffsetX) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.ceilToCellY = function (y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.ceil((y - gridOffsetY) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.roundToCellY = function (y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.round((y - gridOffsetY) / cellSize)", + " );", + " }", + "", + " /**", + " * @param {number} y", + " * @return {number}", + " */", + " PixelPerfectTopDownMovement.prototype.floorToCellY = function (y) {", + " /** @type {number} */", + " const cellSize = this.pixelPerfectBehavior._getPixelSize();", + " /** @type {number} */", + " const gridOffsetY = this.pixelPerfectBehavior._getOffsetY();", + "", + " return (", + " gridOffsetY +", + " cellSize * Math.floor((y - gridOffsetY) / cellSize)", + " );", + " }", + "", + " return PixelPerfectTopDownMovement;", + "}());", + "", + "" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": true + } + ] + } + ], + "parameters": [], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Seamlessly align big pixels using a top-down movement.", + "fullName": "Pixel perfect top-down movement", + "name": "PixelPerfectTopDownMovement", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::DefineJavaScriptForTopDown" + }, + "parameters": [ + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "\r", + "const object = objects[0];\r", + "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");\r", + "const behavior = object.getBehavior(behaviorName);\r", + "\r", + "/** @type {gdjs.TopDownMovementRuntimeBehavior} */\r", + "const topDownBehavior = object.getBehavior(behavior._getTopDownMovement());\r", + "\r", + "const pixelPerfect = new gdjs.__pixelPerfectExtension.PixelPerfectTopDownMovement(behavior, topDownBehavior);\r", + "topDownBehavior.__pixelPerfect = pixelPerfect;\r", + "behavior.__pixelPerfect = pixelPerfect;\r", + "" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectTopDownMovement", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "const object = objects[0];", + "const behaviorName = eventsFunctionContext.getBehaviorName(\"Behavior\");", + "const behavior = object.getBehavior(behaviorName);", + "", + "behavior.__pixelPerfect.doStepPostEvents(runtimeScene);" + ], + "parameterObjects": "Object", + "useStrict": true, + "eventsSheetExpanded": true + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectTopDownMovement", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Pixel size", + "description": "", + "group": "", + "extraInformation": [], + "name": "PixelSize" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset X", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetX" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset Y", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetY" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Seamlessly align big pixels using a platformer character movement.", + "fullName": "Pixel perfect platformer character", + "name": "PixelPerfectPlatformerCharacter", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "X axis", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "We don't know if the deceleration was already applied or not this step, but if the speed drifted from more than 1%, another extension is probably modifying the speed and it must not be overridden." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed() - Object.Behavior::PropertyPreviousSpeedX())", + "<", + "Object.PlatformerCharacter::CurrentSpeed() * 0.01 + Object.PlatformerCharacter::Deceleration() * TimeDelta()" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Find how far to go to reach a pixel." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + ">", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyOffsetX() + Object.Behavior::PropertyPixelSize() * ceil((Object.X() + PixelPerfectMovement::BrakingDistance(Object.PlatformerCharacter::CurrentSpeed(), Object.PlatformerCharacter::Deceleration()) - Object.Behavior::PropertyOffsetX()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.X()) + \"-->\" + ToString(Object.Behavior::PropertyTargetX())", + "", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyOffsetX() + Object.Behavior::PropertyPixelSize() * floor((Object.X() - PixelPerfectMovement::BrakingDistance(Object.PlatformerCharacter::CurrentSpeed(), Object.PlatformerCharacter::Deceleration()) - Object.Behavior::PropertyOffsetX()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.X()) + \"-->\" + ToString(Object.Behavior::PropertyTargetX())", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to the target as the movement behavior would do." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyTargetX()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "min(Object.PlatformerCharacter:: CurrentSpeed() + Object.PlatformerCharacter::Acceleration(), min(Object.PlatformerCharacter::MaxSpeed(), PixelPerfectMovement::SpeedToReach(Object.Behavior::PropertyTargetX() - Object.X(), Object.PlatformerCharacter::Deceleration())))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyTargetX()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "max(Object.PlatformerCharacter:: CurrentSpeed() - Object.PlatformerCharacter::Acceleration(), max(-Object.PlatformerCharacter::MaxSpeed(), PixelPerfectMovement::SpeedToReach(Object.Behavior::PropertyTargetX() - Object.X(), Object.PlatformerCharacter::Deceleration())))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + ">=", + "Object.Behavior::PropertyTargetX()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosX" + }, + "parameters": [ + "Object", + "<=", + "Object.Behavior::PropertyTargetX()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyOffsetX() + Object.Behavior::PropertyPixelSize() * round((Object.X() - Object.Behavior::PropertyOffsetX()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "PlatformBehavior::PlatformerObjectBehavior::SetCurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "0" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"X: \" + ToString(Object.X()) + \" Speed: \" + ToString(Object.PlatformerCharacter::CurrentSpeed())", + "", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Ladder", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PlatformBehavior::IsOnLadder" + }, + "parameters": [ + "Object", + "PlatformerCharacter" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Find how far to go to reach a pixel." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyOffsetY() + Object.Behavior::PropertyPixelSize() * ceil((Object.Y() - Object.Behavior::PropertyOffsetY()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.Y()) + \"-->\" + ToString(Object.Behavior::PropertyTargetY())", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.Behavior::PropertyOffsetY() + Object.Behavior::PropertyPixelSize() * floor((Object.Y() - Object.Behavior::PropertyOffsetY()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"Target: \" + ToString(Object.Y()) + \"-->\" + ToString(Object.Behavior::PropertyTargetY())", + "", + "" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to the target as the movement behavior would do." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Up\"" + ] + }, + { + "type": { + "inverted": true, + "value": "PlatformBehavior::PlatformerObjectBehavior::IsUsingControl" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "\"Down\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<", + "Object.Behavior::PropertyTargetY()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "Object.PlatformerCharacter::MaxSpeed() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">", + "Object.Behavior::PropertyTargetY()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.PlatformerCharacter::MaxSpeed() * TimeDelta()" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + ">=", + "Object.Behavior::PropertyTargetY()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::And" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PosY" + }, + "parameters": [ + "Object", + "<=", + "Object.Behavior::PropertyTargetY()" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::PropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "-1" + ] + } + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "=", + "Object.Behavior::PropertyOffsetY() + Object.Behavior::PropertyPixelSize() * round((Object.Y() - Object.Behavior::PropertyOffsetY()) / Object.Behavior::PropertyPixelSize())" + ] + }, + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyTargetDirectionY" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + }, + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "\"X: \" + ToString(Object.X()) + \" Speed: \" + ToString(Object.PlatformerCharacter::CurrentSpeed())", + "", + "" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectPlatformerCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "disabled": true, + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "!=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "!=", + "Object.PlatformerCharacter::MaxSpeed()" + ] + } + ], + "actions": [ + { + "type": { + "value": "DebuggerTools::ConsoleLog" + }, + "parameters": [ + "ToString(abs(Object.Behavior::PropertyPreviousSpeedX()) - Object.PlatformerCharacter::Deceleration() * TimeDelta() - abs(Object.PlatformerCharacter::CurrentSpeed()))", + "", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Check if the character is decelerating.\nIt's done in doStepPostEvent because there is no way to know if the doStepPreEvents of this behavior is executed before or after the one of PlatformerCharcter.\nAs TimeDelta is used, we have to be sure the last PlatformerCharcter.doStepPreEvents call used the same TimeDelta. Which means this must be done after PlatformerCharcter.doStepPreEvents." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "PlatformBehavior::CurrentSpeed" + }, + "parameters": [ + "Object", + "PlatformerCharacter", + "=", + "0" + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::CompareNumbers" + }, + "parameters": [ + "abs(Object.PlatformerCharacter::CurrentSpeed())", + "=", + "abs(Object.Behavior::PropertyPreviousSpeedX()) - Object.PlatformerCharacter::Deceleration() * TimeDelta()" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyIsDecelerating" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save the speed to detect speed changes from outside." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "PixelPerfectMovement::PixelPerfectPlatformerCharacter::SetPropertyPreviousSpeedX" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "Object.PlatformerCharacter::CurrentSpeed()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "PixelPerfectMovement::PixelPerfectPlatformerCharacter", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platformer character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "PlatformerCharacter" + }, + { + "value": "1", + "type": "Number", + "label": "Pixel size", + "description": "", + "group": "", + "extraInformation": [], + "name": "PixelSize" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset X", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetX" + }, + { + "value": "0", + "type": "Number", + "label": "Pixel grid offset Y", + "description": "", + "group": "", + "extraInformation": [], + "name": "OffsetY" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetX" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetDirectionX" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetY" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TargetDirectionY" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "PreviousSpeedX" + }, + { + "value": "", + "type": "Boolean", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsDecelerating" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "Input", + "extensionNamespace": "", + "fullName": "Multitouch joystick and buttons (sprite)", + "gdevelopVersion": "", + "helpPath": "/objects/multitouch-joystick", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iSWNvbnMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMzIgMzIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMyIDMyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9DQo8L3N0eWxlPg0KPGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTMiLz4NCjxwb2x5bGluZSBjbGFzcz0ic3QwIiBwb2ludHM9IjI4LjQsMTIgMjAsMTIgMjAsMy42ICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMjAsMjguNCAyMCwyMCAyOC40LDIwICIvPg0KPHBvbHlsaW5lIGNsYXNzPSJzdDAiIHBvaW50cz0iMy42LDIwIDEyLDIwIDEyLDI4LjQgIi8+DQo8cG9seWxpbmUgY2xhc3M9InN0MCIgcG9pbnRzPSIxMiwzLjYgMTIsMTIgMy42LDEyICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNiw2IDE2LjcsNyAxNS4zLDcgIi8+DQo8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjE2LDI2IDE1LjMsMjUgMTYuNywyNSAiLz4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNiwxNiA3LDE1LjMgNywxNi43ICIvPg0KPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyNiwxNiAyNSwxNi43IDI1LDE1LjMgIi8+DQo8L3N2Zz4NCg==", + "name": "SpriteMultitouchJoystick", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/Line Hero Pack/Master/SVG/Videogames/Videogames_controller_joystick_arrows_direction.svg", + "shortDescription": "Joysticks or buttons for touchscreens.", + "version": "1.2.2", + "description": [ + "Multitouch joysticks can be used the same way as physical gamepads:", + "- 4 or 8 directions", + "- Analogus pads", + "- Player selection", + "- Controls mapping for top-down movement and platformer characters", + "", + "There are ready-to-use joysticks in the asset-store [multitouch joysticks pack](https://editor.gdevelop.io/?initial-dialog=asset-store&asset-pack=multitouch-joysticks-multitouch-joysticks)." + ], + "origin": { + "identifier": "SpriteMultitouchJoystick", + "name": "gdevelop-extension-store" + }, + "tags": [ + "multitouch", + "joystick", + "thumbstick", + "controller", + "touchscreen", + "twin stick", + "shooter", + "virtual", + "platformer", + "platform", + "top-down" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1", + "1OgYzWp5UeVPbiWGJwI6vqfgZLC3", + "v0YRpdAnIucZFgiRCCecqVnGKno2", + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "description": "Check if a button is pressed on a gamepad.", + "fullName": "Multitouch controller button pressed", + "functionType": "Condition", + "name": "IsButtonPressed", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a button is released on a gamepad.", + "fullName": "Multitouch controller button released", + "functionType": "Condition", + "name": "IsButtonReleased", + "sentence": "Button _PARAM2_ of multitouch controller _PARAM1_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "\"Released\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "supplementaryInformation": "[\"A\",\"CROSS\",\"B\",\"CIRCLE\",\"X\",\"SQUARE\",\"Y\",\"TRIANGLE\",\"LB\",\"L1\",\"RB\",\"R1\",\"LT\",\"L2\",\"RT\",\"R2\",\"UP\",\"DOWN\",\"LEFT\",\"RIGHT\",\"BACK\",\"SHARE\",\"START\",\"OPTIONS\",\"CLICK_STICK_LEFT\",\"CLICK_STICK_RIGHT\",\"PS_BUTTON\",\"CLICK_TOUCHPAD\"]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Change a button state for a multitouch controller.", + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark _PARAM2_ button as _PARAM3_ for multitouch controller _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarSceneTxt" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Buttons[GetArgumentAsString(\"Button\")].State", + "=", + "GetArgumentAsString(\"ButtonState\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Button name", + "name": "Button", + "type": "string" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Action", + "name": "SetDeadZone", + "private": true, + "sentence": "Change the dead zone of multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone", + "=", + "GetArgumentAsNumber(\"DeadZoneRadius\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Dead zone radius", + "name": "DeadZoneRadius", + "supplementaryInformation": "[]", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the dead zone radius of a joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "Expression", + "name": "DeadZone", + "private": true, + "sentence": "Change multitouch joystick _PARAM2_ of multitouch controller _PARAM1_ dead zone to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].DeadZone)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom = 1, right = 2, top = 3) for an angle (in degrees).", + "fullName": "Angle to 4-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo4Way", + "private": true, + "sentence": "The angle _PARAM1_ 4-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 4 / 360), 4)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the direction index (left = 1, bottom-left = 1... top-left = 7) for an angle (in degrees).", + "fullName": "Angle to 8-way index", + "functionType": "ExpressionAndCondition", + "name": "AngleTo8Way", + "private": true, + "sentence": "The angle _PARAM1_ 8-way index", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "mod(round(GetArgumentAsNumber(\"Angle\") * 8 / 360), 8)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 4-way direction", + "functionType": "Condition", + "name": "IsAngleIn4WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 4-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo4Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if angle is in a given direction.", + "fullName": "Angle 8-way direction", + "functionType": "Condition", + "name": "IsAngleIn8WayDirection", + "private": true, + "sentence": "The angle _PARAM1_ is the 8-way direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Right\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "0", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "1", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Down\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "2", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"DownLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "3", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Left\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "4", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpLeft\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "5", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Up\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "6", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::CompareStrings" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"UpRight\"" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::AngleTo8Way" + }, + "parameters": [ + "", + "=", + "7", + "GetArgumentAsNumber(\"Angle\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Angle", + "name": "Angle", + "type": "expression" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ is pushed in direction _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the joystick has moved from center" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::JoystickForce" + }, + "parameters": [ + "", + ">", + "SpriteMultitouchJoystick::DeadZone(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsNumber(\"ControllerIdentifier\")", + "GetArgumentAsString(\"JoystickIdentifier\")", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "Joystick _PARAM2_ of multitouch controller _PARAM1_ force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the force of multitouch contoller stick (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "multitouch controller _PARAM1_ _PARAM2_ stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Stick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the percentage the thumb has been pulled away from the joystick center (Range: 0 to 1).", + "fullName": "Joystick force", + "functionType": "Action", + "name": "SetJoystickForce", + "private": true, + "sentence": "Change the force of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Force", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::StickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the multitouch controller stick is pointing towards (Range: -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Variable(__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle)" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the angle of the joystick _PARAM2_ of multitouch controller _PARAM1_ to _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarScene" + }, + "parameters": [ + "__MultitouchJoystick.Controllers[GetArgumentAsNumber(\"ControllerIdentifier\")].Joystick[GetArgumentAsString(\"JoystickIdentifier\")].Angle", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "type": "string" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::JoystickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\")) * cos(ToRad(SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Return the multitouch contoller stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "SpriteMultitouchJoystick::JoystickForce(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\")) * sin(ToRad(SpriteMultitouchJoystick::JoystickAngle(GetArgumentAsNumber(\"ControllerIdentifier\"), GetArgumentAsString(\"JoystickIdentifier\"))))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Multitouch controller identifier (1, 2, 3, 4...)", + "name": "ControllerIdentifier", + "type": "expression" + }, + { + "description": "Joystick name", + "name": "JoystickIdentifier", + "supplementaryInformation": "[\"Primary\",\"Secondary\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [ + { + "description": "Joystick that can be controlled by interacting with a touchscreen.", + "fullName": "Multitouch Joystick", + "name": "MultitouchJoystick", + "objectType": "", + "private": true, + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetDeadZone" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyDeadZoneRadius()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasGameJustResumed" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Manage touches", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move thumb back to center when not being pressed (acts like a spring on a real controller)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::Reset" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Update joystick position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))", + "AngleBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0))" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "clamp(2 * DistanceBetweenPositions(Object.CenterX(), Object.CenterY(), TouchX(Object.Behavior::PropertyTouchId(), Object.Layer(), 0), TouchY(Object.Behavior::PropertyTouchId(), Object.Layer(), 0)) / Object.Width(), 0, 1)", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickForce", + "name": "SetJoystickForce", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickForce()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Expression", + "name": "JoystickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the angle the joystick is pointing towards (Range: -180 to 180).", + "fullName": "Joystick angle", + "functionType": "Action", + "name": "SetJoystickAngle", + "private": true, + "sentence": "Change the joystick angle of _PARAM0_ to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickAngle" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SetJoystickAngle" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "Object.Behavior::PropertyJoystickAngle()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Angle", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "Expression", + "name": "StickForceX", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * cos(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Return the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "Expression", + "name": "StickForceY", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::JoystickForce() * sin(ToRad(Object.Behavior::JoystickAngle()))" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn4WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + ">", + "Object.Behavior::PropertyDeadZoneRadius()" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::IsAngleIn8WayDirection" + }, + "parameters": [ + "", + "Object.Behavior::JoystickAngle()", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a joystick is pressed.", + "fullName": "Joystick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Joystick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the joystick values (except for angle, which stays the same)", + "fullName": "Reset", + "functionType": "Action", + "name": "Reset", + "private": true, + "sentence": "Reset the joystick of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickForce" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier.", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyControllerIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Object.Behavior::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyJoystickIdentifier" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius (range: 0 to 1) of the joystick. The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Object.Behavior::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetPropertyDeadZoneRadius" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Value\")" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchJoystick", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "String", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick angle (range: -180 to 180)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickAngle" + }, + { + "value": "0", + "type": "Number", + "label": "Joystick force (range: 0 to 1)", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "JoystickForce" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Detect button presses made on a touchscreen.", + "fullName": "Multitouch button", + "name": "MultitouchButton", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "no" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Idle\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex()), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "StartedTouchOrMouseId(Object.Behavior::PropertyTouchIndex())" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Pressed\"", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchIndex" + }, + "parameters": [ + "Object", + "Behavior", + "+", + "1" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::IsPressed" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "Object.Behavior::PropertyTouchId()" + ] + } + ], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetButtonState" + }, + "parameters": [ + "Object", + "Behavior", + "\"Released\"", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::SetPropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is released.", + "fullName": "Button released", + "functionType": "Condition", + "name": "IsReleased", + "sentence": "Button _PARAM0_ is released", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyIsReleased" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if button is pressed.", + "fullName": "Button pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Button _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchButton::PropertyTouchId" + }, + "parameters": [ + "Object", + "Behavior", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Button state", + "functionType": "Action", + "name": "SetButtonState", + "private": true, + "sentence": "Mark the button _PARAM0_ as _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SetButtonState" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyButtonIdentifier()", + "GetArgumentAsString(\"ButtonState\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::MultitouchButton", + "type": "behavior" + }, + { + "description": "Button state", + "name": "ButtonState", + "supplementaryInformation": "[\"Idle\",\"Pressed\",\"Released\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Button identifier", + "description": "", + "group": "", + "extraInformation": [], + "name": "ButtonIdentifier" + }, + { + "value": "0", + "type": "Number", + "label": "TouchID", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIndex" + }, + { + "value": "", + "type": "Boolean", + "label": "Button released", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "IsReleased" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a platformer character with a multitouch controller.", + "fullName": "Platformer multitouch controller mapper", + "name": "PlatformerMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "Property" + ] + }, + { + "type": { + "value": "PlatformBehavior::SimulateLadderKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsButtonPressed" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJumpButton()", + "\"Down\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "PlatformBehavior::SimulateJumpKey" + }, + "parameters": [ + "Object", + "Property" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::PlatformerMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Platform character behavior", + "description": "", + "group": "", + "extraInformation": [ + "PlatformBehavior::PlatformerObjectBehavior" + ], + "name": "Property" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "Controls", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "A", + "type": "String", + "label": "Jump button name", + "description": "", + "group": "Controls", + "extraInformation": [], + "name": "JumpButton" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Control a top-down character with a multitouch controller.", + "fullName": "Top-down multitouch controller mapper", + "name": "TopDownMultitouchMapper", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Analog\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "SpriteMultitouchJoystick::StickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"360°\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateStick" + }, + "parameters": [ + "Object", + "TopDownMovement", + "SpriteMultitouchJoystick::StickAngle(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier())", + "sign(SpriteMultitouchJoystick::StickForce(Object.Behavior::PropertyControllerIdentifier(), Object.Behavior::PropertyJoystickIdentifier()))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::TopDownMultitouchMapper::PropertyStickMode" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"8 Directions\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "TopDownMovementBehavior::DiagonalsAllowed" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Left\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Right\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Up\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"Down\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"UpRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateUpKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownLeft\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateLeftKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "", + "Object.Behavior::PropertyControllerIdentifier()", + "Object.Behavior::PropertyJoystickIdentifier()", + "\"DownRight\"", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "TopDownMovementBehavior::SimulateDownKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + }, + { + "type": { + "value": "TopDownMovementBehavior::SimulateRightKey" + }, + "parameters": [ + "Object", + "TopDownMovement" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "SpriteMultitouchJoystick::TopDownMultitouchMapper", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Top-down movement behavior", + "description": "", + "group": "", + "extraInformation": [ + "TopDownMovementBehavior::TopDownMovementBehavior" + ], + "name": "TopDownMovement" + }, + { + "value": "1", + "type": "Number", + "label": "Controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "Analog", + "type": "Choice", + "label": "Stick mode", + "description": "", + "group": "Controls", + "extraInformation": [ + "Analog", + "360°", + "8 Directions" + ], + "name": "StickMode" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [ + { + "areaMaxX": 64, + "areaMaxY": 64, + "areaMaxZ": 64, + "areaMinX": 0, + "areaMinY": 0, + "areaMinZ": 0, + "defaultName": "Joystick", + "description": "Joystick for touchscreens.", + "fullName": "Multitouch Joystick", + "isUsingLegacyInstancesRenderer": true, + "name": "SpriteMultitouchJoystick", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Border", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "Create" + }, + "parameters": [ + "", + "Thumb", + "0", + "0", + "" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Border", + "=", + "1" + ] + }, + { + "type": { + "value": "ChangePlan" + }, + "parameters": [ + "Thumb", + "=", + "2" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Border", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SetCenter" + }, + "parameters": [ + "Thumb", + "=", + "0", + "=", + "0" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + }, + { + "type": { + "value": "SetIncludedInParentCollisionMask" + }, + "parameters": [ + "Thumb", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreAutour" + }, + "parameters": [ + "Thumb", + "Border", + "Border.MultitouchJoystick::JoystickForce() * Border.Width() / 2", + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onHotReloading", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::SpriteMultitouchJoystick::UpdateConfiguration" + }, + "parameters": [ + "Object", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Pass the object property values to the behavior.", + "fullName": "Update configuration", + "functionType": "Action", + "name": "UpdateConfiguration", + "private": true, + "sentence": "Update the configuration of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyControllerIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyJoystickIdentifier()", + "" + ] + }, + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "Object.PropertyDeadZoneRadius()", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "De/activate control of the joystick.", + "fullName": "De/activate control", + "functionType": "Action", + "name": "ActivateControl", + "sentence": "Activate control of _PARAM0_: _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShouldActivate\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Activate", + "name": "ShouldActivate", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "description": "Check if a stick is pressed.", + "fullName": "Stick pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "Stick _PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsPressed" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "!=" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick force (from 0 to 1).", + "fullName": "Joystick force (deprecated)", + "functionType": "ExpressionAndCondition", + "name": "JoystickForce", + "private": true, + "sentence": "the joystick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the strick force (from 0 to 1).", + "fullName": "Stick force", + "functionType": "ExpressionAndCondition", + "name": "StickForce", + "sentence": "the stick force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickForce()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on X axis (from -1 at the left to 1 at the right).", + "fullName": "Stick X force", + "functionType": "ExpressionAndCondition", + "name": "StickForceX", + "sentence": "the stick X force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceX()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the stick force on Y axis (from -1 at the top to 1 at the bottom).", + "fullName": "Stick Y force", + "functionType": "ExpressionAndCondition", + "name": "StickForceY", + "sentence": "the stick Y force", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::StickForceY()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the joystick is pointing towards (from -180 to 180).", + "fullName": "Joystick angle (deprecated)", + "functionType": "Expression", + "name": "JoystickAngle", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Return the angle the stick is pointing towards (from -180 to 180).", + "fullName": "Stick angle", + "functionType": "Expression", + "name": "StickAngle", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::JoystickAngle()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (4-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed4Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed4Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "Check if joystick is pushed in a given direction.", + "fullName": "Joystick pushed in a direction (8-way movement)", + "functionType": "Condition", + "name": "IsDirectionPushed8Way", + "sentence": "_PARAM0_ is pushed in direction _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::IsDirectionPushed8Way" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "GetArgumentAsString(\"Direction\")", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + }, + { + "description": "Direction", + "name": "Direction", + "supplementaryInformation": "[\"Up\",\"Down\",\"Left\",\"Right\",\"UpLeft\",\"UpRight\",\"DownLeft\",\"DownRight\"]", + "type": "stringWithSelector" + } + ], + "objectGroups": [] + }, + { + "description": "the multitouch controller identifier (1, 2, 3, 4...).", + "fullName": "Multitouch controller identifier", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "ControllerIdentifier", + "sentence": "the multitouch controller identifier", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyControllerIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "ControllerIdentifier", + "name": "SetControllerIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetControllerIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the joystick name of the object.", + "fullName": "Joystick name", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "JoystickIdentifier", + "sentence": "the joystick name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyJoystickIdentifier()" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "JoystickIdentifier", + "name": "SetJoystickIdentifier", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetJoystickIdentifier" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsString(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "description": "the dead zone radius of the joystick (range: 0 to 1). The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved).", + "fullName": "Dead zone radius", + "functionType": "ExpressionAndCondition", + "group": "Multitouch Joystick configuration", + "name": "DeadZoneRadius", + "sentence": "the dead zone radius", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "Border.MultitouchJoystick::PropertyDeadZoneRadius()" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "DeadZoneRadius", + "name": "SetDeadZoneRadius", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SpriteMultitouchJoystick::MultitouchJoystick::SetDeadZoneRadius" + }, + "parameters": [ + "Border", + "MultitouchJoystick", + "=", + "GetArgumentAsNumber(\"Value\")", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "SpriteMultitouchJoystick::SpriteMultitouchJoystick", + "type": "object" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Multitouch controller identifier (1, 2, 3, 4...)", + "description": "", + "group": "", + "extraInformation": [], + "name": "ControllerIdentifier" + }, + { + "value": "Primary", + "type": "Choice", + "label": "Joystick name", + "description": "", + "group": "", + "extraInformation": [ + "Primary", + "Secondary" + ], + "name": "JoystickIdentifier" + }, + { + "value": "0.4", + "type": "Number", + "label": "Dead zone radius (range: 0 to 1)", + "description": "The deadzone is an area for which movement on sticks won't be taken into account (instead, the stick will be considered as not moved)", + "group": "", + "extraInformation": [], + "name": "DeadZoneRadius" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbAnchorOrigin" + }, + { + "value": "Center-center", + "type": "Number", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ThumbAnchorTarget" + }, + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [ + "Thumb" + ], + "hidden": true, + "name": "ThumbIsScaledProportionally" + }, + { + "value": "Center-center", + "type": "String", + "label": "", + "description": "Only used by the scene editor.", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ParentOrigin" + } + ], + "objects": [ + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Thumb", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + }, + { + "adaptCollisionMaskAutomatically": false, + "assetStoreId": "", + "name": "Border", + "type": "Sprite", + "updateIfNotVisible": false, + "variables": [], + "effects": [], + "behaviors": [ + { + "name": "MultitouchJoystick", + "type": "SpriteMultitouchJoystick::MultitouchJoystick", + "ControllerIdentifier": 1, + "JoystickIdentifier": "Primary", + "FloatingEnabled": false, + "DeadZoneRadius": 0.4, + "JoystickAngle": 0, + "JoystickForce": 0, + "TouchId": 0, + "TouchIndex": 0 + } + ], + "animations": [ + { + "name": "Idle", + "useMultipleDirections": false, + "directions": [ + { + "looping": false, + "timeBetweenFrames": 0.08, + "sprites": [] + } + ] + } + ] + } + ], + "objectsFolderStructure": { + "folderName": "__ROOT", + "children": [ + { + "objectName": "Thumb" + }, + { + "objectName": "Border" + } + ] + }, + "objectsGroups": [], + "layers": [ + { + "ambientLightColorB": 200, + "ambientLightColorG": 200, + "ambientLightColorR": 200, + "camera3DFarPlaneDistance": 10000, + "camera3DFieldOfView": 45, + "camera3DNearPlaneDistance": 3, + "cameraType": "", + "followBaseLayerCamera": false, + "isLightingLayer": false, + "isLocked": false, + "name": "", + "renderingType": "", + "visibility": true, + "cameras": [ + { + "defaultSize": true, + "defaultViewport": true, + "height": 0, + "viewportBottom": 1, + "viewportLeft": 0, + "viewportRight": 1, + "viewportTop": 0, + "width": 0 + } + ], + "effects": [] + } + ], + "instances": [] + } + ] + }, + { + "author": "Westboy31", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Flash and transition painter", + "gdevelopVersion": "", + "helpPath": "", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLW1vdmllLWZpbHRlciIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOCA0TDIwIDdIMTdMMTUgNEgxM0wxNSA3SDEyTDEwIDRIOEwxMCA3SDdMNSA0SDRDMi45IDQgMiA0LjkgMiA2TDIgMThDMiAxOS4xIDIuOSAyMCA0IDIwSDIwQzIxLjEgMjAgMjIgMTkuMSAyMiAxOFY0SDE4TTExLjI1IDE1LjI1TDEwIDE4TDguNzUgMTUuMjVMNiAxNEw4Ljc1IDEyLjc1TDEwIDEwTDExLjI1IDEyLjc1TDE0IDE0TDExLjI1IDE1LjI1TTE2Ljk0IDExLjk0TDE2IDE0TDE1LjA2IDExLjk0TDEzIDExTDE1LjA2IDEwLjA2TDE2IDhMMTYuOTQgMTAuMDZMMTkgMTFMMTYuOTQgMTEuOTRaIiAvPjwvc3ZnPg==", + "name": "FlashTransitionPainter", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/movie-filter.svg", + "shortDescription": "Behavior for shape painter allows you to paint a color all over the screen for period of time with an effect (useful for simulate flash and transition effect).", + "version": "0.1.0", + "description": [ + "* __Paint effect:__Action to paint a color all over the screen for a period of time with specific effect.", + "effect type:", + " * __Flash:__ is a monochrome color appear with fade then disappear with fade out.", + " * __Vertical:__ is a monochrome color comes from right side then comes back.", + " * __Horizontal:__ is a monochrome color come from top side then comes back.", + " * __Circular:__ is a circle which increases from the center and narrows.", + "* __Paint effect ended:__ event when the paint effect ends." + ], + "origin": { + "identifier": "FlashTransitionPainter", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shape painter", + "flash", + "transition", + "effect" + ], + "authorIds": [], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Paint all over the screen a color for a period of time.", + "fullName": "Flash and transition painter", + "name": "FlashTransitionPainter", + "objectType": "PrimitiveDrawing::Drawer", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Disable effect when the game starts." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + }, + { + "type": { + "value": "PauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Avoid default parameter of painter that could make the extension doesn't work." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "PrimitiveDrawing::ClearBetweenFrames" + }, + "parameters": [ + "Object", + "yes" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::OutlineSize" + }, + "parameters": [ + "Object", + "=", + "0" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + }, + { + "type": { + "value": "UnPauseObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialise position of painter. \nIncrement or decrement \"_TimeProgressionEffect\" depending on direction." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "MettreXY" + }, + "parameters": [ + "Object", + "=", + "CameraX(Object.Layer(),0) - SceneWindowWidth()/2", + "=", + "CameraY(Object.Layer(),0) - SceneWindowHeight()/2" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillColor" + }, + "parameters": [ + "Object", + "Object.Behavior::PropertyColor()" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "+", + "(TimeDelta() / Object.Behavior::PropertyTimer())*Object.Variable(__FlashTransitionPainter_ReverseDirection)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Here this the paints functions of different effect depending on the type chosen by the user.\nDetect the direction of the animation and its end." + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 1 : flash effect. " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Flash\"" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + ">=", + "Object.Behavior::PropertyMaxOpacity()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "=", + "lerp(0, Object.Behavior::PropertyMaxOpacity(), Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_OpacityFlash)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "CameraX(Object.Layer(),0) - SceneWindowWidth()/2", + "CameraY(Object.Layer(),0) - SceneWindowHeight()/2", + "SceneWindowWidth()", + "SceneWindowHeight()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 2 : screen come from top then return." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Horizontal\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + ">=", + "SceneWindowWidth()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "10" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "=", + "lerp(0,SceneWindowWidth(),Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "0", + "Object.Variable(__FlashTransitionPainter_ProgressiveWidth) + Object.Variable(__FlashTransitionPainter_SmoothEdge)", + "SceneWindowHeight()" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 3 : screen come from left then return." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Vertical\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + ">=", + "SceneWindowHeight()" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "10" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveHeight", + "=", + "lerp(0,SceneWindowHeight(),Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Rectangle" + }, + "parameters": [ + "Object", + "0", + "0", + "SceneWindowWidth()", + "Object.Variable(__FlashTransitionPainter_ProgressiveHeight) + Object.Variable(__FlashTransitionPainter_SmoothEdge)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Type 4 : a circle scale up from the middle then scale down." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Circular\"" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + ">=", + "(sqrt (pow(SceneWindowHeight(),2) + pow(SceneWindowWidth(),2) )) /2 " + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "<", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ProgressiveWidth", + "=", + "lerp(0,(sqrt (pow(SceneWindowHeight(),2) + pow(SceneWindowWidth(),2) ))/2 ,Object.Variable(__FlashTransitionPainter_TimeProgressionEffect))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "5", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdge", + "-", + "0.2" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_SmoothEdgeOpacity", + "+", + "51" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::FillOpacity" + }, + "parameters": [ + "Object", + "=", + "Object.Variable(__FlashTransitionPainter_SmoothEdgeOpacity)" + ] + }, + { + "type": { + "value": "PrimitiveDrawing::Circle" + }, + "parameters": [ + "Object", + "SceneWindowWidth()/2", + "SceneWindowHeight()/2", + "Object.Variable(__FlashTransitionPainter_ProgressiveWidth) + Object.Variable(__FlashTransitionPainter_SmoothEdge)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The repeat 5 times is used to have clean and smooth edges , especially for circle.\n" + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset variables." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_OpacityFlash", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Paint Effect.", + "fullName": "Paint Effect", + "functionType": "Action", + "name": "PaintEffect", + "sentence": "Paint effect type _PARAM4_ of _PARAM0_ with direction _PARAM5_ and color _PARAM2_ for _PARAM3_ seconds", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initialise all variables and then activate the behavior.\nIf user doesn't assign value to color and type , we take the last value registred.\nIf user doesn't assign value to timer we take a default value (0.2)." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + }, + { + "type": { + "inverted": true, + "value": "BehaviorActivated" + }, + "parameters": [ + "Object", + "Behavior" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Timer\") + (3*TimeDelta())" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Direction\")" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Type\")", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyType" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Type\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Color\")", + "!=", + "\"\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyColor" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsString(\"Color\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "0.2" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Both\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyTimer" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"Timer\")/2 + (3*TimeDelta())" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StrEqual" + }, + "parameters": [ + "GetArgumentAsString(\"Direction\")", + "=", + "\"Backward\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_ReverseDirection", + "=", + "-1" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__FlashTransitionPainter_TimeProgressionEffect", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "GetArgumentAsNumber(\"MaxOpacity\")", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::SetPropertyMaxOpacity" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "GetArgumentAsNumber(\"MaxOpacity\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ActivateBehavior" + }, + "parameters": [ + "Object", + "Behavior", + "yes" + ] + } + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + }, + { + "description": "Color", + "name": "Color", + "type": "color" + }, + { + "description": "Duration", + "name": "Timer", + "type": "expression" + }, + { + "description": "Type of effect ", + "name": "Type", + "supplementaryInformation": "[\"Flash\",\"Horizontal\",\"Vertical\",\"Circular\"]", + "type": "stringWithSelector" + }, + { + "description": "Direction transition", + "name": "Direction", + "supplementaryInformation": "[\"Both\",\"Forward\",\"Backward\"]", + "type": "stringWithSelector" + }, + { + "description": "End opacity (only for flash)", + "name": "MaxOpacity", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Paint effect ended.", + "fullName": "Paint effect ended ", + "functionType": "Condition", + "name": "PaintEffectIsEnd", + "sentence": "When paint effect of _PARAM0_ ends", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect when the animation ends with a timer which is initialised in PaintEffect function." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Backward\"" + ] + }, + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Forward\"" + ] + } + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"", + "Object.Behavior::PropertyTimer() - (3*TimeDelta())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "FlashTransitionPainter::FlashTransitionPainter::PropertyDirection" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Both\"" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__FlashTransitionPainter_timerEffect\"", + "Object.Behavior::PropertyTimer()*2 - (3*TimeDelta())" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "PrimitiveDrawing::Drawer", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "FlashTransitionPainter::FlashTransitionPainter", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "1", + "type": "Number", + "label": "Timer", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Timer" + }, + { + "value": "255;255;255", + "type": "String", + "label": "Color", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Color" + }, + { + "value": "", + "type": "String", + "label": "Type of effect ", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Type" + }, + { + "value": "", + "type": "String", + "label": "Direction of transition", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Direction" + }, + { + "value": "255", + "type": "Number", + "label": "The maximum of the opacity only for flash", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MaxOpacity" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "Tristan Rhodes (https://victrisgames.itch.io/)", + "category": "Visual effect", + "extensionNamespace": "", + "fullName": "Shake object", + "gdevelopVersion": "", + "helpPath": "https://victrisgames.itch.io/gdevelop-camera-shake-example", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWFycm93LWFsbCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMywxMUgxOEwxNi41LDkuNUwxNy45Miw4LjA4TDIxLjg0LDEyTDE3LjkyLDE1LjkyTDE2LjUsMTQuNUwxOCwxM0gxM1YxOEwxNC41LDE2LjVMMTUuOTIsMTcuOTJMMTIsMjEuODRMOC4wOCwxNy45Mkw5LjUsMTYuNUwxMSwxOFYxM0g2TDcuNSwxNC41TDYuMDgsMTUuOTJMMi4xNiwxMkw2LjA4LDguMDhMNy41LDkuNUw2LDExSDExVjZMOS41LDcuNUw4LjA4LDYuMDhMMTIsMi4xNkwxNS45Miw2LjA4TDE0LjUsNy41TDEzLDZWMTFaIiAvPjwvc3ZnPg==", + "name": "ShakeObject", + "previewIconUrl": "https://resources.gdevelop-app.com/assets/Icons/arrow-all.svg", + "shortDescription": "Shake an object.", + "version": "1.5.6", + "description": [ + "Shake an object (position, angle or scale).", + "", + "It can be used for:", + "- Hit or impact", + "- Object slowly rocking back and forth (like a ship)", + "- Simulate engine vibration, earthquake, or pulsing", + "", + "The top-down RPG example uses this extension for damage animations ([open the project online](https://editor.gdevelop.io/?project=example://top-down-rpg))." + ], + "origin": { + "identifier": "ShakeObject", + "name": "gdevelop-extension-store" + }, + "tags": [ + "shaking", + "object", + "effect", + "shake", + "scale", + "position", + "rotate", + "angle" + ], + "authorIds": [ + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle).\nThis behavior can be used on any type of object.", + "fullName": "Shake object (position, angle)", + "name": "ShakeObject_PositionAngle", + "objectType": "", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle). Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters. ", + "fullName": "Shake object (position, angle)", + "functionType": "Action", + "name": "ShakeObject_PositionAngle", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_. Wait _PARAM6_ seconds between shakes. Keep shaking until stopped: _PARAM7_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5) ", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "longDescription": "Use a negative number to make the single-shake move in the opposite direction.", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "longDescription": "For a single-shake effect, set it to the same value as \"Duration\".", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 *(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop any shaking of object that was initiated by the Shake Object extension.", + "fullName": "Stop shaking the object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngle::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngle", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + }, + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale)\nThis behavior can only be used on sprite objects.", + "fullName": "Shake object (position, angle, scale)", + "name": "ShakeObject_PositionAngleScale", + "objectType": "Sprite", + "eventsFunctions": [ + { + "description": "Shake an object, using one or more ways to shake (position, angle, scale). Make sure to \"Stop shaking\" before starting a new shake if it uses different parameters.", + "fullName": "Shake object (position, angle, scale)", + "functionType": "Action", + "name": "ShakeObject_PositionAngleScale", + "sentence": "Shake object _PARAM0_ for _PARAM2_ seconds. Modify position amplitude _PARAM3_ on X axis and _PARAM4_ on Y axis, angle rotation amplitude _PARAM5_, and scale amplitude _PARAM6_. Wait _PARAM7_ seconds between shakes. Keep shaking until stopped: _PARAM8_", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Start/Reset duration timer" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Pass input parameters to global variables so that onScenePostEvents can use them" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "GetArgumentAsNumber(\"Duration\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "=", + "GetArgumentAsNumber(\"PowerX\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "=", + "GetArgumentAsNumber(\"PowerY\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "=", + "GetArgumentAsNumber(\"PowerAngle\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "=", + "GetArgumentAsNumber(\"PowerScale\")" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "GetArgumentAsNumber(\"TimeBetweenShakes\")" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Determine if the shake should keep going until stopped" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "False" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "GetArgumentAsBoolean" + }, + "parameters": [ + "\"ShakeForever\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Add default values if none were provided" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "0.5" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_TimeBetweenShakes", + "=", + "0.08" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "If duration is less than a single shake, increase duration to make 1 full shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "<", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Detect initial shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Initiate the onScenePostEvents function" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + }, + { + "description": "Duration of shake (in seconds) (Default: 0.5)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Amplitude of postion shake in X direction (in pixels) (For example: 5)", + "name": "PowerX", + "type": "expression" + }, + { + "description": "Amplitude of position shake in Y direction (in pixels) (For example: 5)", + "longDescription": "Use a negative number to make the single-shake move in the opposite direction.", + "name": "PowerY", + "type": "expression" + }, + { + "description": "Amplitude of angle rotation shake (in degrees) (For example: 5)", + "name": "PowerAngle", + "type": "expression" + }, + { + "description": "Amplitude of scale shake (in percent change) (For example: 5)", + "name": "PowerScale", + "type": "expression" + }, + { + "description": "Amount of time between shakes (in seconds) (Default: 0.08)", + "longDescription": "For a single-shake effect, set it to the same value as \"Duration\".", + "name": "TimeBetweenShakes", + "type": "expression" + }, + { + "description": "Keep shaking until stopped", + "longDescription": "Duration value will be ignored", + "name": "ShakeForever", + "type": "yesorno" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPostEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Shake Object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Start shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Keep object shaking forever (if desired)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectVariableAsBoolean" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeForever", + "True" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_Duration", + "=", + "100" + ] + }, + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Calculate movement of the shake", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Run once before every shake movement" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + }, + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "ResetObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "+", + "1" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "folded": true, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Position Shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "PositionDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * [-1 or 1]" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make initial shake NOT random so users can set a direction for a one-shake effect" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "1" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "After initial shake pick a random direction" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementX", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerX) * RandomWithStep(-1, 1, 2)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementY", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerY) * RandomWithStep(-1, 1, 2)" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Rotation (angle) shake " + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"even\" shake, rotate clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, rotate counter-clockwise" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "AngleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementAngle", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerAngle)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate Scale shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate object scale displacement, with linear decay over time" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every even shake, increase scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "-1 * (Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Every \"odd\" shake, decrease scale" + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "ScaleDisplacement = -1 * (DesiredDuration - RunningTimer) / DesiredDuration * Amplitude * 1/100" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "mod(Object.Variable(__ShakeObject_ShakeCounter),2)", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementScale", + "=", + "(Object.Variable(__ShakeObject_Duration) - Object.ObjectTimerElapsedTime(\"__ShakeObject_DurationTimer\")) / Object.Variable(__ShakeObject_Duration) * Object.Variable(__ShakeObject_PowerScale) * (1/100)" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save that initial shake has been processed" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_InitialShake", + "=", + "0" + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Move object", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Calculate the fraction of shake that occured during this frame" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PercentTimeElapsedThisFrame", + "=", + "min(1,TimeDelta()/Object.Variable(__ShakeObject_TimeBetweenShakes))" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Increase change for the first half of the shake (move away from original values)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "+", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Decrease change the second half of the shake (return to original position)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_ShakeTimer\"", + "Object.Variable(__ShakeObject_TimeBetweenShakes)/2" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change position" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementX) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementY) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change angle" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerAngle)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementAngle) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Change scale" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "Egal" + }, + "parameters": [ + "Object.Variable(__ShakeObject_PowerScale)", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Save movement to calculate drift" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "-", + "round(1024 * Object.Variable(__ShakeObject_DisplacementScale) * Object.Variable(__ShakeObject_PercentTimeElapsedThisFrame)) / 1024" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Stop shaking", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Stop shaking when the duration has been reached (or if the stop shaking function was called)" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ObjectTimer" + }, + "parameters": [ + "Object", + "\"__ShakeObject_DurationTimer\"", + "Object.Variable(__ShakeObject_Duration)" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + }, + { + "type": { + "value": "BuiltinCommonInstructions::Once" + }, + "parameters": [] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeCounter", + "=", + "0" + ] + } + ], + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Correct for drift and reset drift tracking variables", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Move to correct any drift from previous shake" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerX", + "!=", + "0" + ] + }, + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerY", + "!=", + "0" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "MettreX" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledX)" + ] + }, + { + "type": { + "value": "MettreY" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_DisplacementTravelledY)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerAngle", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetAngle" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_AngleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_PowerScale", + "!=", + "0" + ] + } + ], + "actions": [ + { + "type": { + "value": "ChangeScale" + }, + "parameters": [ + "Object", + "-", + "Object.Variable(__ShakeObject_ScaleTravelled)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Reset drift detection variables" + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledX", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_DisplacementTravelledY", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_AngleTravelled", + "=", + "0" + ] + }, + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ScaleTravelled", + "=", + "0" + ] + } + ] + } + ], + "parameters": [] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Stop shaking an object.", + "fullName": "Stop shaking an object", + "functionType": "Action", + "name": "StopShaking", + "sentence": "Stop shaking _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ShakeObject::ShakeObject_PositionAngleScale::IsShaking" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "ModVarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "-1" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if an object is shaking.", + "fullName": "Check if an object is shaking", + "functionType": "Condition", + "name": "IsShaking", + "sentence": "_PARAM0_ is shaking", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "VarObjet" + }, + "parameters": [ + "Object", + "__ShakeObject_ShakeInProgress", + "=", + "1" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ShakeObject::ShakeObject_PositionAngleScale", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + }, + { + "author": "", + "category": "User interface", + "extensionNamespace": "", + "fullName": "Button states and effects", + "gdevelopVersion": ">=5.5.222", + "helpPath": "/objects/button", + "iconUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0ibWRpLWdlc3R1cmUtdGFwLWJ1dHRvbiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMyA1QzE1LjIxIDUgMTcgNi43OSAxNyA5QzE3IDEwLjUgMTYuMiAxMS43NyAxNSAxMi40NlYxMS4yNEMxNS42MSAxMC42OSAxNiA5Ljg5IDE2IDlDMTYgNy4zNCAxNC42NiA2IDEzIDZTMTAgNy4zNCAxMCA5QzEwIDkuODkgMTAuMzkgMTAuNjkgMTEgMTEuMjRWMTIuNDZDOS44IDExLjc3IDkgMTAuNSA5IDlDOSA2Ljc5IDEwLjc5IDUgMTMgNU0yMCAyMC41QzE5Ljk3IDIxLjMyIDE5LjMyIDIxLjk3IDE4LjUgMjJIMTNDMTIuNjIgMjIgMTIuMjYgMjEuODUgMTIgMjEuNTdMOCAxNy4zN0w4Ljc0IDE2LjZDOC45MyAxNi4zOSA5LjIgMTYuMjggOS41IDE2LjI4SDkuN0wxMiAxOFY5QzEyIDguNDUgMTIuNDUgOCAxMyA4UzE0IDguNDUgMTQgOVYxMy40N0wxNS4yMSAxMy42TDE5LjE1IDE1Ljc5QzE5LjY4IDE2LjAzIDIwIDE2LjU2IDIwIDE3LjE0VjIwLjVNMjAgMkg0QzIuOSAyIDIgMi45IDIgNFYxMkMyIDEzLjExIDIuOSAxNCA0IDE0SDhWMTJMNCAxMkw0IDRIMjBMMjAgMTJIMThWMTRIMjBWMTMuOTZMMjAuMDQgMTRDMjEuMTMgMTQgMjIgMTMuMDkgMjIgMTJWNEMyMiAyLjkgMjEuMTEgMiAyMCAyWiIgLz48L3N2Zz4=", + "name": "ButtonStates", + "previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/753a9a794bd885058159b7509f06f5a8f67f72decfccb9a1b0efee26f41c3c4c_gesture-tap-button.svg", + "shortDescription": "Use any object as a button and change appearance according to user interactions.", + "version": "1.3.0", + "description": [ + "Use the \"Button states\" behavior to track user interactions with an object, including:", + "", + "- Hovered", + "- Pressed", + "- Clicked", + "- Idle", + "", + "Add additional behaviors to make juicy buttons with animated responses to user input:", + "", + "- Size", + "- Color", + "- Animation", + "- Object effects" + ], + "origin": { + "identifier": "ButtonStates", + "name": "gdevelop-extension-store" + }, + "tags": [ + "ui", + "button" + ], + "authorIds": [ + "IWykYNRvhCZBN3vEgKEbBPOR3Oc2", + "gqDaZjCfevOOxBYkK6zlhtZnXCg1" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [], + "eventsBasedBehaviors": [ + { + "description": "Use objects as buttons.", + "fullName": "Button states", + "name": "ButtonFSM", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Finite state machine", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "The \"Validated\" state only last one frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Check position", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Make sure the cursor position is only checked once per frame." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "ShouldCheckHovering", + "True", + "" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "MouseOnlyCursorX(Object.Layer(), 0)", + "MouseOnlyCursorY(Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Comment", + "color": { + "b": 109, + "g": 230, + "r": 255, + "textB": 0, + "textG": 0, + "textR": 0 + }, + "comment": "Touches are always pressed, so ShouldCheckHovering doesn't matter." + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "False", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TouchId", + "!=", + "0" + ] + }, + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(TouchId, Object.Layer(), 0)", + "TouchY(TouchId, Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch start", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasAnyTouchOrMouseStarted" + }, + "parameters": [ + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Repeat", + "repeatExpression": "StartedTouchOrMouseCount()", + "conditions": [], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "CollisionPoint" + }, + "parameters": [ + "Object", + "TouchX(StartedTouchOrMouseId(Index), Object.Layer(), 0)", + "TouchY(StartedTouchOrMouseId(Index), Object.Layer(), 0)" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "StartedTouchOrMouseId(Index)" + ] + }, + { + "type": { + "value": "SetBooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BuiltinCommonInstructions::Or" + }, + "parameters": [], + "subInstructions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Hovered\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::PropertyState" + }, + "parameters": [ + "Object", + "Behavior", + "=", + "\"Idle\"" + ] + } + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "Index", + "+", + "1" + ] + } + ] + } + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Apply position changes", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "MouseIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "BooleanVariable" + }, + "parameters": [ + "TouchIsInside", + "True", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Handle touch end", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "HasTouchEnded" + }, + "parameters": [ + "", + "TouchId" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + }, + { + "type": { + "inverted": true, + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "onDeActivate", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::ResetState" + }, + "parameters": [ + "Object", + "Behavior", + "" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Reset the state of the button.", + "fullName": "Reset state", + "functionType": "Action", + "name": "ResetState", + "private": true, + "sentence": "Reset the button state of _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TouchId", + "=", + "0" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is not used.", + "fullName": "Is idle", + "functionType": "Condition", + "name": "IsIdle", + "sentence": "_PARAM0_ is idle", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button was just clicked.", + "fullName": "Is clicked", + "functionType": "Condition", + "name": "IsClicked", + "sentence": "_PARAM0_ is clicked", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Validated\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the cursor is hovered over the button.", + "fullName": "Is hovered", + "functionType": "Condition", + "name": "IsHovered", + "sentence": "_PARAM0_ is hovered", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is either hovered or pressed but not hovered.", + "fullName": "Is focused", + "functionType": "Condition", + "name": "IsFocused", + "sentence": "_PARAM0_ is focused", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"Hovered\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed with mouse or touch.", + "fullName": "Is pressed", + "functionType": "Condition", + "name": "IsPressed", + "sentence": "_PARAM0_ is pressed", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedInside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the button is currently being pressed outside with mouse or touch.", + "fullName": "Is held outside", + "functionType": "Condition", + "name": "IsPressedOutside", + "sentence": "_PARAM0_ is held outside", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "State", + "=", + "\"PressedOutside\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetReturnBoolean" + }, + "parameters": [ + "True" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the touch id that is using the button or 0 if none.", + "fullName": "Touch id", + "functionType": "ExpressionAndCondition", + "name": "TouchId", + "sentence": "the touch id", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TouchId" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonFSM", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "true", + "type": "Boolean", + "label": "", + "description": "Should check hovering", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "ShouldCheckHovering" + }, + { + "value": "Idle", + "type": "Choice", + "label": "State", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Hovered", + "PressedInside", + "PressedOutside", + "Validated" + ], + "hidden": true, + "name": "State" + }, + { + "value": "0", + "type": "Number", + "label": "Touch id", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchId" + }, + { + "value": "", + "type": "Boolean", + "label": "Touch is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TouchIsInside" + }, + { + "value": "", + "type": "Boolean", + "label": "Mouse is inside", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "MouseIsInside" + }, + { + "value": "", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "Index" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Enable effects on buttons based on their state.", + "fullName": "Button object effects", + "name": "ButtonObjectEffects", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "no" + ] + }, + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "no" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "IdleEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "IdleEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "FocusedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "FocusedEffect", + "yes" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PressedEffect", + "!=", + "\"\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::EnableEffect" + }, + "parameters": [ + "Object", + "Effect", + "PressedEffect", + "yes" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state effect of the object.", + "fullName": "Idle state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "IdleEffect", + "sentence": "the idle state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleEffect", + "name": "SetIdleEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state effect of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "FocusedEffect", + "sentence": "the focused state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedEffect", + "name": "SetFocusedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state effect of the object.", + "fullName": "Pressed state effect", + "functionType": "ExpressionAndCondition", + "group": "Button object effects configuration", + "name": "PressedEffect", + "sentence": "the pressed state effect", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedEffect" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedEffect", + "name": "SetPressedEffect", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedEffect", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffects", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "", + "type": "String", + "label": "Idle state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "IdleEffect" + }, + { + "value": "", + "type": "String", + "label": "Focused state effect", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Effects", + "extraInformation": [], + "name": "FocusedEffect" + }, + { + "value": "", + "type": "String", + "label": "Pressed state effect", + "description": "", + "group": "Effects", + "extraInformation": [], + "name": "PressedEffect" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Change the animation of buttons according to their state.", + "fullName": "Button animation", + "name": "ButtonAnimationName", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "IdleAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "FocusedAnimationName" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [ + { + "type": { + "value": "AnimatableCapability::AnimatableBehavior::SetName" + }, + "parameters": [ + "Object", + "Animation", + "=", + "PressedAnimationName" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state animation name of the object.", + "fullName": "Idle state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "IdleAnimationName", + "sentence": "the idle state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleAnimationName", + "name": "SetIdleAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state animation name of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "FocusedAnimationName", + "sentence": "the focused state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedAnimationName", + "name": "SetFocusedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state animation name of the object.", + "fullName": "Pressed state animation name", + "functionType": "ExpressionAndCondition", + "group": "Button animation configuration", + "name": "PressedAnimationName", + "sentence": "the pressed state animation name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedAnimationName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedAnimationName", + "name": "SetPressedAnimationName", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedAnimationName", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonAnimationName", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Animatable capability", + "description": "", + "group": "", + "extraInformation": [ + "AnimatableCapability::AnimatableBehavior" + ], + "name": "Animation" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "Idle", + "type": "String", + "label": "Idle state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "IdleAnimationName" + }, + { + "value": "Focused", + "type": "String", + "label": "Focused state animation name", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Animation", + "extraInformation": [], + "name": "FocusedAnimationName" + }, + { + "value": "Pressed", + "type": "String", + "label": "Pressed state animation name", + "description": "", + "group": "Animation", + "extraInformation": [], + "name": "PressedAnimationName" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change an effect on buttons according to their state.", + "fullName": "Button object effect tween", + "name": "ButtonObjectEffectTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "IdleValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedValue", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedValue", + "" + ] + } + ] + } + ], + "parameters": [] + }, + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Tween", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeInDuration", + "FadeInEasing", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "ButtonStates::ButtonObjectEffectTween::PlayTween" + }, + "parameters": [ + "Object", + "Behavior", + "FadeOutDuration", + "FadeOutEasing", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Time delta", + "functionType": "Expression", + "name": "TimeDelta", + "private": true, + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "TimeDelta() * LayerTimeScale(Object.Layer())" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeIn\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "=", + "0" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"FadeOut\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenInitialValue", + "=", + "EffectValue" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTargetedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Play tween", + "functionType": "Action", + "name": "PlayTween", + "private": true, + "sentence": "Tween the effect property of object _PARAM0_ over _PARAM2_ seconds with _PARAM3_ easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + "<", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "TweenTime", + "+", + "Object.Behavior::TimeDelta()" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "Tween::Ease(Easing, TweenInitialValue, TweenTargetedValue, TweenTime / Duration)" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "NumberVariable" + }, + "parameters": [ + "TweenTime", + ">=", + "Duration" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "TweenState", + "=", + "\"NoTween\"" + ] + }, + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "EffectValue", + "=", + "TweenTargetedValue" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "EffectCapability::EffectBehavior::SetEffectDoubleParameter" + }, + "parameters": [ + "Object", + "Effect", + "EffectName", + "EffectProperty", + "EffectValue" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Duration (in seconds)", + "name": "Duration", + "type": "expression" + }, + { + "description": "Easing", + "name": "Easing", + "supplementaryInformation": "[]", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the effect name of the object.", + "fullName": "Effect name", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectName", + "sentence": "the effect name", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectName" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "EffectProperty", + "sentence": "the effect parameter", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "EffectProperty" + ] + } + ] + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "Change the effect parameter of the object. The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "fullName": "Effect parameter", + "functionType": "Action", + "getterName": "EffectName", + "group": "Button effect tween configuration", + "name": "SetEffectProperty", + "sentence": "Change the tweened effect of _PARAM0_ to _PARAM2_ with parameter _PARAM3_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectName", + "=", + "NewEffectName" + ] + }, + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "EffectProperty", + "=", + "NewPropertyName" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + }, + { + "description": "Effect name", + "name": "NewEffectName", + "type": "string" + }, + { + "description": "Parameter name", + "name": "NewPropertyName", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "the idle effect parameter value of the object.", + "fullName": "Idle effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "IdleValue", + "sentence": "the idle effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleValue", + "name": "SetIdleValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused effect parameter value of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FocusedValue", + "sentence": "the focused effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedValue", + "name": "SetFocusedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed effect parameter value of the object.", + "fullName": "Pressed effect parameter value", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "PressedValue", + "sentence": "the pressed effect parameter value", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedValue" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedValue", + "name": "SetPressedValue", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedValue", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button effect tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonObjectEffectTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Effect capability", + "description": "", + "group": "", + "extraInformation": [ + "EffectCapability::EffectBehavior" + ], + "name": "Effect" + }, + { + "value": "Effect", + "type": "String", + "label": "Effect name", + "description": "", + "group": "Effect", + "extraInformation": [], + "name": "EffectName" + }, + { + "value": "", + "type": "String", + "label": "Effect parameter", + "description": "The effect parameter names can be found in the effects tab with the \"Show parameter names\" action of the drop down menu.", + "group": "Effect", + "extraInformation": [], + "name": "EffectProperty" + }, + { + "value": "0", + "type": "Number", + "label": "Idle effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "IdleValue" + }, + { + "value": "0", + "type": "Number", + "label": "Focused effect parameter value", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Value", + "extraInformation": [], + "name": "FocusedValue" + }, + { + "value": "0", + "type": "Number", + "label": "Pressed effect parameter value", + "description": "", + "group": "Value", + "extraInformation": [], + "name": "PressedValue" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "0.125", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.5", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenInitialValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTargetedValue" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "TweenTime" + }, + { + "value": "NoTween", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "NoTween", + "FadeIn", + "FadeOut" + ], + "hidden": true, + "name": "TweenState" + }, + { + "value": "0", + "type": "Number", + "label": "", + "description": "", + "group": "", + "extraInformation": [], + "hidden": true, + "name": "EffectValue" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly resize buttons according to their state.", + "fullName": "Button scale tween", + "name": "ButtonScaleTween", + "objectType": "", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ScalableCapability::ScalableBehavior::SetValue" + }, + "parameters": [ + "Object", + "Scale", + "=", + "IdleScale" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "Change based on state", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedScale", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonScaleTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedScale", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectScaleTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonScaleTween.Fade\"", + "Value", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state size scale of the object.", + "fullName": "Idle state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "IdleScale", + "sentence": "the idle state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "IdleScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleScale", + "name": "SetIdleScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "IdleScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state size scale of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FocusedScale", + "sentence": "the focused state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FocusedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedScale", + "name": "SetFocusedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FocusedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state size scale of the object.", + "fullName": "Pressed state size scale", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "PressedScale", + "sentence": "the pressed state size scale", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "PressedScale" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedScale", + "name": "SetPressedScale", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "PressedScale", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button scale tween configuration", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonScaleTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Scalable capability", + "description": "", + "group": "", + "extraInformation": [ + "ScalableCapability::ScalableBehavior" + ], + "name": "Scale" + }, + { + "value": "", + "type": "Behavior", + "label": "Button states behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween behavior (required)", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Idle state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "IdleScale" + }, + { + "value": "1", + "type": "Number", + "unit": "Dimensionless", + "label": "Focused state size scale", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Size", + "extraInformation": [], + "name": "FocusedScale" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "0.95", + "type": "Number", + "unit": "Dimensionless", + "label": "Pressed state size scale", + "description": "", + "group": "Size", + "extraInformation": [], + "name": "PressedScale" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + }, + { + "description": "Smoothly change the color tint of buttons according to their state.", + "fullName": "Button color tint tween", + "name": "ButtonColorTintTween", + "objectType": "Sprite", + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onCreated", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "ChangeColor" + }, + "parameters": [ + "Object", + "IdleColorTint" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "Action", + "name": "doStepPreEvents", + "sentence": "", + "events": [ + { + "colorB": 228, + "colorG": 176, + "colorR": 74, + "creationTime": 0, + "name": "States", + "source": "", + "type": "BuiltinCommonInstructions::Group", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsIdle" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "IdleColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsFocused" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + } + ], + "actions": [], + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Idle\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Focused\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeOut" + }, + "parameters": [ + "Object", + "Behavior", + "FocusedColorTint", + "" + ] + } + ] + } + ] + }, + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [ + { + "type": { + "value": "ButtonStates::ButtonFSM::IsPressed" + }, + "parameters": [ + "Object", + "ButtonFSM", + "" + ] + }, + { + "type": { + "value": "StringVariable" + }, + "parameters": [ + "PreviousState", + "!=", + "\"Pressed\"" + ] + } + ], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PreviousState", + "=", + "\"Pressed\"" + ] + }, + { + "type": { + "value": "ButtonStates::ButtonColorTintTween::FadeIn" + }, + "parameters": [ + "Object", + "Behavior", + "PressedColorTint", + "" + ] + } + ] + } + ], + "parameters": [] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade in", + "functionType": "Action", + "name": "FadeIn", + "private": true, + "sentence": "_PARAM0_ fade in to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeInEasing", + "1000 * FadeInDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "fullName": "Fade out", + "functionType": "Action", + "name": "FadeOut", + "private": true, + "sentence": "_PARAM0_ fade out to _PARAM2_", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "Tween::AddObjectColorTween" + }, + "parameters": [ + "Object", + "Tween", + "\"__ButtonColorTintTween.Fade\"", + "Value", + "FadeOutEasing", + "1000 * FadeOutDuration", + "no", + "yes" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + }, + { + "description": "Value", + "name": "Value", + "type": "color" + } + ], + "objectGroups": [] + }, + { + "description": "the idle state color tint of the object.", + "fullName": "Idle state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "IdleColorTint", + "sentence": "the idle state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "IdleColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "IdleColorTint", + "name": "SetIdleColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "IdleColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the focused state color tint of the object. The state is Focused when the button is hovered or held outside.", + "fullName": "Focused state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FocusedColorTint", + "sentence": "the focused state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FocusedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FocusedColorTint", + "name": "SetFocusedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FocusedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the pressed state color tint of the object.", + "fullName": "Pressed state color tint", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "PressedColorTint", + "sentence": "the pressed state color tint", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "PressedColorTint" + ] + } + ] + } + ], + "expressionType": { + "type": "color" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "PressedColorTint", + "name": "SetPressedColorTint", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "PressedColorTint", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in duration of the object.", + "fullName": "Fade-in duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInDuration", + "sentence": "the fade-in duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeInDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInDuration", + "name": "SetFadeInDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeInDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out duration of the object.", + "fullName": "Fade-out duration", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutDuration", + "sentence": "the fade-out duration", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnNumber" + }, + "parameters": [ + "FadeOutDuration" + ] + } + ] + } + ], + "expressionType": { + "type": "expression" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutDuration", + "name": "SetFadeOutDuration", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetNumberVariable" + }, + "parameters": [ + "FadeOutDuration", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-in easing of the object.", + "fullName": "Fade-in easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeInEasing", + "sentence": "the fade-in easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeInEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeInEasing", + "name": "SetFadeInEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeInEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "description": "the fade-out easing of the object.", + "fullName": "Fade-out easing", + "functionType": "ExpressionAndCondition", + "group": "Button color tint tween", + "name": "FadeOutEasing", + "sentence": "the fade-out easing", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetReturnString" + }, + "parameters": [ + "FadeOutEasing" + ] + } + ] + } + ], + "expressionType": { + "supplementaryInformation": "[\"linear\",\"easeInQuad\",\"easeOutQuad\",\"easeInOutQuad\",\"easeInCubic\",\"easeOutCubic\",\"easeInOutCubic\",\"easeInQuart\",\"easeOutQuart\",\"easeInOutQuart\",\"easeInQuint\",\"easeOutQuint\",\"easeInOutQuint\",\"easeInOutSine\",\"easeInExpo\",\"easeOutExpo\",\"easeInOutExpo\",\"easeInCirc\",\"easeOutCirc\",\"easeInOutCirc\",\"easeOutBounce\",\"easeInBack\",\"easeOutBack\",\"easeInOutBack\",\"elastic\",\"swingFromTo\",\"swingFrom\",\"swingTo\",\"bounce\",\"bouncePast\",\"easeFromTo\",\"easeFrom\",\"easeTo\"]", + "type": "stringWithSelector" + }, + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + }, + { + "fullName": "", + "functionType": "ActionWithOperator", + "getterName": "FadeOutEasing", + "name": "SetFadeOutEasing", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::Standard", + "conditions": [], + "actions": [ + { + "type": { + "value": "SetStringVariable" + }, + "parameters": [ + "FadeOutEasing", + "=", + "Value" + ] + } + ] + } + ], + "parameters": [ + { + "description": "Object", + "name": "Object", + "supplementaryInformation": "Sprite", + "type": "object" + }, + { + "description": "Behavior", + "name": "Behavior", + "supplementaryInformation": "ButtonStates::ButtonColorTintTween", + "type": "behavior" + } + ], + "objectGroups": [] + } + ], + "propertyDescriptors": [ + { + "value": "", + "type": "Behavior", + "label": "Button states", + "description": "", + "group": "", + "extraInformation": [ + "ButtonStates::ButtonFSM" + ], + "name": "ButtonFSM" + }, + { + "value": "", + "type": "Behavior", + "label": "Tween", + "description": "", + "group": "", + "extraInformation": [ + "Tween::TweenBehavior" + ], + "name": "Tween" + }, + { + "value": "255;255;255", + "type": "Color", + "label": "Idle state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "IdleColorTint" + }, + { + "value": "192;192;192", + "type": "Color", + "label": "Focused state color tint", + "description": "The state is Focused when the button is hovered or held outside.", + "group": "Color", + "extraInformation": [], + "name": "FocusedColorTint" + }, + { + "value": "64;64;64", + "type": "Color", + "label": "Pressed state color tint", + "description": "", + "group": "Color", + "extraInformation": [], + "name": "PressedColorTint" + }, + { + "value": "0.1", + "type": "Number", + "unit": "Second", + "label": "Fade-in duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeInDuration" + }, + { + "value": "0.2", + "type": "Number", + "unit": "Second", + "label": "Fade-out duration", + "description": "", + "group": "Speed", + "extraInformation": [], + "name": "FadeOutDuration" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-in easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeInEasing" + }, + { + "value": "easeInOutQuad", + "type": "Choice", + "label": "Fade-out easing", + "description": "", + "group": "Speed", + "extraInformation": [ + "linear", + "easeInQuad", + "easeOutQuad", + "easeInOutQuad", + "easeInCubic", + "easeOutCubic", + "easeInOutCubic", + "easeInQuart", + "easeOutQuart", + "easeInOutQuart", + "easeInQuint", + "easeOutQuint", + "easeInOutQuint", + "easeInOutSine", + "easeInExpo", + "easeOutExpo", + "easeInOutExpo", + "easeInCirc", + "easeOutCirc", + "easeInOutCirc", + "easeOutBounce", + "easeInBack", + "easeOutBack", + "easeInOutBack", + "elastic", + "swingFromTo", + "swingFrom", + "swingTo", + "bounce", + "bouncePast", + "easeFromTo", + "easeFrom", + "easeTo" + ], + "name": "FadeOutEasing" + }, + { + "value": "Idle", + "type": "Choice", + "label": "", + "description": "", + "group": "", + "extraInformation": [ + "Idle", + "Focused", + "Pressed" + ], + "hidden": true, + "name": "PreviousState" + } + ], + "sharedPropertyDescriptors": [] + } + ], + "eventsBasedObjects": [] + } + ], + "externalLayouts": [] +} \ No newline at end of file diff --git a/tutorials/in-app/cameraParallax.json b/tutorials/in-app/cameraParallax.json new file mode 100644 index 0000000..e69bd98 --- /dev/null +++ b/tutorials/in-app/cameraParallax.json @@ -0,0 +1,1234 @@ +{ + "id": "cameraParallax", + "titleByLocale": { + "en": "Let's improve the camera and the background", + "fr": "Améliorons la caméra et l'arrière-plan", + "ar": "لنحسن الكاميرا والخلفية", + "de": "Verbessern wir die Kamera und den Hintergrund", + "es": "Mejoremos la cámara y el fondo", + "fi": "Parannetaan kameraa ja taustaa", + "it": "Miglioriamo la fotocamera e lo sfondo", + "tr": "Kamerayı ve arkaplanı iyileştirelim", + "ja": "カメラと背景を改善しましょう", + "ko": "카메라와 배경을 개선합시다", + "pl": "Poprawmy kamerę i tło", + "pt": "Vamos melhorar a câmera e o fundo", + "th": "มาปรับปรุงกล้องและพื้นหลังกันเถอะ", + "ru": "Давайте улучшим камеру и фон", + "sl": "Izboljšajmo kamero in ozadje", + "sq": "Le të përmirësojmë kamerën dhe sfondin", + "uk": "Покращимо камеру та фон", + "zh": "让我们改进相机和背景" + }, + "bulletPointsByLocale": [ + { + "en": "Add a background with parallax effect", + "fr": "Ajouter un arrière-plan avec effet de parallaxe", + "ar": "أضف خلفية مع تأثير المنظر المتحرك", + "de": "Füge einen Hintergrund mit Parallax-Effekt hinzu", + "es": "Agregar un fondo con efecto de paralaje", + "fi": "Lisää tausta, jossa on parallaksi-efekti", + "it": "Aggiungi uno sfondo con effetto parallasse", + "tr": "Paralaks etkili bir arka plan ekle", + "ja": "パララックス効果のある背景を追加する", + "ko": "패럴럭스 효과가 있는 배경 추가", + "pl": "Dodaj tło z efektem paralaksy", + "pt": "Adicionar um fundo com efeito de paralaxe", + "th": "เพิ่มพื้นหลังที่มีเอฟเฟกต์พารัลแลกซ์", + "ru": "Добавить фон с эффектом параллакса", + "sl": "Dodajte ozadje s paralaksnim učinkom", + "sq": "Shto një sfond me efekt paralaksi", + "uk": "Додайте фон з ефектом паралакса", + "zh": "添加具有视差效果的背景" + }, + { + "en": "Add an extension", + "fr": "Ajouter une extension", + "ar": "أضف ملحق", + "de": "Eine Erweiterung hinzufügen", + "es": "Agregar una extensión", + "fi": "Lisää laajennus", + "it": "Aggiungi un'estensione", + "tr": "Uzantı ekle", + "ja": "拡張機能を追加する", + "ko": "확장 추가", + "pl": "Dodaj rozszerzenie", + "pt": "Adicionar uma extensão", + "th": "เพิ่มส่วนขยาย", + "ru": "Добавить расширение", + "sl": "Dodajte razširitev", + "sq": "Shto një zgjerim", + "uk": "Додайте розширення", + "zh": "添加扩展" + }, + { + "en": "Use basic camera movements to follow the player", + "fr": "Utiliser des mouvements de caméra de base pour suivre le joueur", + "ar": "استخدم حركات الكاميرا الأساسية لمتابعة اللاعب", + "de": "Verwende grundlegende Kamerabewegungen, um dem Spieler zu folgen", + "es": "Usa movimientos básicos de cámara para seguir al jugador", + "fi": "Käytä peruskameran liikkeitä seurataksesi pelaajaa", + "it": "Usa movimenti di base della fotocamera per seguire il giocatore", + "tr": "Oyuncuyu takip etmek için temel kamera hareketlerini kullan", + "ja": "プレイヤーを追うために基本的なカメラの動きを使用する", + "ko": "플레이어를 따라가는 기본적인 카메라 움직임을 사용하세요", + "pl": "Użyj podstawowych ruchów kamery, aby śledzić gracza", + "pt": "Use movimentos básicos de câmera para seguir o jogador", + "th": "ใช้การเคลื่อนไหวของกล้องพื้นฐานเพื่อติดตามผู้เล่น", + "ru": "Используйте базовые движения камеры, чтобы следовать за игроком", + "sl": "Uporabite osnovne premike kamere za sledenje igralcu", + "sq": "Përdorni lëvizjet themelore të kamerës për të ndjekur lojtarin", + "uk": "Використовуйте базові рухи камери для стеження за гравцем", + "zh": "使用基本的摄像机移动跟随玩家" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "cameraScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "cameraScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/cameraParallax/game.json", + "initialProjectData": { + "cameraScene": "CameraScene", + "player": "PlayerObject", + "farBackground": "FarBackground", + "midBackground": "MidBackground" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Ju keni perfunduar kete mesim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, voici ce que vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du geler:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa opit miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu dersi tamamladınız ve şunları öğrendiniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다.", + "pl": "Dobrze, w tym samouczku nauczyłeś się, jak:", + "pt": "Bom trabalho, neste tutorial você aprendeu como:", + "ru": "Хорошо, в этом уроке вы узнали, как:", + "sl": "Bravo, v tem vadnem programu ste se naučili, kako:", + "sq": "Bravo, ne kete mesim ju keni mesuar si te:", + "th": "ทำได้ดีเยี่ยม, ในบทเรียนนี้คุณได้เรียนรู้วิธี:", + "uk": "Добре, в цьому уроці ви дізналися, як:", + "zh": "做得好,在本教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to add an extension\n\n- How to control the camera\n\n- How to make Tiled Sprites move at different speeds", + "fr": "- Comment ajouter une extension\n\n- Comment contrôler la caméra\n\n- Comment faire bouger des Tiled Sprites à différentes vitesses", + "ar": "- إضافة ملحق\n\n- التحكم في الكاميرا\n\n- إنشاء كائنات مبلطة تتحرك بسرعات مختلفة", + "de": "- Eine Erweiterung hinzufügen\n\n- Die Kamera steuern\n\n- Tiled Sprites mit unterschiedlichen Geschwindigkeiten bewegen", + "es": "- Cómo agregar una extensión\n\n- Cómo controlar la cámara\n\n- Cómo hacer que los Tiled Sprites se muevan a diferentes velocidades", + "fi": "- Kuinka lisätä laajennus\n\n- Kuinka hallita kameraa\n\n- Kuinka tehdä Tiled Sprites liikkuvan eri nopeuksilla", + "it": "- Come aggiungere un'estensione\n\n- Come controllare la telecamera\n\n- Come fare in modo che i Tiled Sprites si muovano a diverse velocità", + "tr": "- Bir uzantı eklemek\n\n- Kamerayı kontrol etmek\n\n- Farklı hızlarda hareket eden Tiled Sprites'ları nasıl yapacağınızı", + "ja": "- 拡張機能の追加方法\n\n- カメラの制御方法\n\n- タイルスプライトを異なる速度で動かす方法", + "ko": "- 확장 기능 추가 방법\n\n- 카메라 제어 방법\n\n- 타일 스프라이트를 다른 속도로 움직이게 하는 방법", + "pl": "- Jak dodać rozszerzenie\n\n- Jak kontrolować kamerę\n\n- Jak sprawić, by kafelkowe obiekty poruszały się z różnymi prędkościami", + "pt": "- Como adicionar uma extensão\n\n- Como controlar a câmera\n\n- Como fazer Tiled Sprites se movem a diferentes velocidades", + "ru": "- Как добавить расширение\n\n- Как управлять камерой\n\n- Как заставить Tiled Sprites двигаться с разной скоростью", + "sl": "- Kako dodati razširitev\n\n- Kako nadzirati kamero\n\n- Kako narediti, da se Tiled Sprites premikajo z različnimi hitrostmi", + "sq": "- Si te shtosh nje zgjerim\n\n- Si te kontrollosh kameren\n\n- Si te besh qe Tiled Sprites te levizin me shpejtesi te ndryshme", + "th": "- วิธีเพิ่ม extension\n\n- วิธีควบคุมกล้อง\n\n- วิธีทำให้ Tiled Sprites เคลื่อนที่ด้วยค่าความเร็วต่างๆ", + "uk": "- Як додати розширення\n\n- Як керувати камерою\n\n- Як зробити, щоб Tiled Sprites рухалися з різною швидкістю", + "zh": "- 如何添加扩展\n\n- 如何控制摄像机\n\n- 如何使平铺精灵以不同速度移动" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des choses à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir agregando cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaisemista!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、公開することができます!", + "ko": "이 게임에 더 많은 것을 추가하거나 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Ju mund te vazhdoni te shtoni gjera te kete loje, ose publikoje!", + "th": "คุณสามารถพัฒนาเกมนี้ต่อไปหรือจะเผยแพร่เลยก็ได้!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续为这个游戏添加东西,或者发布它!" + } + } + ] + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a platform game with a character. We will improve this game by centering the camera on the character, and adding a parralax effect on the background, but for now let's see the current state of the game. Click on the **Preview** button to play", + "fr": "Ce jeu est un jeu de plateforme avec un personnage. Nous améliorerons ce jeu en centrant la caméra sur le personnage et en ajoutant un effet de parallaxe à l'arrière-plan, mais pour l'instant, voyons l'état actuel du jeu. Cliquez sur le bouton **aperçu** pour jouer.", + "ar": "هذه اللعبة هي لعبة منصات بشخصية. سنقوم بتحسين هذه اللعبة عن طريق توسيط الكاميرا على الشخصية، وإضافة تأثير المنظر للخلفية، ولكن الآن لنرى الحالة الحالية للعبة. انقر على زر **معاينة** للعب.", + "de": "Dieses Spiel ist ein Plattformspiel mit einer Figur. Wir werden dieses Spiel verbessern, indem wir die Kamera auf die Figur zentrieren und einen Parallax-Effekt auf den Hintergrund hinzufügen, aber lassen Sie uns jetzt den aktuellen Zustand des Spiels ansehen. Klicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.", + "es": "Este juego es un juego de plataformas con un personaje. Mejoraremos este juego centrando la cámara en el personaje y añadiendo un efecto de paralaje al fondo, pero por ahora veamos el estado actual del juego. Haz clic en el botón **Vista previa** para jugar.", + "fi": "Tämä peli on tasohyppelypeli, jossa on hahmo. Parannamme tätä peliä keskittämällä kameran hahmoon ja lisäämällä parallaksiefektin taustaan, mutta katsotaan nyt pelin nykyistä tilaa. Napsauta **Esikatselu**-painiketta pelataksesi.", + "it": "Questo gioco è un platform con un personaggio. Miglioreremo questo gioco centrando la telecamera sul personaggio e aggiungendo un effetto di parallasse allo sfondo, ma per ora vediamo lo stato attuale del gioco. Clicca sul pulsante **Anteprima** per giocare.", + "tr": "Bu oyun bir karakterli platform oyunudur. Kamerayı karakterin üzerine ortalayarak ve arka plana bir paralaks efekti ekleyerek bu oyunu geliştireceğiz, ancak şimdilik oyunun mevcut durumunu görelim. Oynamak için **Önizleme** düğmesine tıklayın.", + "ja": "このゲームはキャラクターが登場するプラットフォームゲームです。カメラをキャラクターに集中させ、背景に視差効果を追加することで、このゲームを改善します。ただし、今のところゲームの現在の状態を見てみましょう。**プレビュー** ボタンをクリックしてプレイします。", + "ko": "이 게임은 캐릭터가 등장하는 플랫폼 게임입니다. 카메라를 캐릭터에 집중시키고 배경에 시차 효과를 추가하여 이 게임을 개선할 것입니다. 하지만 지금은 게임의 현재 상태를 확인해 보겠습니다. 플레이하려면 **미리보기** 버튼을 클릭하세요.", + "pl": "Ta gra to platformówka z postacią. Ulepszymy tę grę, centrując kamerę na postaci i dodając efekt paralaksy do tła, ale na razie zobaczmy obecny stan gry. Kliknij przycisk **Podgląd**, aby zagrać.", + "pt": "Este jogo é um jogo de plataformas com um personagem. Vamos melhorar este jogo centrando a câmara no personagem e adicionando um efeito de paralaxe ao fundo, mas por agora vamos ver o estado atual do jogo. Clique no botão **Pré-visualização** para jogar.", + "th": "เกมนี้เป็นเกมแพลตฟอร์มที่มีตัวละคร เราจะปรับปรุงเกมนี้โดยการจัดกึ่งกลางกล้องไปที่ตัวละคร และเพิ่มเอฟเฟกต์พารัลแลกซ์ให้กับพื้นหลัง แต่ตอนนี้มาดูสถานะปัจจุบันของเกมกัน คลิกที่ปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "ru": "Эта игра является платформенной игрой с персонажем. Мы улучшим эту игру, центрируя камеру на персонаже и добавляя эффект параллакса на фон, но давайте сейчас посмотрим на текущее состояние игры. Нажмите кнопку **предварительный просмотр**, чтобы играть.", + "sl": "Ta igra je platformna igra z likom. Izboljšali bomo to igro tako, da kameri centriramo na lik in dodamo paralaksni učinek na ozadje, vendar si za zdaj oglejmo trenutno stanje igre. Kliknite gumb **predogled**, da začnete igrati.", + "sq": "Kjo lojë është një lojë platformë me një personazh. Ne do ta përmirësojmë këtë lojë duke e qendruar kamerën në personazh dhe duke shtuar një efekt paralaks në sfond, por tani le të shohim gjendjen aktuale të lojës. Klikoni në butonin **parashikim** për të luajtur.", + "uk": "Ця гра є платформенною грою з персонажем. Ми покращимо цю гру, центрувавши камеру на персонажі та додавши ефект паралакса на фон, але наразі давайте подивимося на поточний стан гри. Натисніть кнопку **перегляд**, щоб грати.", + "zh": "这款游戏是一款带有角色的平台游戏。我们将通过将相机对准角色并在背景上添加视差效果来改进这款游戏,但现在让我们看看游戏的当前状态。点击 **预览** 按钮开始游戏。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "The character can move, but the camera doesn't follow him yet.\n\nLet's fix it! Close this window and return to the editor.", + "fr": "Le personnage peut se déplacer, mais la caméra ne le suit pas encore.\n\nRéglons cela ! Fermez cette fenêtre et revenez à l'éditeur.", + "ar": "يمكن للشخصية أن تتحرك، لكن الكاميرا لا تتبعه بعد.\n\nلنصلح هذا! أغلق هذه النافذة وعد إلى المحرر.", + "de": "Die Figur kann sich bewegen, aber die Kamera folgt ihr noch nicht.\n\nLassen Sie uns das beheben! Schließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "El personaje puede moverse, pero la cámara aún no lo sigue.\n\n¡Vamos a arreglarlo! Cierra esta ventana y regresa al editor.", + "fi": "Hahmo voi liikkua, mutta kamera ei seuraa häntä vielä.\n\nKorjataan tämä! Sulje tämä ikkuna ja palaa editoriin.", + "it": "Il personaggio può muoversi, ma la telecamera non lo segue ancora.\n\nRisolviamo questo problema! Chiudi questa finestra e torna all'editor.", + "tr": "Karakter hareket edebilir, ancak kamera henüz onu takip etmiyor.\n\nBunu düzeltelim! Bu pencereyi kapatın ve düzenleyiciye geri dönün.", + "ja": "キャラクターは移動できますが、カメラはまだ彼を追跡しません。\n\nこれを修正しましょう! このウィンドウを閉じてエディターに戻ってください。", + "ko": "캐릭터는 움직일 수 있지만 카메라는 아직 그를 따라가지 않습니다.\n\n이 문제를 해결해 봅시다! 이 창을 닫고 편집기로 돌아가세요.", + "pl": "Postać może się poruszać, ale kamera jeszcze za nią nie podąża.\n\nNaprawmy to! Zamknij to okno i wróć do edytora.", + "pt": "O personagem pode se mover, mas a câmera ainda não o segue.\n\nVamos corrigir isso! Feche esta janela e volte para o editor.", + "th": "ตัวละครสามารถเคลื่อนที่ได้ แต่กล้องยังไม่ติดตามเขา\n\nมาแก้ไขกัน! ปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "ru": "Персонаж может двигаться, но камера пока не следует за ним.\n\nДавайте это исправим! Закройте это окно и вернитесь в редактор.", + "sl": "Lik se lahko premika, vendar ga kamera še ne sledi.\n\nPopravimo to! Zapri to okno in se vrni v urejevalnik.", + "sq": "Personazhi mund të lëvizë, por kamera nuk e ndjek ende.\n\nTa rregullojmë këtë! Mbyllni këtë dritare dhe kthehuni te redaktori.", + "uk": "Персонаж може рухатися, але камера ще не слідує за ним.\n\nВиправимо це! Закрийте це вікно та поверніться до редактора.", + "zh": "角色可以移动,但相机尚未跟随他。\n\n让我们修复它! 关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello degli **oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開きます。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiektów**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri **Objekte** ploščo.", + "sq": "Hapni panelin e **Objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:player", + "nextStepTrigger": { + "presenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "placement": "top", + "description": { + "messageByLocale": { + "en": "Let's attach the Camera to our player with the help of **behaviors**:\n\nclick on the 3 dot menu, or right click on **$(player)**, and select **Edit behaviors**.", + "fr": "Ajoutons maintenant l'extension à notre joueur.\n\nCliquez droit sur **$(player)** ou utilisez le menu à 3 points et sélectionnez **Modifier les comportements**.", + "ar": "هيّا نصل الكاميرا بشخصيتنا بمساعدة **السلوكيات**:\n\nالضغط على الثلاث نقاط، أو النقر على زر الفأرة الأيمن على الـ **$(player)** وتحديد **تحرير السلوكيات**.", + "de": "Lassen Sie uns die Kamera mit Hilfe von **Verhalten** an unseren Charakter anhängen:\n\nKlicken Sie auf das 3-Punkte-Menü oder klicken Sie mit der rechten Maustaste auf **$(player)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Sigamos nuestro jugador con la Cámara con la ayuda de los **comportamientos**.\n\nHaz clic derecho en **$(player)** o usa el menú de 3 puntos y selecciona **Editar comportamientos**.", + "fi": "Liitetään kamera pelaajaan **käyttäytymisten** avulla:\n\nklikkaa 3 pisteen valikkoa tai klikkaa oikealla hiiren painikkeella **$(player)** ja valitse **Muokkaa käyttäytymisiä**.", + "it": "Attacchiamo la telecamera al nostro giocatore con l'aiuto dei **comportamenti**:\n\nclicca sul menu a 3 punti, o fai clic con il tasto destro su **$(player)** e seleziona **Modifica comportamenti**.", + "tr": "Kamerayı **davranışlar** yardımıyla oyuncumuza ekleyelim:\n\n3 nokta menüsüne tıklayın veya **$(player)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "キャラクターにカメラを**振る舞い**のヘルプで取り付けましょう:\n\n3点メニューをクリックするか、**$(player)** を右クリックして **振る舞いの編集** を選択します。", + "ko": "플레이어에 카메라를 **행동**의 도움으로 부착해 봅시다:\n\n3 점 메뉴를 클릭하거나 **$(player)**을 마우스 오른쪽 버튼으로 클릭하고 **행동 편집**을 선택합니다.", + "pl": "Załączmy kamerę do naszego gracza za pomocą **zachowań**:\n\nkliknij menu 3 kropek lub kliknij prawym przyciskiem myszy na **$(player)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos seguir nosso jogador com a Câmera com a ajuda de **comportamentos**.\n\nClique com o botão direito em **$(player)** ou use o menu de 3 pontos e selecione **Editar comportamentos**.", + "ru": "Прикрепим камеру к нашему игроку с помощью **поведения**:\n\nнажмите на меню 3 точки или щелкните правой кнопкой мыши на **$(player)** и выберите **Изменить поведение**.", + "sl": "Pripnimo kamero našemu igralcu s pomočjo **vedenj**:\n\nkliknite na meni 3 pik ali z desno miškino tipko kliknite na **$(player)** in izberite **Uredi vedenja**.", + "sq": "Le të bashkëngjisim kamerën me lojtarin tonë me ndihmën e **sjelljeve**:\n\nklikoni në menunë 3 pikë ose klikoni me të djathtën në **$(player)** dhe zgjidhni **Ndrysho sjelljet**.", + "th": "ทีนี้ เพิ่ม extension ใส่ลงในผู้เล่น\n\nคลิกขวาที่ **$(player)** หรือกดเมนู 3 จุด แล้วเลือก **แก้ไขพฤติกรรม**", + "uk": "Прикріпимо камеру до нашого гравця за допомогою **поведінки**:\n\nнатисніть на меню 3 крапки або клацніть правою кнопкою миші на **$(player)** і виберіть **Редагувати поведінку**.", + "zh": "让我们通过**行为**将摄像机附加到我们的角色上:\n\n点击3点菜单,或右键单击**$(player)**,然后选择**编辑行为**。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Let's attach the Camera to our player with the help of **behaviors**:\n\nSelect then long-press **$(player)**, and select **Edit behaviors**.", + "fr": "Ajoutons maintenant l'extension à notre joueur.\n\nSélectionnez puis appuyez longuement sur **$(player)** et sélectionnez **Modifier les comportements**.", + "ar": "هيّا نصل الكاميرا بشخصيتنا بمساعدة **السلوكيات**:\n\nتحديد، ثم ضغطة مطولة على الـ **$(player)** وتحديد **تحرير السلوكيات**.", + "de": "Lassen Sie uns die Kamera mit Hilfe von **Verhalten** an unseren Charakter anhängen:\n\nWählen und halten Sie **$(player)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Sigamos nuestro jugador con la Cámara con la ayuda de los **comportamientos**.\n\nSelecciona y pulsa largo **$(player)** y selecciona **Editar comportamientos**.", + "fi": "Liitetään kamera pelaajaan **käyttäytymisten** avulla:\n\nValitse ja pidä pitkään **$(player)** ja valitse **Muokkaa käyttäytymisiä**.", + "it": "Attacchiamo la telecamera al nostro giocatore con l'aiuto dei **comportamenti**:\n\nSeleziona e tieni premuto **$(player)** e seleziona **Modifica comportamenti**.", + "tr": "Kamerayı **davranışlar** yardımıyla oyuncumuza ekleyelim:\n\nSeçin ve uzun basın **$(player)** ve **Davranışları Düzenle**'yi seçin.", + "ja": "キャラクターにカメラを**振る舞い**のヘルプで取り付けましょう:\n\n**$(player)** を選択して長押しし、**振る舞いの編集** を選択します。", + "ko": "플레이어에 카메라를 **행동**의 도움으로 부착해 봅시다:\n\n선택하고 길게 눌러 **$(player)**을 선택하고 **행동 편집**을 선택합니다.", + "pl": "Załączmy kamerę do naszego gracza za pomocą **zachowań**:\n\nwybierz i przytrzymaj **$(player)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos seguir nosso jogador com a Câmera com a ajuda de **comportamentos**.\n\nSelecione e pressione por um longo tempo **$(player)** e selecione **Editar comportamentos**.", + "ru": "Прикрепим камеру к нашему игроку с помощью **поведения**:\n\nвыберите и удерживайте **$(player)**, и выберите **Изменить поведение**.", + "sl": "Pripnimo kamero našemu igralcu s pomočjo **vedenj**:\n\nizberite in dolgo pritisnite **$(player)** in izberite **Uredi vedenja**.", + "sq": "Le të bashkëngjisim kamerën me lojtarin tonë me ndihmën e **sjelljeve**:\n\nzgjidhni dhe mbani shtypur **$(player)**, dhe zgjidhni **Ndrysho sjelljet**.", + "th": "ทีนี้ เพิ่ม extension ใส่ลงในผู้เล่น\n\nเลือกแล้วกดค้างที่ **$(player)** แล้วเลือก **แก้ไขพฤติกรรม**", + "uk": "Прикріпимо камеру до нашого гравця за допомогою **поведінки**:\n\nвиберіть і утримуйте **$(player)**, і виберіть **Редагувати поведінку**.", + "zh": "让我们通过**行为**将摄像机附加到我们的角色上:\n\n选择并长按**$(player)**,然后选择**编辑行为**。" + } + } + } + }, + { + "elementToHighlightId": "#behaviors-tab", + "nextStepTrigger": { + "presenceOfElement": "#add-behavior-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "ar": "رؤية **سلوكيات الكائن** من هنا.", + "de": "Hier sehen Sie die **Verhalten** des **Objekts**.", + "es": "Los **comportamientos** del **objeto** se encuentran en esta pestaña.", + "fi": "Katso **objektin käyttäytymiset** täältä.", + "it": "Vedi i **comportamenti** dell'**oggetto** qui.", + "tr": "Burada **nesnenin** **davranışlarını** görebilirsiniz.", + "ja": "ここに**オブジェクト**の**振る舞い**があります。", + "ko": "여기서 **오브젝트**의 **행동**을 볼 수 있습니다.", + "pl": "Zobacz **zachowania** **obiektu** tutaj.", + "pt": "Os **comportamentos** do **objeto** estão nesta guia.", + "ru": "Здесь вы увидите **поведение** **объекта**.", + "sl": "Tukaj vidite **vedenja** **objekta**.", + "sq": "Shihni **sjelljet** e **objektit** këtu.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "uk": "Тут ви побачите **поведінку** **об'єкта**.", + "zh": "在这里查看**对象**的**行为**。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#add-behavior-button", + "nextStepTrigger": { + "presenceOfElement": "#behavior-item-SmoothCamera--SmoothCamera" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's add the **Smooth Camera** behavior.", + "fr": "Ajoutons le comportement **Caméra fluide**.", + "ar": "لنضيف سلوك **الكاميرا السلسة**.", + "de": "Fügen wir das **Sanfte Kamera**-Verhalten hinzu.", + "es": "Agreguemos el comportamiento **Cámara suave**.", + "fi": "Lisätään **Sileä kamera** -käyttäytyminen.", + "it": "Aggiungiamo il comport **Telecamera fluida**.", + "tr": "**Düzgün Kamera** davranışını ekleyelim.", + "ja": "**スムーズカメラ**の振る舞いを追加しましょう。", + "ko": "**부드러운 카메라** 행동을 추가해 봅시다.", + "pl": "Dodajmy zachowanie **Gładka kamera**.", + "pt": "Vamos adicionar o comportamento **Câmera suave**.", + "ru": "Добавим поведение **Плавная камера**.", + "sl": "Dodajmo **Gladko kamero** vedenje.", + "sq": "Le të shtojmë sjelljen **Kamera e butë**.", + "th": "เพิ่มพฤติกรรม **Smooth Camera**", + "uk": "Додамо поведінку **Плавна камера**.", + "zh": "让我们添加**平滑摄像机**行为。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#behavior-item-SmoothCamera--SmoothCamera", + "nextStepTrigger": { + "presenceOfElement": "#behavior-parameters-SmoothCamera" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Smooth Camera** behavior.", + "fr": "Sélectionnez le comportement **Caméra fluide**.", + "ar": "حدد سلوك **الكاميرا السلسة**.", + "de": "Wählen Sie das **Sanfte Kamera**-Verhalten.", + "es": "Selecciona el comportamiento **Cámara suave**.", + "fi": "Valitse **Sileä kamera** -käyttäytyminen.", + "it": "Seleziona il comportamento **Telecamera fluida**.", + "tr": "**Düzgün Kamera** davranışını seçin.", + "ja": "**スムーズカメラ**の振る舞いを選択します。", + "ko": "**부드러운 카메라** 행동을 선택합니다.", + "pl": "Wybierz zachowanie **Gładka kamera**.", + "pt": "Selecione o comportamento **Câmera suave**.", + "ru": "Выберите поведение **Плавная камера**.", + "sl": "Izberite vedenje **Gladko kamero**.", + "sq": "Zgjidh sjelljen **Kamera e butë**.", + "th": "เลือกพฤติกรรม **Smooth Camera**", + "uk": "Виберіть поведінку **Плавна камера**.", + "zh": "选择**平滑摄像机**行为。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#behavior-parameters-SmoothCamera #FollowOnY", + "nextStepTrigger": { + "valueHasChanged": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "**Uncheck** the Y axis (vertical) checkbox, to make the camera follow the character only horizontally (X axis).", + "fr": "**Décochez** la case de l'axe Y (vertical), pour que la caméra suive le personnage uniquement horizontalement (axe X).", + "ar": "**إلغاء تحديد** خيار الـ Y axis (العمودية)، لجعل الكاميرا تتتبع الشخصية أفقيًا فقط (X axis).", + "de": "**Deaktivieren** Sie das Kontrollkästchen für die Y-Achse (vertikal), um die Kamera nur horizontal (X-Achse) dem Charakter folgen zu lassen.", + "es": "**Desactiva** la casilla del eje Y (vertical) para que la cámara siga el personaje solamente de manera horizontal (eje X).", + "fi": "**Poista valinta** Y-akselin (pystysuora) valintaruudusta, jotta kamera seuraa hahmoa vain vaakasuunnassa (X-akseli).", + "it": "**Deseleziona** la casella dell'asse Y (verticale), per far sì che la telecamera segua il personaggio solo orizzontalmente (asse X).", + "tr": "Kameranın karakteri yalnızca yatay olarak (X ekseninde) takip etmesi için Y eksenini (dikey) **işaretini kaldırın**.", + "ja": "カメラがキャラクターを水平方向(X軸)のみ追うようにするために、Y軸(垂直)のチェックボックスを**外します**。", + "ko": "카메라가 캐릭터를 수평적으로만(X축) 따르도록 하려면, Y축(수직) 체크박스를 **해제**합니다.", + "pl": "**Odznacz** pole wyboru osi Y (pionowej), aby kamera śledziła postać tylko poziomo (osi X).", + "pt": "Desmarque** a caixa do eixo Y (vertical), para que a câmera siga o personagem apenas na horizontal (eixo X).", + "ru": "**Снимите флажок** с оси Y (вертикальной), чтобы камера следила за персонажем только горизонтально (по оси X).", + "sl": "**Odkljukajte** polje za os Y (navpično), da bo kamera sledila osebi samo vodoravno (os X).", + "sq": "**Hiqni zgjedhjen** e boshtit Y (vertikal), që kamera të ndjekë personazhin vetëm horizontalisht (boshti X).", + "th": "ทำให้กล้องติดตามเฉพาะแกน X (แนวนอน) เท่านั้น โดย **เอาเครื่องหมายเช็คออก** จาก checkbox นี้", + "uk": "**Зняти позначку** з осі Y (вертикальної), щоб камера слідкувала за персонажем тільки горизонтально (по осі X).", + "zh": "取消 Y 轴(垂直)复选框,使摄像机只在水平方向(X 轴)上跟随角色。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#object-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "That's it! Now the camera will **follow our player only horizontally**!", + "fr": "C'est tout ! La caméra va **suivre notre joueur horizontalement** !", + "ar": "هذا كل شيء، الآن ستقوم الكاميرا ب**متابعة الشخصية أفقيًا فقط**!", + "de": "Das ist es! Jetzt wird die Kamera **nur horizontal unserem Charakter folgen**!", + "es": "¡Eso es todo! ¡Ahora la cámara **seguirá a nuestro jugador unicamente de manera horizontal**!", + "fi": "Siinä kaikki! Nyt kamera seuraa hahmoa **vain vaakasuunnassa**!", + "it": "Ecco fatto! Ora la telecamera **seguirà il nostro giocatore solo orizzontalmente**!", + "tr": "İşte bu kadar! Artık kamera **sadece oyuncumuzu yatay olarak takip edecek**!", + "ja": "以上です!これでカメラは**キャラクターを水平方向のみ追う**ようになります!", + "ko": "이것으로 끝났습니다! 이제 카메라는 **플레이어를 수평적으로만 따를 것**입니다!", + "pl": "To wszystko! Teraz kamera będzie **śledzić naszego gracza tylko poziomo**!", + "pt": "É isso aí! Agora a câmera **seguirá nosso jogador unicamente de jeito horizontal**!", + "ru": "Вот и всё! Теперь камера будет **следовать за нашим игроком только горизонтально**!", + "sl": "To je to! Zdaj bo kamera **sledila našemu igralcu samo vodoravno**!", + "sq": "Kështu është! Tani kamera do të **ndjekë lojtarin tonë vetëm horizontalisht**!", + "th": "เรียบร้อยแล้ว! กล้องจะ **ติดตามผู้เล่นในแนวนอน**!", + "uk": "Ось і все! Тепер камера буде **слідкувати за нашим гравцем тільки горизонтально**!", + "zh": "就是这样!现在摄像机将**只在水平方向上跟随我们的角色**!" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-layers-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-layer-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Next we will add the background. Open the **Layers** panel.", + "fr": "Ensuite, nous allons ajouter le background, ouvrez le panneau des **calques**.", + "ar": "وفي المرحلة الثانية سنقوم بإضافة الخلفية، فتح لوحة **الطبقات**.", + "de": "Als nächstes fügen wir den Hintergrund hinzu. Öffnen Sie das **Ebenen**-Panel.", + "es": "A continuación, agregaremos el fondo. Abre el panel de **Capas**.", + "fi": "Seuraavaksi lisäämme taustan. Avaa **Kerrokset**-paneeli.", + "it": "Successivamente aggiungeremo lo sfondo. Apri il pannello **Livelli**.", + "tr": "Şimdi arka planı ekleyeceğiz. **Katmanlar** panelini açın.", + "ja": "次に背景を追加します。**レイヤー**パネルを開きます。", + "ko": "다음으로 배경을 추가할 것입니다. **레이어** 패널을 엽니다.", + "pl": "Następnie dodamy tło. Otwórz panel **Warstwy**.", + "pt": "Em seguida, vamos adicionar o fundo. Abra o painel de **Camadas**.", + "ru": "Затем мы добавим фон. Откройте панель **Слои**.", + "sl": "Naslednjič bomo dodali ozadje. Odpri **Plasti** ploščo.", + "sq": "Pastaj do të shtojmë sfondin. Hapni panelin e **Shtresave**.", + "th": "ต่อไปเราจะเพิ่มพื้นหลัง เปิดแผงควบคุม **Layers**", + "uk": "Далі ми додамо фон. Відкрийте панель **Шари**.", + "zh": "接下来我们将添加背景。打开**图层**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#layer-0 #layer-selected-unchecked", + "nextStepTrigger": { + "presenceOfElement": "#layer-0 #layer-selected-checked" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now select the Background **layer** so we can start adding objects to it.", + "fr": "Sélectionnez maintenant le **calque** Background afin que nous puissions commencer à y ajouter des objets.", + "ar": "والآن تحديد هذه **الطبقة** حتى نتمكن من بدء إضافة كائنات فيه.", + "de": "Wählen Sie jetzt diese Hintergrund-**Ebene** aus, damit wir anfangen können, Objekte hinzuzufügen.", + "es": "Ahora selecciona la **capa** Background para que podamos empezar a agregarle objetos.", + "fi": "Valitse nyt tämä **kerros**, jotta voimme alkaa lisätä siihen objekteja.", + "it": "Seleziona ora questo **livello** di sfondo in modo che possiamo iniziare ad aggiungervi degli oggetti.", + "tr": "Şimdi bu Arkaplan **katmanını** seçin, böylece üzerine nesneler eklemeye başlayabiliriz.", + "ja": "次にこの背景の**レイヤー**を選択して、そこにオブジェクトを追加できるようにします。", + "ko": "이제 이 배경 **레이어**를 선택하여 여기에 오브젝트를 추가할 수 있도록 합시다.", + "pl": "Teraz wybierz ten **poziom** tła, abyśmy mogli zacząć dodawać do niego obiekty.", + "pt": "Agora selecione a **camada** Background para que possamos começar a adicionar objetos a ela.", + "ru": "Теперь выберите этот **слой** фона, чтобы мы могли начать добавлять объекты.", + "sl": "Zdaj izberite ta **sloj** ozadja, da lahko začnemo dodajati predmete nanj.", + "sq": "Tani zgjidhni këtë **shtresë** sfondi që të mund të fillojmë të shtojmë objekte në të.", + "th": "เลือกเลเยอร์นี้เป็น **เลเยอร์เริ่มต้น** เอาไว้สำหรับเพิ่มวัตถุเข้าไป", + "uk": "Тепер виберіть цей **шар** фону, щоб ми могли почати додавати об'єкти.", + "zh": "现在选择这个背景**图层**,这样我们就可以开始向其中添加对象。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開きます。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri **Predmete** ploščo.", + "sq": "Hapni panelin e **Objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:farBackground", + "nextStepTrigger": { + "instanceAddedOnScene": "farBackground" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Perfect! Now let's add **$(farBackground)** to our game by dragging it to the center.", + "fr": "Parfait ! Ajoutons maintenant **$(farBackground)** à notre jeu en le faisant glisser au centre.", + "ar": "ممتاز! الآن هيّا نقوم بإضافة الـ **$(farBackground)** إلى لعبتنا بسحبه إلى المركز.", + "de": "Perfekt! Fügen wir **$(farBackground)** jetzt unserem Spiel hinzu, indem wir es in die Mitte ziehen.", + "es": "¡Perfecto! Ahora agreguemos **$(farBackground)** a nuestro juego arrastrándolo al centro.", + "fi": "Loistavaa! Lisätään **$(farBackground)** peliimme vetämällä se keskelle.", + "it": "Perfetto! Ora aggiungiamo **$(farBackground)** al nostro gioco trascinandolo al centro.", + "tr": "Harika! Şimdi **$(farBackground)**'ı merkeze sürükleyerek oyunumuza ekleyelim.", + "ja": "完璧です!**$(farBackground)** を中央にドラッグしてゲームに追加しましょう。", + "ko": "완벽합니다! 이제 **$(farBackground)**를 가운데로 끌어서 게임에 추가해 봅시다.", + "pl": "Doskonale! Teraz dodajmy **$(farBackground)** do naszej gry, przeciągając go do środka.", + "pt": "Perfeito! Agora vamos adicionar **$(farBackground)** ao nosso jogo, arrastando-o para o centro.", + "ru": "Отлично! Теперь добавим **$(farBackground)** в нашу игру, перетащив его в центр.", + "sl": "Odlično! Sedaj dodajmo **$(farBackground)** v našo igro tako, da ga povlečemo v sredino.", + "sq": "E shkëlqyer! Tani le të shtojmë **$(farBackground)** në lojën tonë duke e tërhequr në qendër.", + "th": "สมบูรณ์แบบ! ทีนี้เพิ่ม **$(farBackground)** ไปยังเกมของเราโดยลากมันไปวางตรงกลาง", + "uk": "Чудово! Тепер додамо **$(farBackground)** до нашої гри, перетягнувши його в центр.", + "zh": "完美!现在让我们把**$(farBackground)**拖到中间,添加到我们的游戏中。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Perfect! Now let's add **$(farBackground)** to our game by **selecting** then **dragging** it to the center.", + "fr": "Parfait ! Ajoutons maintenant **$(farBackground)** à notre jeu en le **sélectionnant** puis en le faisant glisser au centre.", + "ar": "ممتاز! الآن هيّا نقوم بإضافة الـ **$(farBackground)** إلى لعبتنا بـ**تحديده** ثم **سحبه** إلى المركز.", + "de": "Perfekt! Fügen wir **$(farBackground)** jetzt unserem Spiel hinzu, indem wir es **auswählen** und dann in die Mitte **ziehen**.", + "es": "¡Perfecto! Ahora agreguemos **$(farBackground)** a nuestro juego **seleccionándolo** y luego arrastrándolo al centro.", + "fi": "Loistavaa! Lisätään **$(farBackground)** peliimme **valitsemalla** ja sitten **vetämällä** se keskelle.", + "it": "Perfetto! Ora aggiungiamo **$(farBackground)** al nostro gioco **selezionandolo** e poi trascinandolo al centro.", + "tr": "Harika! Şimdi **$(farBackground)**'ı oyunumuza **seçerek** ve ardından merkeze **sürükleyerek** ekleyelim.", + "ja": "完璧です!**$(farBackground)** を**選択**してから中央に**ドラッグ**してゲームに追加しましょう。", + "ko": "완벽합니다! 이제 **$(farBackground)**를 **선택**한 다음 가운데로 **끌어서** 게임에 추가해 봅시다.", + "pl": "Doskonale! Teraz dodajmy **$(farBackground)** do naszej gry, **wybierając** go, a następnie **przeciągając** do środka.", + "pt": "Perfeito! Agora vamos adicionar **$(farBackground)** ao nosso jogo, **selecionando** e depois arrastando-o para o centro.", + "ru": "Отлично! Теперь добавим **$(farBackground)** в нашу игру, **выбрав** его и затем **перетащив** в центр.", + "sl": "Odlično! Sedaj dodajmo **$(farBackground)** v našo igro tako, da ga **izberemo** in nato **povlečemo** v sredino.", + "sq": "E shkëlqyer! Tani le të shtojmë **$(farBackground)** në lojën tonë duke e **zgjedhur** atë, pastaj duke e **tërhequr** në qendër.", + "th": "สมบูรณ์แบบ! ทีนี้เพิ่ม **$(farBackground)** ไปยังเกมของเราโดย **เลือก** แล้ว **ลาก** มันไปวางตรงกลาง", + "uk": "Чудово! Тепер додамо **$(farBackground)** до нашої гри, **вибравши** його, а потім **перетягнувши** в центр.", + "zh": "完美!现在让我们通过**选择**然后**拖动**到中间,把**$(farBackground)**添加到我们的游戏中。" + } + }, + "placement": "top" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Fertig", + "es": "Ya terminé", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Zakończono", + "pt": "Terminei", + "ru": "Я закончил", + "sl": "Končano", + "sq": "Përfundoa", + "th": "ฉันทำเสร็จแล้ว", + "uk": "Закінчено", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "See the **black rectangular frame** in the middle of the scene? That is the **camera view**. It frames the part of the game that the player will see.\n\nResize the **$(farBackground)** object so it covers the whole camera view.", + "fr": "Vous voyez le **cadre rectangulaire noir** au milieu de la scène ? C'est la **vue de la caméra**. Il encadre la partie du jeu que le joueur verra.\n\nRedimensionnez l'objet **$(farBackground)** afin qu'il couvre toute la vue de la caméra.", + "ar": "هل يمكنك رؤية **الإطار المستطيلي الأسود** في منتصف المشهد؟ ها هو **رؤية الكاميرا**. إنه يحيط بالجزء الذي يمكن للاعبين رؤيته من اللعبة.\n\nإعادة ضبط حجم الـ **$(farBackground)** لتغطى رؤية الكاميرا بالكامل.", + "de": "Siehst du den **schwarzen rechteckigen Rahmen** in der Mitte der Szene? Das ist die **Kameraperspektive**. Sie umrahmt den Teil des Spiels, den der Spieler sehen wird.\n\nÄndere die Größe des Objekts **$(farBackground)**, damit es die gesamte Kameraperspektive abdeckt.", + "es": "¿Ves el **marco rectangular negro** en el medio de la escena? Esa es la **vista de la cámara**. Sirve para enmarcar la parte del juego que verá el jugador.\n\nCambia el tamaño del objeto **$(farBackground)** para que cubra toda la vista de la cámara.", + "fi": "Näetkö mustan suorakulmion kehyksen kohtauksen keskellä? Se on kameranäkymä. Se rajaa osan pelistä, jonka pelaaja näkee.\n\nMuuta objektin **$(farBackground)** kokoa niin, että se peittää koko kameranäkymän.", + "it": "Vedi il **cornice rettangolare nero** al centro della scena? Questa è la **visuale della telecamera**. Incornicia la parte del gioco che il giocatore vedrà.\n\nRidimensiona l'oggetto **$(farBackground)** in modo che copra l'intera vista della telecamera.", + "tr": "Ortadaki **siyah dikdörtgen çerçeveyi** görebiliyor musunuz? Bu, **kamera görüşü**dür. Oyuncunun göreceği oyunun bir kısmını çerçeveler.\n\n**$(farBackground)** nesnesinin boyutunu ayarlayarak, tüm kamera görüşünü kaplayacak şekilde değiştirin.", + "ja": "シーンの中央にある**黒い長方形の枠**を見てください。それが**カメラビュー**です。プレイヤーが見るゲームの一部をフレーム内に収めます。\n\n**$(farBackground)**オブジェクトをリサイズして、カメラビュー全体を覆うようにします。", + "ko": "장면 중앙에 있는 **검은 직사각형 프레임**을(를) 보세요? 이것이 **카메라 뷰**입니다. 플레이어가 볼 게임의 일부를 프레임 안에 포함시킵니다.\n\n**$(farBackground)** 객체의 크기를 조정하여 전체 카메라 뷰를 덮도록 합니다.", + "pl": "Zauważ **czarną prostokątną ramkę** pośrodku sceny? To **widok kamery**. Ogranicza on część gry, którą gracz będzie widział.\n\nZmień rozmiar obiektu **$(farBackground)** tak, aby pokrywał całą widok kamery.", + "pt": "Você ve a **moldura retangular preta** no meio da cena? Essa é a **visão da câmera**. Ela enquadra a parte do jogo que o jogador verá.\n\nVamos redimensionar o objeto **$(farBackground)** para que ele cubra todo o retângulo preto.", + "ru": "Видите **черный прямоугольный кадр** посередине сцены? Это **вид камеры**. Он ограничивает часть игры, которую увидит игрок.\n\nИзмените размер объекта **$(farBackground)** так, чтобы он покрывал весь вид камеры.", + "sl": "Vidite **črni pravokotni okvir** na sredini prizora? To je **kamerna perspektiva**. Okvirja del igre, ki ga bo igralec videl.\n\nSpremenite velikost predmeta **$(farBackground)**, da pokrije celotno kamerno perspektivo.", + "sq": "Shihni **kornizën e zezë e drejtkëndëshit** në mes të skenës? Kjo është **pamja e kamerës**. Ajo përcakton pjesën e lojës që lojtari do të shohë.\n\nRregulloni madhësinë e objektit **$(farBackground)** që të mbulojë tërë pamjen e kamerasë.", + "th": "เห็น **สี่เหลี่ยมสีดำ** ตรงกลางของ scene ไหม? นั่นคือ**มุมมองกล้อง** เป็นมุมมองที่ผู้เล่นจะมองเห็นเกม\n\nปรับขนาดวัตถุ **$(farBackground)** เพื่อให้ครอบคลุมสี่เหลี่ยมสีดำทั้งหมด", + "uk": "Бачите **чорний прямокутний кадр** посередині сцени? Це **вид камери**. Він обмежує частину гри, яку побачить гравець.\n\nЗмініть розмір об'єкта **$(farBackground)** так, щоб він покривав весь вид камери.", + "zh": "看到场景中间的**黑色矩形框**了吗?那是**摄像机视图**。它框住了玩家将看到的游戏部分。\n\n调整**$(farBackground)**对象的大小,使其覆盖整个摄像机视图。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Ni4yODcgMTc3LjEyMSA0MDIuNTczIDEyNC4zMzkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3QgeD0iNTYuMzY2IiB5PSIyODguNjg1IiB3aWR0aD0iNDAyLjQ5NCIgaGVpZ2h0PSIxMi43NzUiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEyMiwgOTUsIDk1KTsiLz4KICA8cmVjdCB4PSI1Ni4yODciIHk9IjE3OC4yNSIgd2lkdGg9IjExLjEwMiIgaGVpZ2h0PSIxMTAuMzU5IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigxMjIsIDk1LCA5NSk7Ii8+CiAgPHJlY3QgeD0iNDQ3LjIzMyIgeT0iMTc4LjM0IiB3aWR0aD0iMTEuMjA5IiBoZWlnaHQ9IjExMC4zNTkiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEyMiwgOTUsIDk1KTsiLz4KICA8cmVjdCB4PSIxNDMuNTcyIiB5PSIxNzcuMTIxIiB3aWR0aD0iMjE3LjM2NyIgaGVpZ2h0PSIxMjMuOTM5IiBzdHlsZT0iZmlsbDogcmdiKDIxNiwgMjE2LCAyMTYpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbC1vcGFjaXR5OiAwOyIvPgogIDxyZWN0IHg9IjE0My45ODQiIHk9IjE3Ny40MDYiIHdpZHRoPSIyMTYuNTIxIiBoZWlnaHQ9IjEyMy41MjUiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDQ3LCAyNDIsIDQzKTsiLz4KPC9zdmc+" + } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開きます。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri **Predmete** ploščo.", + "sq": "Hapni panelin e **Objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:midBackground", + "nextStepTrigger": { + "instanceAddedOnScene": "midBackground" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's do the same with another background to give a parallax effect! Drag **$(midBackground)** from the menu to the canvas.", + "fr": "Faisons la même chose avec un autre fond pour donner un effet de parallaxe ! Glissez **$(midBackground)** depuis le menu vers la scène.", + "ar": "هيّا نقوم بنفس الشيء مع الخلفية الأخرى لإعطاء تأثير المنظور! سحب **$(midBackground)** من القائمة إلى اللوحة.", + "de": "Machen wir das Gleiche mit einem anderen Hintergrund, um einen Parallax-Effekt zu erzielen! Ziehen Sie **$(midBackground)** aus dem Menü auf die Leinwand.", + "es": "¡Hagamos lo mismo con otro fondo para dar un efecto de paralaje! Arrastre **$(midBackground)** desde el menú a la escena.", + "fi": "Tehdään sama toisen taustan kanssa, jotta saadaan aikaan parallaksivaikutus! Vedä **$(midBackground)** valikosta kankaalle.", + "it": "Facciamo la stessa cosa con un altro sfondo per dare un effetto parallasse! Trascina **$(midBackground)** dal menu alla scena.", + "tr": "Şimdi arka planı eklemek için aynısını başka bir arka planla yapalım ve paralaks etkisi verelim! **$(midBackground)**'ı menüden tuvale sürükleyin.", + "ja": "パララックス効果を与えるために、別の背景にも同じことをしましょう!メニューから**$(midBackground)**をキャンバスにドラッグします。", + "ko": "패럴랙스 효과를 주기 위해 다른 배경에도 같은 작업을 해 봅시다! 메뉴에서 **$(midBackground)**를 캔버스로 끌어서 추가합니다.", + "pl": "Zróbmy to samo z innym tłem, aby nadać efekt paralaksy! Przeciągnij **$(midBackground)** z menu na płótno.", + "pt": "Vamos fazer o mesmo com outro fundo para dar um efeito de paralaxe! Arraste **$(midBackground)** do menu para a cena.", + "ru": "Сделаем то же самое с другим фоном, чтобы создать эффект параллакса! Перетащите **$(midBackground)** из меню на холст.", + "sl": "Naredimo enako z drugim ozadjem, da dobimo paralaksni učinek! Povlecite **$(midBackground)** iz menija na platno.", + "sq": "Le të bëjmë të njëjtën gjë me një sfond tjetër për të dhënë një efekt paralaks! Tërhiqni **$(midBackground)** nga menuja në kanavacë.", + "th": "ทำอย่างเดียวกันกับพื้นหลังอื่นจะทำให้เกิดเอฟเฟกต์พารัลแลกซ์! ลาก **$(midBackground)** จากเมนูไปยัง scene", + "uk": "Зробимо те ж саме з іншим фоном, щоб створити ефект паралаксу! Перетягніть **$(midBackground)** з меню на полотно.", + "zh": "让我们用另一个背景做同样的事情,给出视差效果!从菜单中拖动**$(midBackground)**到画布上。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Let's do the same with another background to give a parallax effect! **Select**, then **drag** **$(midBackground)** from the menu to the canvas.", + "fr": "Faisons la même chose avec un autre fond pour donner un effet de parallaxe ! **Sélectionnez**, puis **glissez** **$(midBackground)** depuis le menu vers la scène.", + "ar": "هيّا نقوم بنفس الشيء مع الخلفية الأخرى لإعطاء تأثير المنظور! **تحديد** و**سحب** الـ **$(midBackground)** من القائمة إلى اللوحة.", + "de": "Machen wir das Gleiche mit einem anderen Hintergrund, um einen Parallax-Effekt zu erzielen! **Wählen** und dann **ziehen** Sie **$(midBackground)** aus dem Menü auf die Leinwand.", + "es": "¡Hagamos lo mismo con otro fondo para dar un efecto de paralaje! **Seleccione**, luego **arrastre** **$(midBackground)** desde el menú a la escena.", + "fi": "Tehdään sama toisen taustan kanssa, jotta saadaan aikaan parallaksivaikutus! **Valitse** ja **vedä** **$(midBackground)** valikosta kankaalle.", + "it": "Facciamo la stessa cosa con un altro sfondo per dare un effetto parallasse! **Seleziona**, poi **trascina** **$(midBackground)** dal menu alla scena.", + "tr": "Şimdi arka planı eklemek için aynısını başka bir arka planla yapalım ve paralaks etkisi verelim! **$(midBackground)**'ı menüden **seçin** ve tuvale **sürükleyin**.", + "ja": "パララックス効果を与えるために、別の背景にも同じことをしましょう!**選択**してから**ドラッグ**して**$(midBackground)**をメニューからキャンバスに追加します。", + "ko": "패럴랙스 효과를 주기 위해 다른 배경에도 같은 작업을 해 봅시다! **선택**한 다음 **끌어서** 메뉴에서 **$(midBackground)**를 캔버스로 추가합니다.", + "pl": "Zróbmy to samo z innym tłem, aby nadać efekt paralaksy! **Wybierz**, a następnie **przeciągnij** **$(midBackground)** z menu na płótno.", + "pt": "Vamos fazer o mesmo com outro fundo para dar um efeito de paralaxe! **Selecione**, em seguida, **arraste** **$(midBackground)** do menu para a cena.", + "ru": "Сделаем то же самое с другим фоном, чтобы создать эффект параллакса! **Выберите**, затем **перетащите** **$(midBackground)** из меню на холст.", + "sl": "Naredimo enako z drugim ozadjem, da dobimo paralaksni učinek! **Izberite** in nato **povlecite** **$(midBackground)** iz menija na platno.", + "sq": "Le të bëjmë të njëjtën gjë me një sfond tjetër për të dhënë një efekt paralaks! **Zgjidhni**, pastaj **tërhiqni** **$(midBackground)** nga menuja në kanavacë.", + "th": "ทำอย่างเดียวกันกับพื้นหลังอื่นจะทำให้เกิดเอฟเฟกต์พารัลแลกซ์! **เลือก** แล้ว **ลาก** **$(midBackground)** จากเมนูไปยัง scene", + "uk": "Зробимо те ж саме з іншим фоном, щоб створити ефект паралаксу! **Виберіть**, а потім **перетягніть** **$(midBackground)** з меню на полотно.", + "zh": "让我们用另一个背景做同样的事情,给出视差效果!**选择**,然后**拖动** **$(midBackground)**从菜单到画布上。" + } + }, + "placement": "top" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Fertig", + "es": "Ya terminé", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Zakończono", + "pt": "Terminei", + "ru": "Я закончил", + "sl": "Končano", + "sq": "Përfundoa", + "th": "ฉันทำเสร็จแล้ว", + "uk": "Закінчено", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "Same as for the $(farBackground) object, resize the **$(midBackground)** object so that it covers the whole black rectangle.", + "fr": "Comme pour l'objet $(farBackground), redimensionnez l'objet **$(midBackground)** de sorte qu'il couvre tout le rectangle noir.", + "ar": "نفس الشيء مع الكائن $(farBackground)، إعادة ضبط حجم الـ **$(midBackground)** لتغطي المستطيل الأسود بالكامل.", + "de": "Genauso wie beim $(farBackground)-Objekt, ändern Sie die Größe des **$(midBackground)**-Objekts, damit es das gesamte schwarze Rechteck abdeckt.", + "es": "Al igual que con el objeto $(farBackground), redimensiona el objeto **$(midBackground)** para que cubra todo el rectángulo negro.", + "fi": "Samoin kuin $(farBackground)-objektin kanssa, muuta **$(midBackground)**-objektin kokoa niin, että se peittää koko mustan suorakulmion.", + "it": "Stesso procedimento per l'oggetto $(farBackground), ridimensionare l'oggetto $(midBackground) in modo che copra l'intero rettangolo nero.", + "tr": "$(farBackground) nesnesiyle aynı şekilde, **$(midBackground)** nesnesinin boyutunu ayarlayarak, tüm siyah dikdörtgeni kaplayacak şekilde değiştirin.", + "ja": "$(farBackground)オブジェクトと同様に、**$(midBackground)**オブジェクトをリサイズして、黒い長方形全体を覆うようにしてください。", + "ko": "$(farBackground) 객체와 동일하게 $(midBackground) 객체의 크기를 조정하여 전체 검은 직사각형을 덮도록 합니다.", + "pl": "Tak samo jak dla obiektu $(farBackground), zmień rozmiar obiektu $(midBackground) tak, aby pokrywał cały czarny prostokąt.", + "pt": "Da mesma forma que o objeto $(farBackground), redimensione o objeto **$(midBackground)** para que ele cubra todo o retângulo preto.", + "ru": "То же самое, что и для объекта $(farBackground), измените размер объекта **$(midBackground)** так, чтобы он покрывал весь черный прямоугольник.", + "sl": "Isto velja za objekt $(farBackground), spremenite velikost objekta **$(midBackground)**, da pokrije celoten črn pravokotnik.", + "sq": "Njësoj si për objektin $(farBackground), ri-dimensiononi objektin **$(midBackground)** në mënyrë që të mbulojë tërësi pranë e hollit të zi.", + "th": "เช่นเดียวกันกับวัตถุ $(farBackground), ปรับขนาดวัตถุ **$(midBackground)** เพื่อให้ครอบคลุมสี่เหลี่ยมสีดำทั้งหมด", + "uk": "Те саме, що й для об'єкта $(farBackground), змініть розмір об'єкта **$(midBackground)** так, щоб він покривав весь чорний прямокутник.", + "zh": "与$(farBackground)对象一样,调整**$(midBackground)**对象的大小,使其覆盖整个黑色矩形。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Ni4yODcgMTc3LjEyMSA0MDIuNTczIDEyNC4zMzkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3QgeD0iNTYuMzY2IiB5PSIyODguNjg1IiB3aWR0aD0iNDAyLjQ5NCIgaGVpZ2h0PSIxMi43NzUiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEyMiwgOTUsIDk1KTsiLz4KICA8cmVjdCB4PSI1Ni4yODciIHk9IjE3OC4yNSIgd2lkdGg9IjExLjEwMiIgaGVpZ2h0PSIxMTAuMzU5IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigxMjIsIDk1LCA5NSk7Ii8+CiAgPHJlY3QgeD0iNDQ3LjIzMyIgeT0iMTc4LjM0IiB3aWR0aD0iMTEuMjA5IiBoZWlnaHQ9IjExMC4zNTkiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEyMiwgOTUsIDk1KTsiLz4KICA8cmVjdCB4PSIxNDMuNTcyIiB5PSIxNzcuMTIxIiB3aWR0aD0iMjE3LjM2NyIgaGVpZ2h0PSIxMjMuOTM5IiBzdHlsZT0iZmlsbDogcmdiKDIxNiwgMjE2LCAyMTYpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbC1vcGFjaXR5OiAwOyIvPgogIDxyZWN0IHg9IjE0My45ODQiIHk9IjE3Ny40MDYiIHdpZHRoPSIyMTYuNTIxIiBoZWlnaHQ9IjEyMy41MjUiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDQ3LCAyNDIsIDQzKTsiLz4KPC9zdmc+" + } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "editorTab:cameraScene:EventsSheet", + "nextStepTrigger": { + "presenceOfElement": "#events-editor[data-active]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's make those **Backgrounds move**! Let's **open the Events Sheet** of your scene $(cameraScene).", + "fr": "Maintenant, faisons en sorte que ces **fonds se déplacent** ! Ouvrons la **feuille d'événements** de la scène $(cameraScene).", + "ar": "الآن لنجعل تلك **الخلفيات تتحرك**! هيّا **نفتح صفحة أحداث** المشهد $(cameraScene).", + "de": "Lassen Sie uns jetzt diese **Hintergründe bewegen**! Öffnen Sie das **Ereignisblatt** Ihrer Szene $(cameraScene).", + "es": "¡Ahora hagamos que esos **fondos se muevan**! Abramos la **hoja de eventos** de tu escena $(cameraScene).", + "fi": "Nyt annetaan **taustojen liikkua**! Avataan $(cameraScene)-kohtauksesi **Tapahtumataulu**.", + "it": "Ora facciamo muovere quei **sfondi**! Apriamo il **foglio eventi** della tua scena $(cameraScene).", + "tr": "Şimdi bu **Arkaplanları hareket ettirelim**! $(cameraScene) sahnenizin **Olaylar Sayfasını", + "ja": "それでは、**背景を動かしましょう**!**$(cameraScene)**の**イベントシート**を開きます。", + "ko": "이제 **배경을 움직이게** 해 봅시다! **$(cameraScene)**의 **이벤트 시트**를 엽니다.", + "pl": "Teraz sprawmy, że te **tła się poruszają**! Otwórz **arkusz zdarzeń** sceny $(cameraScene).", + "pt": "Agora vamos fazer com que esses **fundos se movam**! Vamos **abrir a Folha de Eventos** de tua cena $(cameraScene).", + "ru": "Теперь давайте заставим эти **фоны двигаться**! Откройте **таблицу событий** вашей сцены $(cameraScene).", + "sl": "Sedaj bomo naredili, da se **ozadja premikajo**! Odprite **tabelo dogodkov** vaše scene $(cameraScene).", + "sq": "Tani le të bëjmë që **sfondot të lëvizin**! Hapni **tabelën e ngjarjeve** të skenës $(cameraScene).", + "th": "ทีนี้มาทำให้ **พึ้นหลังเคลื่อนที่** กันเถอะ! โดย **เปิดชี้ทอีเวนต์** ของ scene $(cameraScene)", + "uk": "Тепер давайте зробимо, щоб ці **фони рухалися**! Відкрийте **таблицю подій** вашої сцени $(cameraScene).", + "zh": "现在让我们让这些**背景移动**!让我们打开你的场景$(cameraScene)的**事件表**。" + } + }, + "placement": "bottom" + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "#events-editor[data-active] #event-1-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's **add an action** to make the first background move.", + "fr": "**Ajoutons une action** pour faire bouger le premier fond.", + "ar": "هيّا نقوم ب**إضافة إجراء** لجعل الخلفية الأولى تتحرك.", + "de": "**Fügen wir eine Aktion hinzu**, um den ersten Hintergrund zu bewegen.", + "es": "**Agreguemos una acción** para hacer que el primer fondo se mueva.", + "fi": "Lisätään **toiminto**, jotta ensimmäinen tausta liikkuu.", + "it": "**Aggiungiamo un'azione** per far muovere il primo sfondo.", + "tr": "İlk arkaplanın hareket etmesi için bir **eylem ekleyelim**.", + "ja": "最初の背景を動かすために**アクションを追加**しましょう。", + "ko": "첫 번째 배경을 움직이게 하기 위해 **동작을 추가**해 봅시다.", + "pl": "Dodajmy **akcję**, aby pierwsze tło się poruszało.", + "pt": "**Adicione uma ação** para fazer o primeiro plano de fundo se mover.", + "ru": "Добавим **действие**, чтобы заставить первый фон двигаться.", + "sl": "**Dodajmo dejanje**, da se premakne prvo ozadje.", + "sq": "Le të **shtojmë një veprim** për të bërë sfondin e parë të lëvizë.", + "th": "**เพิ่มการกระทำ** เพื่อทำให้พื้นหลังแรกเคลื่อนที่", + "uk": "Додаймо **дію**, щоб зробити перший фон рухливим.", + "zh": "让我们**添加一个动作**来让第一个背景移动。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:farBackground", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TiledSpriteObject--XOffset" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(farBackground)**.", + "fr": "Sélectionnez **$(farBackground)**.", + "ar": "تحديد **$(farBackground)**.", + "de": "Wählen Sie **$(farBackground)**.", + "es": "Seleccione **$(farBackground)**.", + "fi": "Valitse **$(farBackground)**.", + "it": "Seleziona **$(farBackground)**.", + "tr": "**$(farBackground)**'ı seçin.", + "ja": "**$(farBackground)**を選択します。", + "ko": "**$(farBackground)**를 선택합니다.", + "pl": "Wybierz **$(farBackground)**.", + "pt": "Selecione **$(farBackground)**.", + "ru": "Выберите **$(farBackground)**.", + "sl": "Izberite **$(farBackground)**.", + "sq": "Zgjidh **$(farBackground)**.", + "th": "เลือก **$(farBackground)**", + "uk": "Виберіть **$(farBackground)**.", + "zh": "选择**$(farBackground)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TiledSpriteObject--XOffset", + "nextStepTrigger": { + "presenceOfElement": "#parameter-1-operator-field" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the action **Image X offset**.", + "fr": "Sélectionnez l'action **Décalage X de l'image**.", + "ar": "تحديد الإجراء **إزاحة الصورة أفقيًا**.", + "de": "Wählen Sie die Aktion **Bild-X-Versatz**.", + "es": "Seleccione la acción **Desplazamiento X de la imagen**.", + "fi": "Valitse toiminto **Kuvan X-siirto**.", + "it": "Seleziona l'azione **Spostamento X dell'immagine**.", + "tr": "Eylemi **Resim X ofseti** seçin.", + "ja": "アクション **Image X offset**を選択します。", + "ko": "동작 **이미지 X 오프셋**을 선택합니다.", + "pl": "Wybierz akcję **Przesunięcie X obrazu**.", + "pt": "Selecione a ação **Deslocamento X da imagem**.", + "ru": "Выберите действие **Смещение изображения по X**.", + "sl": "Izberite dejanje **Slikovni X zamik**.", + "sq": "Zgjidh veprimin **Offset i X i imazhit**.", + "th": "เลือกการกระทำ **Image X ออฟเซ็ท**", + "uk": "Виберіть дію **Зміщення зображення по X**.", + "zh": "选择动作**图像X偏移**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "CameraCenterX()/8" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's make the far background move,\n\n The way we do it is by making it move relatively to the position of the camera.\n\n If the player moves, the camera moves too, so we make the background follow the camera center horizontally (X), but **way slower** to give an effect of depth.\n\n Type the formula `CameraCenterX()/8`.", + "fr": "Faisons bouger le fond lointain,\n\n La façon de le faire est de le faire bouger par rapport à la position de la caméra.\n\n Si le joueur se déplace, la caméra se déplace aussi, donc nous faisons en sorte que le fond suive le centre de la caméra horizontalement (X), mais **beaucoup plus lentement** pour donner un effet de profondeur.\n\n Tapez la formule `CameraCenterX()/8`.", + "ar": "هيّا نجعل الخلفية البعيدة تتحرك، طريقة فعل ذلك هي بجعلها تتحرك نسبيًا إلى إحداثية الكاميرا.\n\n إذا تحركت الشخصية فستتحرك الكاميرا أيضًا، لذلك نجعل الخلفية تتتبع مركز الكاميرا أفقيًا، ولكن **أبطأ** لمنح شعور العمق، إدخال الصيغة `CameraCenterX()/8`.", + "de": "Lassen Sie uns den fernen Hintergrund bewegen,\n\n Die Art und Weise, wie wir das machen, ist, dass er sich relativ zur Position der Kamera bewegt.\n\n Wenn der Spieler sich bewegt, bewegt sich auch die Kamera, also machen wir den Hintergrund, dass er dem Kameramittelpunkt horizontal (X) folgt, aber **viel langsamer**, um einen Tiefeneffekt zu erzielen.\n\n Geben Sie die Formel `CameraCenterX()/8` ein.", + "es": "Hagamos que el fondo lejano se mueva,\n\n La forma de hacerlo es hacer que se mueva en relación con la posición de la cámara.\n\n Si el jugador se mueve, la cámara también se mueve, por lo que hacemos que el fondo siga el centro de la cámara horizontalmente (X), pero **mucho más lento** para dar un efecto de profundidad.\n\n Escribe la fórmula `CameraCenterX()/8`.", + "fi": "Tehdään kaukainen tausta liikkuvaksi,\n\n Teemme sen liikkumaan kameran sijaintiin nähden.\n\n Jos pelaaja liikkuu, myös kamera liikkuu, joten teemme taustan seuraamaan kameran keskikohtaa vaakasuunnassa (X), mutta **paljon hitaammin** luodaksemme syvyyden vaikutelman.\n\n Kirjoita kaava `CameraCenterX()/8`.", + "it": "Facciamo muovere lo sfondo lontano,\n\n Il modo in cui lo facciamo è facendolo muovere relativamente alla posizione della telecamera.\n\n Se il giocatore si muove, la telecamera si muove anche, quindi facciamo in modo che lo sfondo segua il centro della telecamera orizzontalmente (X), ma **molto più lentamente** per dare un effetto di profondità.\n\n Scrivi la formula `CameraCenterX()/8`.", + "tr": "Uzak arkaplanı hareket ettirelim,\n\n Bunu yapmanın yolu, onu kameranın konumuna göre hareket ettirmektir.\n\n Eğer oyuncu hareket ederse, kamera da hareket eder, bu yüzden arkaplanı kameranın merkezini yatay olarak (X) takip etmesini sağlarız, ama **çok daha yavaş** hareket etmesini sağlarız ki derinlik etkisi yaratsın.\n\n Formülü `CameraCenterX()/8` olarak yazın.", + "ja": "遠景を動かしましょう\n\n 移動させる方法は、カメラの位置に対して相対的に動かすことです。\n\n プレイヤーが動くと、カメラも動くので、背景をカメラの中心に水平方向(X)に追従させますが、**非常に遅く**して奥行きの効果を与えます。\n\n 式に`CameraCenterX()/8`を入力します。", + "ko": "먼 배경을 움직이게 합시다,\n\n 이를 하는 방법은 카메라의 위치에 상대적으로 움직이도록 하는 것입니다.\n\n 플레이어가 움직이면 카메라도 움직이기 때문에 배경이 카메라 중앙을 수평(X)으로 따라가지만 **훨씬 느리게** 하여 깊이 효과를 줍니다.\n\n 식에 `CameraCenterX()/8`를 입력합니다.", + "pl": "Pozwólmy dalekiemu tłu poruszać się,\n\n Sposób, w jaki to robimy, polega na tym, że porusza się on względem pozycji kamery.\n\n Jeśli gracz się porusza, kamera też się porusza, więc sprawiamy, że tło podąża za środkiem kamery w poziomie (X), ale **dużo wolniej**, aby uzyskać efekt głębi.\n\n Wpisz wzór `CameraCenterX()/8`.", + "pt": "Vamos fazer o fundo distante se mover,\n\n A maneira como fazemos isso é fazendo com que ele se mova em relação à posição da câmera.\n\n Se o jogador se mover, a câmera também se move, então fazemos o fundo seguir o centro da câmera horizontalmente (X), mas **muito mais devagar** para dar um efeito de profundidade.\n\n Digite a fórmula `CameraCenterX()/8`.", + "ru": "Давайте заставим дальний фон двигаться,\n\n Способ сделать это - заставить его двигаться относительно положения камеры.\n\n Если игрок двигается, камера тоже двигается, поэтому мы заставляем фон следовать за центром камеры по горизонтали (X), но **намного медленнее**, чтобы создать эффект глубины.\n\n Введите формулу `CameraCenterX()/8`.", + "sl": "Naj bo daleč ozadje premaknjeno,\n\n Način, kako to storimo, je, da se premika glede na položaj kamere.\n\n Če se igralec premika, se premika tudi kamera, zato naredimo, da ozadje sledi središču kamere vodoravno (X), vendar **veliko počasneje**, da ustvari učinek globine.\n\n Vnesite formulo `CameraCenterX()/8`.", + "sq": "Le të bëjmë që sfondi i largët të lëvizë,\n\n Mënyra se si e bëjmë këtë është duke e bërë atë të lëvizë në raport me pozicionin e kamerës.\n\n Nëse lojtari lëviz, kamera lëviz gjithashtu, kështu që bëjmë që sfondi të ndjekë qendrën e kamerës horizontalisht (X), por **shumë më ngadalë** për të dhënë një efekt thellësie.\n\n Shkruani formulën `CameraCenterX()/8`.", + "th": "มาทำให้พื้นหลังไกลเคลื่อนที่\n\nวิธีที่เราทำคือทำให้พื้นหลังเคลื่อนที่เทียบเท่ากับตำแหน่งของกล้อง\n\nถ้าผู้เล่นเคลื่อนที่กล้องก็จะเคลื่อนที่ด้วย ดังนั้นเราจึงทำให้พื้นหลังติดตามตำแหน่งกล้องแนวนอน (X) แต่**เร็วมากกว่า** เพื่อให้มีความลึกลับ\n\nพิมพ์สูตร `CameraCenterX()/8`", + "uk": "Давайте зробимо, щоб далекий фон рухався,\n\n Спосіб зробити це - зробити його рухатися відносно положення камери.\n\n Якщо гравець рухається, камера також рухається, тому ми робимо фон слідувати за центром камери горизонтально (X), але **набагато повільніше**, щоб створити ефект глибини.\n\n Введіть формулу `CameraCenterX()/8`.", + "zh": "让我们让远景移动\n\n 我们的做法是相对于相机的位置使其移动。\n\n 如果玩家移动,相机也会移动,所以我们让背景水平(X)跟随相机中心,但**慢得多**,以产生深度效果。\n\n 输入公式`CameraCenterX()/8`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's save this.", + "fr": "Enregistrons maintenant cela.", + "ar": "جميل! الآن هيّا نحفظ هذا.", + "de": "Lassen Sie uns das jetzt speichern.", + "es": "Ahora guardemos esto.", + "fi": "Nyt tallennetaan tämä.", + "it": "Ora salviamo questo.", + "tr": "Şimdi bunu kaydedelim.", + "ja": "これを保存しましょう。", + "ko": "이제 이것을 저장해 봅시다.", + "pl": "Teraz zapiszmy to.", + "pt": "Agora vamos salvar isso.", + "ru": "Теперь давайте сохраните это.", + "sl": "Sedaj shranimo to.", + "sq": "Tani le të ruajmë këtë.", + "th": "มาบันทึกสิ่งนี้", + "uk": "Тепер давайте збережемо це.", + "zh": "现在让我们保存这个。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#events-editor[data-active] #event-1-actions #add-action-button", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's create the same action for **$(midBackground)**!", + "fr": "Créons la même action pour **$(midBackground)** !", + "ar": "هيّا نقوم بنفس الشيء مع **$(midBackground)**!", + "de": "Lassen Sie uns die gleiche Aktion für **$(midBackground)** erstellen!", + "es": "¡Creemos la misma acción para **$(midBackground)**!", + "fi": "Luodaan sama toiminto **$(midBackground)**!", + "it": "Creiamo la stessa azione per **$(midBackground)**!", + "tr": "**$(midBackground)** için aynı eylemi oluşturalım!", + "ja": "**$(midBackground)**にも同じアクションを作りましょう!", + "ko": "**$(midBackground)**에 대해 동일한 동작을 만들어 봅시다!", + "pl": "Stwórzmy tę samą akcję dla **$(midBackground)**!", + "pt": "Vamos criar a mesma ação para **$(midBackground)**!", + "ru": "Создадим такое же действие для **$(midBackground)**!", + "sl": "Ustvarimo enako dejanje za **$(midBackground)**!", + "sq": "Le të krijojmë veprimin e njëjtë për **$(midBackground)**!", + "th": "สร้างการกระทำเหมือนเดิมสำหรับ **$(midBackground)**!", + "uk": "Створимо таку саму дію для **$(midBackground)**!", + "zh": "让我们为**$(midBackground)**创建相同的动作!" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:midBackground", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TiledSpriteObject--XOffset" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(midBackground)**.", + "fr": "Sélectionnez **$(midBackground)**.", + "ar": "تحديد **$(midBackground)**.", + "de": "Wählen Sie **$(midBackground)**.", + "es": "Selecciona **$(midBackground)**.", + "fi": "Valitse **$(midBackground)**.", + "it": "Seleziona **$(midBackground)**.", + "tr": "**$(midBackground)**'ı seçin.", + "ja": "**$(midBackground)**を選択します。", + "ko": "**$(midBackground)**를 선택합니다.", + "pl": "Wybierz **$(midBackground)**.", + "pt": "Selecione **$(midBackground)**.", + "ru": "Выберите **$(midBackground)**.", + "sl": "Izberite **$(midBackground)**.", + "sq": "Zgjidh **$(midBackground)**.", + "th": "เลือก **$(midBackground)**", + "uk": "Виберіть **$(midBackground)**.", + "zh": "选择**$(midBackground)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TiledSpriteObject--XOffset", + "nextStepTrigger": { + "presenceOfElement": "#parameter-1-operator-field" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the action **Image X offset**.", + "fr": "Sélectionnez l'action **Décalage X de l'image**.", + "ar": "تحديد الإجراء **إزاحة الصورة أفقيًا**.", + "de": "Wählen Sie die Aktion **Bild-X-Versatz**.", + "es": "Selecciona la acción **Desplazamiento X de la imagen**.", + "fi": "Valitse toiminto **Kuvan X-siirto**.", + "it": "Seleziona l'azione **Spostamento X dell'immagine**.", + "tr": "Eylemi **Resim X ofseti** seçin.", + "ja": "アクション **Image X offset**を選択します。", + "ko": "동작 **이미지 X 오프셋**을 선택합니다.", + "pl": "Wybierz akcję **Przesunięcie X obrazu**.", + "pt": "Selecione a ação **Deslocamento X da imagem**.", + "ru": "Выберите действие **Смещение изображения по X**.", + "sl": "Izberite dejanje **Slikovni X zamik**.", + "sq": "Zgjidh veprimin **Offset i X i imazhit**.", + "th": "เลือกการกระทำ **Image X ออฟเซ็ท**", + "uk": "Виберіть дію **Зміщення зображення по X**.", + "zh": "选择动作**图像X偏移**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "CameraCenterX()/3" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "This time let's make this background move **faster**, to give the effect that it is closer to the player,\n\nso let's make the background move **3 times slower** than the camera.\n\n Enter `CameraCenterX()/3`.", + "fr": "Cette fois, faisons en sorte que ce fond se déplace **plus vite**, pour donner l'effet qu'il est plus proche du joueur,\n\nalors faisons en sorte que le fond se déplace **3 fois plus lentement** que la caméra.\n\nEntrez `CameraCenterX()/3`.", + "ar": "هذه المرة سنجعل الخلفية تتحرك **أسرع**، لإعطاء الشعور أنه قريب من الشخصية، \n\n هيّا نجعل الخلفية تتحرك **أسرع بثلاث مرات** من الكاميرا.\n\n إدخال `CameraCenterX()/3`.", + "de": "Dieses Mal lassen Sie uns diesen Hintergrund **schneller** bewegen, um den Effekt zu erzielen, dass er näher am Spieler ist,\n\nalso lassen Sie uns den Hintergrund **3-mal langsamer** als die Kamera bewegen.\n\nGeben Sie `CameraCenterX()/3` ein.", + "es": "Esta vez, hagamos que este fondo se mueva **más rápido**, para dar el efecto de que está más cerca del jugador,\n\nasí que hagamos que el fondo se mueva **3 veces más lento** que la cámara.\n\nIngrese `CameraCenterX()/3`.", + "fi": "Tällä kertaa annetaan tämän taustan liikkua **nopeammin**, jotta saadaan aikaan vaikutelma, että se on lähempänä pelaajaa,\n\njoten annetaan taustan liikkua **3 kertaa hitaammin** kuin kamera.\n\nKirjoita `CameraCenterX()/3`.", + "it": "Questa volta facciamo muovere questo sfondo **più velocemente**, per dare l'effetto che è più vicino al giocatore,\n\nquindi facciamo muovere lo sfondo **3 volte più lentamente** della telecamera.\n\nInserisci `CameraCenterX()/3`.", + "tr": "Bu sefer bu arkaplanın **daha hızlı** hareket etmesini sağlayalım, oyuncuya daha yakın olduğu etkisini vermek için,\n\nbu yüzden arkaplanı kameradan **3 kat daha yavaş** hareket ettirelim.\n\n`CameraCenterX()/3` yazın.", + "ja": "今度はこの背景を**速く**動かし、プレイヤーに近い効果を与えましょう\n\nそのためにカメラより**3倍遅く**背景を動かします。\n\n`CameraCenterX()/3`を入力します。", + "ko": "이번에는 이 배경을 **더 빨리** 움직이게 해서 플레이어에게 더 가까운 효과를 주도록 하겠습니다,\n\n그래서 배경을 카메라보다 **3배 더 느리게** 움직이도록 합시다.\n\n`CameraCenterX()/3`를 입력합니다.", + "pl": "Tym razem pozwólmy temu tłu poruszać się **szybciej**, aby uzyskać efekt, że jest bliżej gracza,\n\nwięc pozwólmy tłu poruszać się **3 razy wolniej** niż kamera.\n\nWpisz `CameraCenterX()/3`.", + "pt": "Desta vez, vamos fazer com que este fundo se mova **mais rápido**, para dar o efeito de que está mais perto do jogador,\n\nentão vamos fazer com que o fundo se mova **3 vezes mais devagar** que a câmera.\n\nDigite `CameraCenterX()/3`.", + "ru": "На этот раз давайте заставим этот фон двигаться **быстрее**, чтобы создать эффект, что он ближе к игроку,\n\nпоэтому давайте заставим фон двигаться **в 3 раза медленнее** камеры.\n\nВведите `CameraCenterX()/3`.", + "sl": "Tokrat naj bo to ozadje premaknjeno **hitreje**, da ustvari učinek, da je bližje igralcu,\n\nzato naj bo ozadje premaknjeno **3-krat počasneje** kot kamera.\n\nVnesite `CameraCenterX()/3`.", + "sq": "Kësaj radhe le të bëjmë që ky sfond të lëvizë **më shpejt**, për të dhënë efektin që është më afër lojtarit,\n\npra le të bëjmë që sfondi të lëvizë **3 herë më ngadalë** se kamera.\n\nShkruani `CameraCenterX()/3`.", + "th": "ในครั้งนี้เราจะทำให้พื้นหลังเคลื่อนที่ **เร็วขึ้น** เพื่อให้มีผลลัพธ์ที่เห็นได้ชัดว่ามันอยู่ใกล้กับผู้เล่นมากขึ้น\n\nดังนั้นเราจะทำให้พื้นหลังเคลื่อนที่ **ช้าลง 3 เท่า** กว่ากล้อง\n\nใส่ `CameraCenterX()/3`", + "uk": "Цього разу давайте зробимо, щоб цей фон рухався **швидше**, щоб створити ефект, що він ближчий до гравця,\n\nтому давайте зробимо, щоб фон рухався **в 3 рази повільніше** за камерою.\n\nВведіть формулу `CameraCenterX()/3`.", + "zh": "这次让我们让这个背景移动**更快**,以产生更接近玩家的效果,\n\n所以让我们让背景移动**比相机慢3倍**。输入`CameraCenterX()/3`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's close this.", + "fr": "Fermons cela.", + "ar": "جميل! لنغلق هذا.", + "de": "Lassen Sie uns das schließen.", + "es": "Cerrémoslo.", + "fi": "Suljetaan tämä.", + "it": "Chiudiamo questo.", + "tr": "Bunu kapatalım.", + "ja": "これを閉じましょう。", + "ko": "이것을 닫아 봅시다.", + "pl": "Zamknijmy to.", + "pt": "Vamos fechar isso.", + "ru": "Давайте закроем это.", + "sl": "Zaprimo to.", + "sq": "Le të mbyllim këtë.", + "th": "ปิดนี้", + "uk": "Давайте закриємо це.", + "zh": "让我们关闭这个。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + "fr": "Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.", + "ar": "حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.", + "de": "Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.", + "fi": "Olemme valmiita! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.", + "it": "abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.", + "tr": "Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.", + "ja": "完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。", + "ko": "우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.", + "pl": "Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.", + "pt": "Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.", + "ru": "Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.", + "sl": "Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。" + } + }, + "placement": "bottom" + } + } + ] +} \ No newline at end of file diff --git a/tutorials/in-app/coopPlatformer.json b/tutorials/in-app/coopPlatformer.json new file mode 100644 index 0000000..e1f55fd --- /dev/null +++ b/tutorials/in-app/coopPlatformer.json @@ -0,0 +1,788 @@ +{ + "id": "coopPlatformer", + "titleByLocale": { + "en": "Let's make a Co-op Multiplayer game", + "fr": "Créons un jeu multijoueur coopératif", + "ar": "لنصنع لعبة جماعية متعددة اللاعبين", + "de": "Lass uns ein Koop-Multiplayer-Spiel machen", + "es": "Hagamos un juego multijugador cooperativo", + "fi": "Tehdään yhteistyöpohjainen moninpeli", + "it": "Facciamo un gioco multigiocatore cooperativo", + "tr": "Bir Kooperatif Çok Oyunculu Oyun Yapalım", + "ja": "協力型のマルチプレイヤーゲームを作ろう", + "ko": "협동 멀티플레이어 게임을 만들자", + "pl": "Zróbmy grę kooperacyjną dla wielu graczy", + "pt": "Vamos fazer um jogo multijogador cooperativo", + "th": "มาสร้างเกมมัลติเพลเยอร์แบบร่วมมือกัน", + "ru": "Давайте сделаем кооперативную многопользовательскую игру", + "sl": "Naredimo kooperativno večigralsko igro", + "sq": "Le të bëjmë një lojë me shumë lojtarë bashkëpunues", + "uk": "Давайте створимо кооперативну багатокористувацьку гру", + "zh": "让我们做一个合作多人游戏" + }, + "bulletPointsByLocale": [ + { + "en": "How to add and configure the multiplayer behavior", + "fr": "Comment ajouter et configurer le comportement multijoueur", + "ar": "كيفية إضافة وتكوين سلوك اللاعبين المتعددين", + "de": "Wie man das Multiplayer-Verhalten hinzufügt und konfiguriert", + "es": "Cómo añadir y configurar el comportamiento multijugador", + "fi": "Kuinka lisätä ja määrittää moninpelikäyttäytyminen", + "it": "Come aggiungere e configurare il comportamento multigiocatore", + "tr": "Çok oyunculu davranışı nasıl ekleyip yapılandırabilirsiniz", + "ja": "マルチプレイヤーの動作を追加して設定する方法", + "ko": "멀티플레이어 동작을 추가하고 구성하는 방법", + "pl": "Jak dodać i skonfigurować zachowanie dla wielu graczy", + "pt": "Como adicionar e configurar o comportamento multijogador", + "th": "วิธีเพิ่มและกำหนดค่าพฤติกรรมผู้เล่นหลายคน", + "ru": "Как добавить и настроить многопользовательское поведение", + "sl": "Kako dodati in konfigurirati vedenje za več igralcev", + "sq": "Si të shtoni dhe konfiguroni sjelljen me shumë lojtarë", + "uk": "Як додати та налаштувати поведінку для кількох гравців", + "zh": "如何添加和配置多人行为" + }, + { + "en": "How an online player can control their character with the multiplayer ownership system", + "fr": "Comment un joueur en ligne peut contrôler son personnage avec le système de propriété multijoueur", + "ar": "كيف يمكن للاعب عبر الإنترنت التحكم في شخصيته باستخدام نظام الملكية المتعددة اللاعبين", + "de": "Wie ein Online-Spieler seinen Charakter mit dem Mehrspieler-Eigentumssystem steuern kann", + "es": "Cómo un jugador en línea puede controlar su personaje con el sistema de propiedad multijugador", + "fi": "Kuinka verkkopelaaja voi hallita hahmoaan moninpeliomistusjärjestelmällä", + "it": "Come un giocatore online può controllare il suo personaggio con il sistema di proprietà multiplayer", + "tr": "Çevrimiçi bir oyuncunun çok oyunculu sahiplik sistemiyle karakterini nasıl kontrol edebileceği", + "ja": "オンラインプレイヤーがマルチプレイヤー所有権システムでキャラクターを操作する方法", + "ko": "온라인 플레이어가 멀티플레이어 소유 시스템을 통해 캐릭터를 제어할 수 있는 방법", + "pl": "Jak gracz online może kontrolować swoją postać za pomocą systemu własności wieloosobowej", + "pt": "Como um jogador online pode controlar seu personagem com o sistema de propriedade multijogador", + "th": "ผู้เล่นออนไลน์สามารถควบคุมตัวละครของเขาด้วยระบบการเป็นเจ้าของแบบหลายผู้เล่นได้อย่างไร", + "ru": "Как онлайн-игрок может управлять своим персонажем с помощью системы многопользовательского владения", + "sl": "Kako lahko spletni igralec nadzoruje svoj lik z večigralskim lastniškim sistemom", + "sq": "Si mund ta kontrollojë një lojtar në internet karakterin e tij me sistemin e pronësisë për shumë lojtarë", + "uk": "Як онлайн-гравець може керувати своїм персонажем за допомогою системи багатокористувацького володіння", + "zh": "在线玩家如何通过多人所有权系统控制他的角色" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "Lobby" + }, + "SwitchToGameScene": { + "editor": "Scene", + "scene": "GameScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "GameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/coopPlatformer/game.json", + "initialProjectData": { + "Player1": "Player1", + "Player2": "Player2", + "Lobby": "Lobby", + "GameScene": "GameScene" + }, + "flow": [ + { + "id": "Start", + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "This game is a multiplayer game with a pre-made lobby scene ready to let players join the game.\n\nWe will see how to let each online player control their own characters.", + "fr": "Ce jeu est un jeu multijoueur avec une scène de lobby pré-fabriquée prête à permettre aux joueurs de rejoindre le jeu.\n\nNous verrons comment permettre à chaque joueur en ligne de contrôler son propre personnage.", + "ar": "هذه اللعبة هي لعبة متعددة اللاعبين مع مشهد لوبي مُجهز مسبقًا للسماح للاعبين بالانضمام إلى اللعبة.\n\nسنرى كيف يمكن لكل لاعب عبر الإنترنت التحكم في شخصياته الخاصة.", + "de": "Dieses Spiel ist ein Mehrspieler-Spiel mit einer vorgefertigten Lobby-Szene, die es den Spielern ermöglicht, dem Spiel beizutreten.\n\nWir werden sehen, wie jeder Online-Spieler seine eigenen Charaktere steuern kann.", + "es": "Este juego es un juego multijugador con una escena de lobby pre-hecha lista para permitir que los jugadores se unan al juego.\n\nVeremos cómo permitir que cada jugador en línea controle sus propios personajes.", + "fi": "Tämä peli on moninpeli, jossa on valmiiksi tehty aula, joka on valmis pelaajien liittymään peliin.\n\nKatsotaan, kuinka jokainen verkkopelaaja voi hallita omia hahmojaan.", + "it": "Questo gioco è un gioco multiplayer con una scena di lobby predefinita pronta per consentire ai giocatori di unirsi al gioco.\n\nVedremo come consentire a ciascun giocatore online di controllare i propri personaggi.", + "tr": "Bu oyun, oyuncuların oyuna katılmasına izin vermek için hazır yapılmış bir lobisi sahip çok oyunculu bir oyundur.\n\nHer çevrimiçi oyuncunun kendi karakterlerini nasıl kontrol edebileceğini göreceğiz.", + "ja": "このゲームは、事前に作成されたロビーシーンを備えたマルチプレイヤーゲームで、プレイヤーがゲームに参加できるようにしています。\n\n各オンラインプレイヤーが自分のキャラクターを操作できる方法を見ていきます。", + "ko": "이 게임은 플레이어가 게임에 참여할 수 있도록 사전 제작된 로비 장면을 포함한 멀티플레이어 게임입니다.\n\n각 온라인 플레이어가 자신의 캐릭터를 제어하는 방법을 살펴보겠습니다.", + "pl": "Ta gra jest grą wieloosobową z gotową sceną lobby, która umożliwia graczom dołączenie do gry.\n\nZobaczymy, jak pozwolić każdemu graczowi online kontrolować swoje postacie.", + "pt": "Este jogo é um jogo multijogador com uma cena de lobby pré-fabricada pronta para permitir que os jogadores entrem no jogo.\n\nVeremos como permitir que cada jogador online controle seus próprios personagens.", + "th": "เกมนี้เป็นเกมที่มีผู้เล่นหลายคนพร้อมฉากล็อบบี้ที่เตรียมไว้ล่วงหน้าเพื่อให้ผู้เล่นเข้าร่วมเกมได้\n\nเราจะมาดูวิธีการให้ผู้เล่นแต่ละคนควบคุมตัวละครของตัวเอง", + "ru": "Эта игра является многопользовательской игрой с предварительно созданной сценой лобби, которая позволяет игрокам присоединиться к игре.\n\nМы увидим, как дать каждому онлайн-игроку возможность управлять своими собственными персонажами.", + "sl": "Ta igra je večigralska igra s pripravljenim prizoriščem v preddverju, ki omogoča igralcem, da se pridružijo igri.\n\nVideli bomo, kako lahko vsak spletni igralec nadzoruje svoje lastne like.", + "sq": "Kjo lojë është një lojë me shumë lojtarë me një skenë të përgatitur me një sallë të gatshme për t'u lejuar lojtarëve të bashkohen me lojën.\n\nDo të shohim se si të lejojmë çdo lojtar online të kontrollojë karakteret e tyre.", + "uk": "Ця гра є багатокористувацькою грою з готовою сценою лобі, яка дозволяє гравцям приєднатися до гри.\n\nМи побачимо, як дозволити кожному онлайн-гравцю керувати своїми персонажами.", + "zh": "这是一款多人游戏,配有预制的大厅场景,可以让玩家加入游戏。\n\n我们将看到如何让每个在线玩家控制他们自己的角色。" + } + } + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Let's go!", + "fr": "C'est parti !", + "ar": "لنبدأ!", + "de": "Los geht's!", + "es": "¡Vamos!", + "fi": "Lähdetään!", + "it": "Andiamo!", + "tr": "Haydi başlayalım!", + "ja": "さあ、始めましょう!", + "ko": "출발!", + "pl": "Zaczynamy!", + "pt": "Vamos lá!", + "ru": "Поехали!", + "sl": "Gremo!", + "sq": "Hajde shkojme!", + "th": "ไปกันเลย!", + "uk": "Почнемо!", + "zh": "让我们开始吧!" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-preview-split-menu-button", + "tooltip": { + "placement": "bottom", + "description": { + "messageByLocale": { + "en": "First, let's configure the preview to always launch from the lobby scene, as this will help us test our game easily.\n\nClick on the **down arrow** next of the Preview button, then click **Use this scene to start all previews**.", + "fr": "Tout d'abord, configurons l'aperçu pour qu'il se lance toujours à partir de la scène de lobby, car cela nous aidera à tester notre jeu facilement.\n\nCliquez sur la **flèche vers le bas** à côté du bouton Aperçu, puis cliquez sur **Utiliser cette scène pour démarrer tous les aperçus**.", + "ar": "أولاً، دعونا نقوم بتكوين المعاينة لتشغيلها دائمًا من مشهد اللوبي، حيث سيساعدنا هذا في اختبار لعبتنا بسهولة.\n\nانقر على **السهم السفلي** بجوار زر المعاينة، ثم انقر على **استخدام هذا المشهد لبدء جميع المعاينات**.", + "de": "Konfigurieren wir zuerst die Vorschau so, dass sie immer von der Lobby-Szene aus gestartet wird, da uns dies dabei hilft, unser Spiel leicht zu testen.\n\nKlicken Sie auf den **Pfeil nach unten** neben der Schaltfläche Vorschau und dann auf **Verwenden Sie diese Szene, um alle Vorschauen zu starten**.", + "es": "Primero, configuremos la vista previa para que siempre se inicie desde la escena del lobby, ya que esto nos ayudará a probar nuestro juego fácilmente.\n\nHaz clic en la **flecha hacia abajo** junto al botón de Vista previa, y luego haz clic en **Usar esta escena para iniciar todas las vistas previas**.", + "fi": "Aloitetaan määrittämällä esikatselu käynnistymään aina aulakohtauksesta, koska tämä auttaa meitä testaamaan peliämme helposti.\n\nNapsauta **alas osoittavaa nuolta** Esikatselu-painikkeen vieressä ja valitse sitten **Käytä tätä kohtausta käynnistämään kaikki esikatselut**.", + "it": "Innanzitutto, configuriamo l'anteprima in modo che venga sempre avviata dalla scena della lobby, poiché ciò ci aiuterà a testare facilmente il nostro gioco.\n\nFai clic sulla **freccia in basso** accanto al pulsante Anteprima, quindi fai clic su **Usa questa scena per avviare tutte le anteprime**.", + "tr": "Öncelikle, önizlemeyi her zaman lobiden başlatmak üzere yapılandıralım, çünkü bu, oyunumuzu kolayca test etmemize yardımcı olacaktır.\n\nÖnizleme düğmesinin yanındaki **aşağı ok** simgesine tıklayın, ardından **Tüm önizlemeleri başlatmak için bu sahneyi kullan**'ı tıklayın.", + "ja": "まず、プレビューを常にロビーシーンから起動するように構成しましょう。これにより、ゲームを簡単にテストできます。\n\nプレビューボタンの隣にある**下向き矢印**をクリックし、**このシーンを使用してすべてのプレビューを開始**をクリックします。", + "ko": "먼저 미리보기를 항상 로비 장면에서 시작하도록 구성하겠습니다. 이렇게 하면 게임을 쉽게 테스트할 수 있습니다.\n\n미리보기 버튼 옆의 **아래쪽 화살표**를 클릭한 다음 **모든 미리보기 시작에 이 씬 사용**을 클릭하세요.", + "pl": "Najpierw skonfigurujmy podgląd tak, aby zawsze uruchamiał się z sceny lobby, co ułatwi nam testowanie gry.\n\nKliknij **strzałkę w dół** obok przycisku Podgląd, a następnie kliknij **Użyj tej sceny do uruchamiania wszystkich podglądów**.", + "pt": "Primeiro, vamos configurar a visualização para sempre iniciar a partir da cena do lobby, pois isso nos ajudará a testar nosso jogo facilmente.\n\nClique na **seta para baixo** ao lado do botão de Visualização e, em seguida, clique em **Usar esta cena para iniciar todas as visualizações**.", + "th": "เริ่มต้นด้วยการกำหนดค่าการแสดงตัวอย่างให้เริ่มต้นจากฉากล็อบบี้เสมอ เนื่องจากนี่จะช่วยให้เราทดสอบเกมได้อย่างง่ายดาย\n\nคลิกที่ **ลูกศรลง** ข้างขวาปุ่มแสดงตัวอย่าง จากนั้นคลิกที่ **ใช้ฉากนี้เพื่อเริ่มต้นแสดงตัวอย่างทั้งหมด**", + "ru": "Сначала давайте настроим предварительный просмотр так, чтобы он всегда запускался из сцены лобби, так как это поможет нам легко тестировать нашу игру.\n\nНажмите на **стрелку вниз** рядом с кнопкой Предварительный просмотр, затем нажмите **Использовать эту сцену для запуска всех предварительных просмотров**.", + "sl": "Najprej konfigurirajmo predogled, da se vedno začne iz prizorišča predprostora, saj nam bo to pomagalo enostavno preizkusiti našo igro.\n\nKliknite na **puščico navzdol** ob gumbu Predogled, nato kliknite **Uporabi to sceno za zagon vseh predogledov**.", + "sq": "Fillimisht, le të konfigurojmë paraparjen që të nisë gjithmonë nga skena e sallës së pritjes, pasi kjo do të na ndihmojë të testojmë lojën tonë lehtë.\n\nKlikoni mbi **shigjetën poshtë** pranë butonit Paraparje, pastaj klikoni **Përdor këtë skenë për të filluar të gjitha paraparjet**.", + "uk": "Спочатку давайте налаштуємо попередній перегляд так, щоб він завжди запускався з сцени лобі, оскільки це допоможе нам легко тестувати нашу гру.\n\nНатисніть на **стрілку вниз** поряд з кнопкою Попередній перегляд, а потім натисніть **Використовувати цю сцену для запуску всіх попередніх переглядів**.", + "zh": "首先,让我们配置预览,使其始终从大厅场景启动,这将帮助我们轻松测试游戏。\n\n点击预览按钮旁边的**向下箭头**,然后点击**使用此场景启动所有预览**。" + } + } + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Done!", + "fr": "Fait !", + "ar": "تم!", + "de": "Fertig!", + "es": "¡Hecho!", + "fi": "Valmis!", + "it": "Fatto!", + "tr": "Tamamlandı!", + "ja": "完了!", + "ko": "완료!", + "pl": "Zrobione!", + "pt": "Concluído!", + "th": "เสร็จสิ้น!", + "ru": "Готово!", + "sl": "Končano!", + "sq": "U bë!", + "uk": "Готово!", + "zh": "完成!" + } + } + } + }, + { + "id": "SwitchToGameScene", + "elementToHighlightId": "editorTab:GameScene:Scene", + "isTriggerFlickering": true, + "nextStepTrigger": { + "editorIsActive": "GameScene:Scene" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the $(GameScene) editor.", + "fr": "Ouvrez l'éditeur $(GameScene).", + "ar": "افتح محرر $(GameScene).", + "de": "Öffnen Sie den $(GameScene)-Editor.", + "es": "Abre el editor de $(GameScene).", + "fi": "Avaa $(GameScene) -editori.", + "it": "Apri l'editor di $(GameScene).", + "tr": "$(GameScene) düzenleyicisini açın.", + "ja": "$(GameScene)エディターを開きます。", + "ko": "$(GameScene) 편집기를 엽니다.", + "pl": "Otwórz edytor $(GameScene).", + "pt": "Abra o editor de $(GameScene).", + "th": "เปิดตัวแก้ไข $(GameScene)", + "ru": "Откройте редактор $(GameScene).", + "sl": "Odprite urejevalnik $(GameScene).", + "sq": "Hapni redaktorin $(GameScene).", + "uk": "Відкрийте редактор $(GameScene).", + "zh": "打开 $(GameScene) 编辑器。" + } + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "Player1", + "isOnClosableDialog": true, + "behaviorListItemId": "#behavior-item-Multiplayer--MultiplayerObjectBehavior", + "behaviorParameterPanelId": "#behavior-parameters-MultiplayerObject", + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's add the multiplayer behavior to the **$(Player1)** object.\n\nClick on the 3 dot menu, or right-click on **$(Player1)**, and select **Edit behaviors**.", + "fr": "Ajoutons le comportement multijoueur à l'objet **$(Player1)**.\n\nCliquez sur le menu à trois points, ou faites un clic droit sur **$(Player1)**, et sélectionnez **Modifier les comportements**.", + "ar": "لنضيف سلوك اللعب الجماعي إلى كائن **$(Player1)**.\n\nانقر على قائمة النقاط الثلاثة، أو انقر بزر الماوس الأيمن على **$(Player1)**، واختر **تحرير السلوك**.", + "de": "Fügen wir das Mehrspieler-Verhalten zum Objekt **$(Player1)** hinzu.\n\nKlicken Sie auf das 3-Punkte-Menü oder mit der rechten Maustaste auf **$(Player1)** und wählen Sie **Verhalten bearbeiten** aus.", + "es": "Vamos a añadir el comportamiento multijugador al objeto **$(Player1)**.\n\nHaz clic en el menú de los 3 puntos, o haz clic derecho en **$(Player1)**, y selecciona **Editar comportamientos**.", + "fi": "Lisätään moninpelikäyttäytyminen **$(Player1)** -kohteeseen.\n\nNapsauta 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(Player1)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo il comportamento multiplayer all'oggetto **$(Player1)**.\n\nFai clic sul menu a 3 punti o con il pulsante destro su **$(Player1)**, e seleziona **Modifica comportamenti**.", + "tr": "**$(Player1)** nesnesine çok oyunculu davranışı ekleyelim.\n\n3 nokta menüsüne tıklayın veya **$(Player1)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "**$(Player1)** オブジェクトにマルチプレイヤーの動作を追加しましょう。\n\n3つの点があるメニューをクリックするか、**$(Player1)** を右クリックして **動作を編集** を選択します。", + "ko": "**$(Player1)** 객체에 멀티플레이어 동작을 추가해 봅시다.\n\n3 점 메뉴를 클릭하거나 **$(Player1)** 에 오른쪽 클릭하고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy zachowanie wieloosobowe do obiektu **$(Player1)**.\n\nKliknij menu trzech kropek lub kliknij prawym przyciskiem myszy na **$(Player1)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar o comportamento multiplayer ao objeto **$(Player1)**.\n\nClique no menu de três pontos, ou clique com o botão direito em **$(Player1)**, e selecione **Editar comportamentos**.", + "th": "เรามาเพิ่มพฤติกรรมแบบหลายผู้เล่นให้กับวัตถุ **$(Player1)**\n\nคลิกที่เมนูจุด 3 หรือคลิกขวาที่ **$(Player1)** และเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим поведение для многопользовательского режима к объекту **$(Player1)**.\n\nНажмите на меню с тремя точками или щелкните правой кнопкой мыши на **$(Player1)** и выберите **Редактировать поведение**.", + "sl": "Dodajmo večigralsko vedenje k objektu **$(Player1)**.\n\nKliknite na meni z 3 pikami ali desno kliknite na **$(Player1)** in izberite **Uredi vedenje**.", + "sq": "Le të shtojmë sjelljen multiplayer në objektin **$(Player1)**.\n\nKlikoni në menynë me 3 pikë ose klikoni me të djathtën në **$(Player1)**, dhe zgjidhni **Redaktoni sjelljet**.", + "uk": "Додаймо поведінку для багатокористувацького режиму до об'єкту **$(Player1)**.\n\nНатисніть на меню з трьома крапками або клацніть правою кнопкою миші на **$(Player1)** і виберіть **Редагувати поведінку**.", + "zh": "让我们为 **$(Player1)** 对象添加多人游戏行为。\n\n点击三点菜单,或右键点击 **$(Player1)**,然后选择 **编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's add the multiplayer behavior to the $(Player1) object.\n\nSelect, then long press on **$(Player1)**, then select **Edit behaviors**.", + "fr": "Ajoutons le comportement multijoueur à l'objet $(Player1).\n\nSélectionnez, puis appuyez longuement sur **$(Player1)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف سلوك اللاعبين المتعددين إلى كائن $(Player1).\n\nحدد، ثم اضغط بشكل طويل على **$(Player1)**، ثم اختر **تحرير السلوكيات**.", + "de": "Fügen wir dem Objekt $(Player1) das Mehrspieler-Verhalten hinzu.\n\nWählen Sie **$(Player1)** aus, drücken Sie lange darauf und wählen Sie dann **Verhalten bearbeiten** aus.", + "es": "Agreguemos el comportamiento multijugador al objeto $(Player1).\n\nSeleccione, luego mantenga presionado **$(Player1)** y seleccione **Editar comportamientos**.", + "fi": "Lisätään moninpelikäyttäytyminen $(Player1) -kohteeseen.\n\nValitse, sitten pidä pitkään painettuna **$(Player1)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo il comportamento multigiocatore all'oggetto $(Player1).\n\nSeleziona, quindi tieni premuto su **$(Player1)**, quindi seleziona **Modifica comportamenti**.", + "tr": "$(Player1) nesnesine çok oyunculu davranışı ekleyelim.\n\nSeçin, ardından **$(Player1)** üzerinde uzun basın ve **Davranışları Düzenle**'yi seçin.", + "ja": "$(Player1)オブジェクトにマルチプレイヤー動作を追加しましょう。\n\n**$(Player1)** を選択し、長押ししてから **動作を編集** を選択してください。", + "ko": "$(Player1) 객체에 멀티플레이어 동작을 추가해 봅시다.\n\n**$(Player1)**을(를) 선택한 다음, 길게 누르고 **행동 편집**을 선택하세요.", + "pl": "Dodajmy zachowanie wieloosobowe do obiektu $(Player1).\n\nWybierz, następnie przytrzymaj **$(Player1)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar o comportamento multijogador ao objeto $(Player1).\n\nSelecione, em seguida, pressione longamente em **$(Player1)** e selecione **Editar comportamentos**.", + "th": "เพิ่มพฤติกรรมที่เป็นหลายผู้เล่นให้กับวัตถุ $(Player1) \n\nเลือกแล้วกดค้างที่ **$(Player1)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим поведение многопользовательской игры к объекту $(Player1).\n\nВыберите, затем удерживайте **$(Player1)** и выберите **Редактировать поведение**.", + "sl": "Dodajmo večigralsko vedenje k predmetu $(Player1).\n\nIzberite, nato dolgo pritisnite na **$(Player1)** in izberite **Uredi vedenja**.", + "sq": "Të shtojmë sjelljen multiplayer në objektin $(Player1).\n\nZgjidhni, pastaj mbani shtypur gjatë në **$(Player1)**, pastaj zgjidhni **Ndrysho sjelljet**.", + "uk": "Додаймо поведінку багатокористувацької гри до об'єкту $(Player1).\n\nВиберіть, потім утримуйте **$(Player1)** і виберіть **Редагувати поведінку**.", + "zh": "让我们给 $(Player1) 对象添加多人游戏行为。\n\n选择 **$(Player1)**,长按后选择 **编辑行为**。" + } + }, + "behaviorDisplayNameByLocale": { + "en": "**Multiplayer**", + "fr": "**Multijoueur**", + "ar": "**اللاعبين المتعددين**", + "de": "**Mehrspieler**", + "es": "**Multijugador**", + "fi": "**Moninpeli**", + "it": "**Multigiocatore**", + "tr": "**Çok Oyunculu**", + "ja": "**マルチプレイヤー**", + "ko": "**멀티플레이어**", + "pl": "**Wieloosobowy**", + "pt": "**Multijogador**", + "th": "**หลายผู้เล่น**", + "ru": "**Многопользователь**", + "sl": "**Večigralsko**", + "sq": "**Multiplayer**", + "uk": "**Багатокористувацький**", + "zh": "**多人游戏**" + }, + "parameters": [ + { + "parameterId": "#playerNumber", + "expectedValue": "1", + "description": { + "messageByLocale": { + "en": "Let's change the ownership of the object to 1. Which will allow to connect the **$(Player1)** object with the first player to connect into the game", + "fr": "Changeons la propriété de l'objet à 1. Cela permettra de connecter l'objet **$(Player1)** au premier joueur à se connecter au jeu.", + "ar": "لنقم بتغيير ملكية الكائن إلى 1. والذي سيسمح بربط كائن **$(Player1)** باللاعب الأول الذي يتصل باللعبة", + "de": "Ändern wir das Eigentum des Objekts auf 1. Dadurch wird das **$(Player1)**-Objekt mit dem ersten Spieler verbunden, der sich mit dem Spiel verbindet.", + "es": "Cambiemos la propiedad del objeto a 1. Lo que permitirá conectar el objeto **$(Player1)** con el primer jugador que se conecte al juego.", + "fi": "Muutetaan kohteen omistajuus arvoon 1. Tämä mahdollistaa **$(Player1)** -kohteen yhdistämisen ensimmäiseen pelaajaan, joka liittyy peliin.", + "it": "Cambia la proprietà dell'oggetto a 1. Ciò permetterà di collegare l'oggetto **$(Player1)** al primo giocatore che si connette al gioco.", + "tr": "Nesnenin sahipliğini 1 olarak değiştirelim. Bu, **$(Player1)** nesnesini oyuna bağlanan ilk oyuncuyla bağlamanıza olanak tanır.", + "ja": "オブジェクトの所有権を1に変更しましょう。これにより、**$(Player1)** オブジェクトを最初にゲームに接続するプレイヤーに接続できます", + "ko": "객체의 소유권을 1로 변경합시다. 이렇게 하면 **$(Player1)** 객체를 게임에 연결하는 첫 번째 플레이어와 연결할 수 있습니다.", + "pl": "Zmienimy właścicielstwo obiektu na 1. Pozwoli to połączyć obiekt **$(Player1)** z pierwszym graczem, który dołączy do gry.", + "pt": "Vamos alterar a propriedade do objeto para 1. Isso permitirá conectar o objeto **$(Player1)** ao primeiro jogador a se conectar ao jogo.", + "th": "เรามาเปลี่ยนเจ้าของของวัตถุเป็น 1 ซึ่งจะช่วยให้เชื่อมต่อกับวัตถุ **$(Player1)** กับผู้เล่นคนแรกที่เชื่อมต่อเข้าสู่เกม", + "ru": "Изменим собственность объекта на 1. Это позволит подключить объект **$(Player1)** к первому игроку, подключающемуся к игре.", + "sl": "Spremenimo lastništvo predmeta na 1. To bo omogočilo povezavo predmeta **$(Player1)** s prvim igralcem, ki se bo povezal v igro.", + "sq": "Le të ndryshojmë pronësinë e objektit në 1. Çka do të lejojë të lidhet objekti **$(Player1)** me lojtarin e parë që të lidhet në lojë.", + "uk": "Змінимо власність об'єкта на 1. Це дозволить підключити об'єкт **$(Player1)** до першого гравця, який приєднується до гри.", + "zh": "让我们将对象的所有权更改为 1。这将允许将 **$(Player1)** 对象与第一个连接到游戏的玩家连接起来。" + } + } + } + ], + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it!\n\nNow we will add the same behavior on the **$(Player1)** object, which will be the second player to connect to the game.", + "fr": "C'est tout !\n\nMaintenant, nous allons ajouter le même comportement à l'objet **$(Player1)**, qui sera le deuxième joueur à se connecter au jeu.", + "ar": "هذا كل شيء!\n\nالآن سنقوم بإضافة نفس السلوك إلى كائن **$(Player1)**، الذي سيكون اللاعب الثاني للانضمام إلى اللعبة.", + "de": "Das war's!\n\nJetzt werden wir das gleiche Verhalten dem **$(Player1)**-Objekt hinzufügen, das der zweite Spieler sein wird, der sich mit dem Spiel verbindet.", + "es": "¡Eso es todo!\n\nAhora añadiremos el mismo comportamiento al objeto **$(Player1)**, que será el segundo jugador en conectarse al juego.", + "fi": "Siinä kaikki!\n\nNyt lisäämme saman käyttäytymisen **$(Player1)** -kohteeseen, joka on toinen pelaaja, joka liittyy peliin.", + "it": "Ecco fatto!\n\nOra aggiungeremo lo stesso comportamento all'oggetto **$(Player1)**, che sarà il secondo giocatore a connettersi al gioco.", + "tr": "İşte bu kadar!\n\nŞimdi **$(Player1)** nesnesine aynı davranışı ekleyeceğiz, bu da oyuna bağlanan ikinci oyuncu olacak.", + "ja": "以上です!\n\n今度は **$(Player1)** オブジェクトに同じ動作を追加します。これはゲームに参加する2番目のプレイヤーです。", + "ko": "그게 다입니다!\n\n이제 **$(Player1)** 객체에 동일한 동작을 추가할 것입니다. 이는 게임에 연결할 두 번째 플레이어입니다.", + "pl": "To wszystko!\n\nTeraz dodamy to samo zachowanie do obiektu **$(Player1)**, który będzie drugim graczem dołączającym do gry.", + "pt": "É isso aí!\n\nAgora vamos adicionar o mesmo comportamento ao objeto **$(Player1)**, que será o segundo jogador a se conectar ao jogo.", + "th": "เป็นเช่นนี้!\n\nตอนนี้เราจะเพิ่มพฤติกรรมเดียวกันให้กับวัตถุ **$(Player1)** ซึ่งจะเป็นผู้เล่นที่สองที่เชื่อมต่อกับเกม", + "ru": "Это всё!\n\nТеперь мы добавим то же поведение к объекту **$(Player1)**, который будет вторым игроком, подключающимся к игре.", + "sl": "To je to!\n\nZdaj bomo dodali enako vedenje k objektu **$(Player1)**, ki bo drugi igralec, ki se bo povezal v igro.", + "sq": "Kështu është!\n\nTani do të shtojmë sjelljen e njëjtë në objektin **$(Player1)**, që do të jetë lojtari i dytë që lidhet me lojën.", + "uk": "Ось і все!\n\nТепер ми додамо таке ж поведінку до об'єкту **$(Player1)**, який буде другим гравцем, що приєднується до гри.", + "zh": "就这样!\n\n现在我们将在 **$(Player1)** 对象上添加相同的行为,这将是连接到游戏的第二位玩家。" + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "Player2", + "isOnClosableDialog": true, + "behaviorListItemId": "#behavior-item-Multiplayer--MultiplayerObjectBehavior", + "behaviorParameterPanelId": "#behavior-parameters-MultiplayerObject", + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's add the multiplayer behavior to the **$(Player2)** object.\n\nClick on the 3 dot menu, or right-click on **$(Player2)**, and select **Edit behaviors**.", + "fr": "Ajoutons le comportement multijoueur à l'objet **$(Player2)**.\n\nCliquez sur le menu à 3 points, ou faites un clic droit sur **$(Player2)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف سلوك اللاعبين المتعددين إلى كائن **$(Player2)**.\n\nانقر فوق قائمة النقاط الثلاثة، أو انقر بزر الماوس الأيمن فوق **$(Player2)**، واختر **تحرير السلوكيات**.", + "de": "Fügen wir das Mehrspieler-Verhalten dem Objekt **$(Player2)** hinzu.\n\nKlicken Sie auf das Menü mit den drei Punkten oder klicken Sie mit der rechten Maustaste auf **$(Player2)** und wählen Sie **Verhalten bearbeiten** aus.", + "es": "Agreguemos el comportamiento multijugador al objeto **$(Player2)**.\n\nHaz clic en el menú de los 3 puntos, o haz clic derecho en **$(Player2)**, y selecciona **Editar comportamientos**.", + "fi": "Lisätään moninpelikäyttäytyminen **$(Player2)** -kohteeseen.\n\nNapsauta 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(Player2)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo il comportamento multigiocatore all'oggetto **$(Player2)**.\n\nFai clic sul menu a 3 punti, o clicca con il pulsante destro su **$(Player2)**, e seleziona **Modifica comportamenti**.", + "tr": "**$(Player2)** nesnesine çok oyunculu davranışı ekleyelim.\n\n3 nokta menüsüne tıklayın veya **$(Player2)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "**$(Player2)** オブジェクトにマルチプレイヤー動作を追加しましょう。\n\n3点メニューをクリックするか、**$(Player2)** を右クリックして、**動作を編集** を選択してください。", + "ko": "**$(Player2)** 객체에 멀티플레이어 동작을 추가해 봅시다.\n\n3 점 메뉴를 클릭하거나 **$(Player2)**을(를) 마우스 오른쪽 클릭한 후 **행동 편집**을 선택하세요.", + "pl": "Dodajmy zachowanie wieloosobowe do obiektu **$(Player2)**.\n\nKliknij w menu trzech kropek lub kliknij prawym przyciskiem myszy na **$(Player2)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar o comportamento multijogador ao objeto **$(Player2)**.\n\nClique no menu de três pontos, ou clique com o botão direito em **$(Player2)**, e selecione **Editar comportamentos**.", + "th": "เรามาเพิ่มพฤติกรรมที่เป็นหลายผู้เล่นให้กับวัตถุ **$(Player2)**\n\nคลิกที่เมนู 3 จุดหรือคลิกขวาที่ **$(Player2)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим поведение многопользовательской игры к объекту **$(Player2)**.\n\nНажмите на меню с тремя точками или щелкните правой кнопкой мыши на **$(Player2)** и выберите **Редактировать поведение**.", + "sl": "Dodajmo večigralsko vedenje k predmetu **$(Player2)**.\n\nKliknite na meniju s tremi pikami ali desno kliknite na **$(Player2)** in izberite **Uredi vedenja**.", + "sq": "Të shtojmë sjelljen multiplayer në objektin **$(Player2)**.\n\nKlikoni në menunë e 3 pikave, ose klikoni me të djathtën në **$(Player2)**, dhe zgjidhni **Ndrysho sjelljet**.", + "uk": "Додаймо поведінку багатокористувацької гри до об'єкту **$(Player2)**.\n\nКлацніть на меню з трьома крапками або правою кнопкою миші на **$(Player2)** і виберіть **Редагувати поведінку**.", + "zh": "让我们给 **$(Player2)** 对象添加多人游戏行为。\n\n点击三点菜单,或者右键点击 **$(Player2)**,然后选择 **编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's add the multiplayer behavior to the $(Player2) object.\n\nSelect, then long press on **$(Player2)**, then select **Edit behaviors**.", + "fr": "Ajoutons le comportement multijoueur à l'objet $(Player2).\n\nSélectionnez, puis appuyez longuement sur **$(Player2)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف سلوك اللعب الجماعي إلى كائن $(Player2).\n\nحدد، ثم اضغط بالضغط المطول على **$(Player2)**، ثم حدد **تعديل السلوك**.", + "de": "Lassen Sie uns das Mehrspieler-Verhalten zum $(Player2)-Objekt hinzufügen.\n\nWählen Sie **$(Player2)** aus, drücken Sie lange darauf und wählen Sie dann **Verhalten bearbeiten** aus.", + "es": "Vamos a añadir el comportamiento multijugador al objeto $(Player2).\n\nSelecciona, luego mantén pulsado en **$(Player2)**, luego selecciona **Editar comportamientos**.", + "fi": "Lisätään moninpelikäyttäytyminen $(Player2) -kohteeseen.\n\nValitse, sitten pidä pitkään painettuna **$(Player2)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo il comportamento multiplayer all'oggetto $(Player2).\n\nSeleziona, quindi premi a lungo su **$(Player2)**, quindi seleziona **Modifica comportamenti**.", + "tr": "$(Player2) nesnesine çok oyunculu davranışı ekleyelim.\n\nSeçin, ardından **$(Player2)** üzerinde uzun basın ve **Davranışları Düzenle**'yi seçin.", + "ja": "$(Player2) オブジェクトにマルチプレイヤーの動作を追加しましょう。\n\n**$(Player2)** を選択し、長押ししてから **動作を編集** を選択します。", + "ko": "$(Player2) 객체에 멀티플레이어 동작을 추가해 봅시다.\n\n**$(Player2)** 을(를) 선택한 다음, 길게 누르고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy zachowanie wieloosobowe do obiektu $(Player2).\n\nWybierz, następnie przytrzymaj długo na **$(Player2)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar o comportamento multiplayer ao objeto $(Player2).\n\nSelecione, então mantenha pressionado em **$(Player2)**, depois selecione **Editar comportamentos**.", + "th": "เรามาเพิ่มพฤติกรรมแบบหลายผู้เล่นให้กับวัตถุ $(Player2)\n\nเลือกแล้วกดค้างที่ **$(Player2)** จากนั้นเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим поведение для многопользовательского режима к объекту $(Player2).\n\nВыберите, затем удерживайте долго на **$(Player2)**, затем выберите **Редактировать поведение**.", + "sl": "Dodajmo večigralsko vedenje k objektu $(Player2).\n\nIzberite, nato dolgo pritisnite na **$(Player2)**, nato izberite **Uredi vedenje**.", + "sq": "Le të shtojmë sjelljen multiplayer në objektin $(Player2).\n\nZgjidh, pastaj shtypni gjatë në **$(Player2)**, pastaj zgjidh **Redaktoni sjelljet**.", + "uk": "Додаймо поведінку для багатокористувацького режиму до об'єкту $(Player2).\n\nВиберіть, потім тримайте довго на **$(Player2)**, потім виберіть **Редагувати поведінку**.", + "zh": "让我们为 $(Player2) 对象添加多人游戏行为。\n\n选择,然后长按 **$(Player2)**,然后选择 **编辑行为**。" + } + }, + "behaviorDisplayNameByLocale": { + "en": "**Multiplayer**", + "fr": "**Multijoueur**", + "ar": "**اللاعبين المتعددين**", + "de": "**Mehrspieler**", + "es": "**Multijugador**", + "fi": "**Moninpeli**", + "it": "**Multigiocatore**", + "tr": "**Çok Oyunculu**", + "ja": "**マルチプレイヤー**", + "ko": "**멀티플레이어**", + "pl": "**Wieloosobowy**", + "pt": "**Multijogador**", + "th": "**หลายผู้เล่น**", + "ru": "**Многопользователь**", + "sl": "**Večigralsko**", + "sq": "**Multiplayer**", + "uk": "**Багатокористувацький**", + "zh": "**多人游戏**" + }, + "parameters": [ + { + "parameterId": "#playerNumber", + "expectedValue": "2", + "description": { + "messageByLocale": { + "en": "Let's change the ownership of the object to 2. Which will allow to connect the **$(Player2)** object with the second player to connect into the game", + "fr": "Modifions la propriété de l'objet à 2. Cela permettra de connecter l'objet **$(Player2)** au deuxième joueur à se connecter au jeu.", + "ar": "لنقم بتغيير ملكية الكائن إلى 2. مما سيسمح بربط كائن **$(Player2)** باللاعب الثاني الذي يتصل باللعبة.", + "de": "Ändern wir das Eigentum des Objekts auf 2. Dies wird es ermöglichen, das **$(Player2)**-Objekt mit dem zweiten Spieler zu verbinden, der sich im Spiel anmeldet.", + "es": "Cambiamos la propiedad del objeto en 2. Lo que permitirá conectar el objeto **$(Player2)** con el segundo jugador que se conecte al juego.", + "fi": "Muutetaan kohteen omistajuus arvoon 2. Tämä mahdollistaa **$(Player2)** -kohteen yhdistämisen toiseen pelaajaan, joka liittyy peliin.", + "it": "Cambia la proprietà dell'oggetto in 2. Questo permetterà di collegare l'oggetto **$(Player2)** al secondo giocatore che si connette al gioco.", + "tr": "Nesnenin sahipliğini 2 olarak değiştirelim. Bu, **$(Player2)** nesnesini oyuna bağlanan ikinci oyuncuyla bağlamanıza olanak tanır.", + "ja": "オブジェクトの所有権を2に変更しましょう。これにより、**$(Player2)** オブジェクトがゲームに接続する2番目のプレイヤーと接続できるようになります。", + "ko": "객체의 소유권을 2로 변경합시다. 이는 **$(Player2)** 객체를 게임에 두 번째로 연결된 플레이어와 연결할 수 있게 할 것입니다.", + "pl": "Zmienimy właśność obiektu na 2. Pozwoli to połączyć obiekt **$(Player2)** z drugim graczem, który połączy się z grą.", + "pt": "Vamos alterar a propriedade do objeto em 2. Isso permitirá conectar o objeto **$(Player2)** ao segundo jogador a se conectar no jogo.", + "th": "เรามาเปลี่ยนการเป็นเจ้าของของวัตถุด้วย 2 ซึ่งจะช่วยให้เชื่อมต่อกับวัตถุ **$(Player2)** กับผู้เล่นคนที่สองที่เชื่อมต่อเข้าสู่เกมได้", + "ru": "Давайте изменим собственность объекта на 2. Это позволит связать объект **$(Player2)** со вторым игроком, подключившимся к игре.", + "sl": "Spremenimo lastništvo predmeta za 2. To bo omogočilo povezavo predmeta **$(Player2)** z drugim igralcem, ki se poveže v igro.", + "sq": "Le të ndryshojmë pronësinë e objektit me 2. Kjo do të lejojë të lidhet objekti **$(Player2)** me lojtarin e dytë që lidhet në lojë.", + "uk": "Змінимо власність об'єкта на 2. Це дозволить підключити об'єкт **$(Player2)** до другого гравця, який приєднався до гри.", + "zh": "让我们将对象的所有权改为2。这将允许将 **$(Player2)** 对象与第二位连接到游戏中的玩家连接起来。" + } + } + } + ], + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it for the objects!\n\nNow we will let online players control their own object by adding some logic into the eventsheet.", + "fr": "C'est tout pour les objets !\n\nMaintenant, nous permettrons aux joueurs en ligne de contrôler leur propre objet en ajoutant de la logique dans la feuille d'événements.", + "ar": "هذا كل شيء بالنسبة للكائنات!\n\nالآن سنسمح للاعبين عبر الإنترنت بالتحكم في كائناتهم الخاصة عن طريق إضافة بعض المنطق إلى ورقة الأحداث.", + "de": "Das war's mit den Objekten!\n\nJetzt werden wir es den Online-Spielern ermöglichen, ihre eigenen Objekte zu steuern, indem wir einige Logik in das Ereignisblatt einfügen.", + "es": "¡Eso es todo por los objetos!\n\nAhora permitiremos que los jugadores en línea controlen su propio objeto añadiendo algo de lógica en la hoja de eventos.", + "fi": "Siinä kaikki kohteista!\n\nNyt annamme verkkopelaajien hallita omaa kohdettaan lisäämällä hieman logiikkaa tapahtumatauluun.", + "it": "Questo è tutto per gli oggetti!\n\nOra permetteremo ai giocatori online di controllare il proprio oggetto aggiungendo della logica nel foglio degli eventi.", + "tr": "Nesneler için bu kadar!\n\nŞimdi online oyuncuların kendi nesnelerini kontrol etmelerine izin vermek için etkinlik tablosuna bazı mantık ekleyeceğiz.", + "ja": "これでオブジェクトに関する作業は完了です!\n\nさて、イベントシートにいくつかのロジックを追加することで、オンラインプレイヤーが自分のオブジェクトを制御できるようにします。", + "ko": "이로써 객체에 대한 작업은 마무리입니다!\n\n이제 이벤트 시트에 몇 가지 논리를 추가하여 온라인 플레이어가 자신의 객체를 제어할 수 있게 할 것입니다.", + "pl": "To wszystko, jeśli chodzi o obiekty!\n\nTeraz pozwolimy graczom online kontrolować własne obiekty, dodając pewną logikę do arkusza zdarzeń.", + "pt": "É isso para os objetos!\n\nAgora vamos permitir que os jogadores online controlem seu próprio objeto adicionando alguma lógica na planilha de eventos.", + "th": "นั่นคืออะไรสำหรับวัตถุ!\n\nตอนนี้เราจะให้ผู้เล่นทางออนไลน์ควบคุมวัตถุของตัวเองได้โดยการเพิ่มตัวตนในแผ่นเหตุการณ์", + "ru": "Это все для объектов!\n\nТеперь мы позволим онлайн-игрокам контролировать свои собственные объекты, добавив некоторую логику в таблицу событий.", + "sl": "To je vse za objekte!\n\nZdaj bomo omogočili spletnim igralcem, da nadzorujejo svoje lastne objekte z dodajanjem nekaj logike v dogodkovni list.", + "sq": "Kështu që për objektet!\n\nTani do t'u lejojmë lojtarëve në linjë të kontrollojnë objektin e tyre duke shtuar një logjikë në eventsheet.", + "uk": "Ось і все для об'єктів!\n\nТепер ми дозволимо онлайн-гравцям контролювати свої власні об'єкти, додавши деяку логіку до eventsheet.", + "zh": "对象部分就到这里!\n\n现在我们将通过在事件表中添加一些逻辑,让在线玩家可以控制他们自己的对象。" + } + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "editorTab:GameScene:EventsSheet", + "nextStepTrigger": { + "editorIsActive": "GameScene:EventsSheet" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the events sheet.", + "fr": "Ouvrez la feuille des événements.", + "ar": "افتح ورقة الأحداث.", + "de": "Öffnen Sie das Ereignisblatt.", + "es": "Abre la hoja de eventos.", + "fi": "Avaa tapahtumataulu.", + "it": "Apri il foglio degli eventi.", + "tr": "Olay tablosunu açın.", + "ja": "イベントシートを開く。", + "ko": "이벤트 시트를 엽니다.", + "pl": "Otwórz arkusz zdarzeń.", + "pt": "Abra a planilha de eventos.", + "th": "เปิดแผ่นงานเหตุการณ์", + "ru": "Откройте лист событий.", + "sl": "Odpri dogodkovni list.", + "sq": "Hapni fletën e ngjarjeve.", + "uk": "Відкрийте аркуш подій.", + "zh": "打开事件表。" + } + } + } + }, + { + "elementToHighlightId": "#events-editor[data-active] #event-1-1-conditions #add-condition-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Thanks to the previously added behavior on the **$(Player1)** and **$(Player2)** objects, new conditions are available on these two objects.\n\nTo reduce the number of conditions, we've placed these objects in an **Object Group** named **PlayerObjects**.\n\nLet's add a new condition that will check if the objects from the group are owned by the right player.", + "fr": "Grâce aux comportements précédemment ajoutés sur les objets **$(Player1)** et **$(Player2)**, de nouvelles conditions sont disponibles sur ces deux objets.\n\nPour réduire le nombre de conditions, nous avons placé ces objets dans un **Groupe d'objets** nommé **PlayerObjects**.\n\nAjoutons une nouvelle condition qui vérifiera si les objets du groupe sont possédés par le bon joueur.", + "ar": "بفضل السلوكيات المضافة سابقاً على أشياء **$(Player1)** و **$(Player2)** ، تتوفر شروط جديدة على هاتين الكائنتين.\n\nلتقليل عدد الشروط ، قمنا بوضع هذه الكائنات في **مجموعة كائنات** تحت اسم **PlayerObjects**.\n\nلنضيف شرطًا جديدًا سيتحقق مما إذا كانت الكائنات من المجموعة تمتلكها اللاعب الصحيح.", + "de": "Dank des zuvor hinzugefügten Verhaltens auf den Objekten **$(Player1)** und **$(Player2)** stehen neue Bedingungen für diese beiden Objekte zur Verfügung.\n\nUm die Anzahl der Bedingungen zu reduzieren, haben wir diese Objekte in einer **Objektgruppe** namens **PlayerObjects** platziert.\n\nLassen Sie uns eine neue Bedingung hinzufügen, die überprüft, ob die Objekte aus der Gruppe dem richtigen Spieler gehören.", + "es": "Gracias al comportamiento previamente añadido en los objetos **$(Player1)** y **$(Player2)**, ahora hay nuevas condiciones disponibles para estos dos objetos.\n\nPara reducir el número de condiciones, hemos colocado estos objetos en un **Grupo de Objetos** llamado **PlayerObjects**.\n\nVamos a añadir una nueva condición que verificará si los objetos del grupo son propiedad del jugador correcto.", + "fi": "Aiemmin lisätyn käyttäytymisen ansiosta **$(Player1)** ja **$(Player2)** -kohteisiin on saatavilla uusia ehtoja.\n\nEhtojen määrän vähentämiseksi olemme sijoittaneet nämä kohteet **Objektiryhmään** nimeltä **PlayerObjects**.\n\nLisätään uusi ehto, joka tarkistaa, ovatko ryhmän kohteet oikean pelaajan omistuksessa.", + "it": "Grazie al comportamento aggiunto in precedenza sugli oggetti **$(Player1)** e **$(Player2)**, sono disponibili nuove condizioni su questi due oggetti.\n\nPer ridurre il numero di condizioni, abbiamo inserito questi oggetti in un **Gruppo di Oggetti** chiamato **PlayerObjects**.\n\nAggiungiamo una nuova condizione che verificherà se gli oggetti del gruppo sono di proprietà del giocatore corretto.", + "tr": "Önceki olarak **$(Player1)** ve **$(Player2)** nesnelerine eklenen davranışlar sayesinde, bu iki nesne üzerinde yeni koşullar mevcut.\n\nKoşulların sayısını azaltmak için bu nesneleri **PlayerObjects** adlı bir **Nesne Grubu**'na yerleştirdik.\n\nBu gruptaki nesnelerin doğru oyuncuya ait olup olmadığını kontrol edecek yeni bir koşul ekleyelim.", + "ja": "**$(Player1)** および **$(Player2)** オブジェクトに以前追加した動作のおかげで、これらの2つのオブジェクトに新しい条件が利用可能になりました。\n\n条件の数を減らすために、これらのオブジェクトを **PlayerObjects** という名前の **オブジェクトグループ** に配置しました。\n\nグループ内のオブジェクトが正しいプレイヤーの所有物であるかどうかをチェックする新しい条件を追加しましょう。", + "ko": "**$(Player1)** 및 **$(Player2)** 객체에 이전에 추가된 동작 덕분에, 이 두 객체에 새로운 조건이 가능해졌습니다.\n\n조건의 수를 줄이기 위해 이 객체들을 **PlayerObjects**라는 **객체 그룹**에 넣었습니다.\n\n이 그룹의 객체가 올바른 플레이어에 의해 소유되었는지 확인할 새로운 조건을 추가해 봅시다.", + "pl": "Dzięki wcześniej dodanym zachowaniom na obiektach **$(Player1)** i **$(Player2)**, dostępne są nowe warunki dla tych dwóch obiektów.\n\nAby zmniejszyć liczbę warunków, umieściliśmy te obiekty w **Grupie Obiektów** o nazwie **PlayerObjects**.\n\nDodajmy nowy warunek, który sprawdzi, czy obiekty z grupy są własnością właściwego gracza.", + "pt": "Graças ao comportamento previamente adicionado nos objetos **$(Player1)** e **$(Player2)**, novas condições estão disponíveis para esses dois objetos.\n\nPara reduzir a quantidade de condições, colocamos esses objetos em um **Grupo de Objetos** chamado **PlayerObjects**.\n\nVamos adicionar uma nova condição que verificará se os objetos do grupo são de propriedade do jogador correto.", + "th": "ด้วยความขอบคุณต่อพฤติกรรมที่เพิ่มไว้ก่อนหน้านี้บนวัตถุ **$(Player1)** และ **$(Player2)** ตอนนี้มีเงื่อนไขใหม่ที่สามารถใช้ได้บนวัตถุสองตัวนี้\n\nเพื่อลดจำนวนเงื่อนไขเราได้วางวัตถุเหล่านี้ไว้ใน **กลุ่มวัตถุ** ชื่อ **PlayerObjects**\n\nเรามาเพิ่มเงื่อนไขใหม่ที่จะตรวจสอบว่าวัตถุจากกลุ่มนี้เป็นเจ้าของของผู้เล่นที่ถูกต้อง", + "ru": "Благодаря предварительно добавленному поведению на объектах **$(Player1)** и **$(Player2)** появились новые условия для этих двух объектов.\n\nЧтобы сократить количество условий, мы поместили эти объекты в **Группу объектов** с именем **PlayerObjects**.\n\nДобавим новое условие, которое проверит, принадлежат ли объекты из группы правильному игроку.", + "sl": "Zahvaljujoč prej dodanemu vedenju na predmetih **$(Player1)** in **$(Player2)**, so na teh dveh predmetih na voljo novi pogoji.\n\nDa zmanjšamo število pogojev, smo te predmete postavili v **Skupino predmetov** imenovano **PlayerObjects**.\n\nDodajmo nov pogoj, ki bo preveril, ali so predmeti iz skupine last lastniku.", + "sq": "Falë veprimeve të shtuara më parë në objektet **$(Player1)** dhe **$(Player2)**, janë në dispozicion kushte të reja për këto dy objekte.\n\nPër të zvogëluar numrin e kushteve, kemi vendosur këto objekte në një **Grup** **Objekt** të quajtur **PlayerObjects**.\n\nLe të shtojmë një kusht të ri që do të kontrollojë nëse objektet nga grupi janë të pronësisë së lojtarit të duhur.", + "uk": "Завдяки раніше доданому поведінці на об'єктах **$(Player1)** і **$(Player2)**, на цих двох об'єктах доступні нові умови.\n\nЩоб зменшити кількість умов, ми розмістили ці об'єкти в **Групу об'єктів** під назвою **PlayerObjects**.\n\nДодаймо нову умову, яка перевірить, чи належать об'єкти з групи правильному гравцеві.", + "zh": "由于先前在 **$(Player1)** 和 **$(Player2)** 对象上添加的行为,这两个对象上现在有了新的条件可用。\n\n为了减少条件的数量,我们将这些对象放置在名为 **PlayerObjects** 的 **对象组** 中。\n\n让我们添加一个新条件,检查组中的对象是否由正确的玩家拥有。" + } + } + } + }, + { + "elementToHighlightId": "div[data-group-name=PlayerObjects]", + "nextStepTrigger": { + "presenceOfElement": "#object-instruction-selector" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select this object group, it contains our **$(Player1)** and **$(Player2)** objects.", + "fr": "Sélectionnez ce groupe d'objets, il contient nos objets **$(Player1)** et **$(Player2)**.", + "ar": "اختر مجموعة الكائنات هذه، فهي تحتوي على كائناتنا **$(Player1)** و **$(Player2)**.", + "de": "Wählen Sie diese Objektgruppe aus, sie enthält unsere **$(Player1)** und **$(Player2)** Objekte.", + "es": "Selecciona este grupo de objetos, contiene nuestros objetos **$(Player1)** y **$(Player2)**.", + "fi": "Valitse tämä kohteiden ryhmä, se sisältää **$(Player1)** ja **$(Player2)** -kohteemme.", + "it": "Seleziona questo gruppo di oggetti, contiene i nostri oggetti **$(Player1)** e **$(Player2)**.", + "tr": "Bu nesne grubunu seçin, içinde **$(Player1)** ve **$(Player2)** nesnelerimiz bulunmaktadır.", + "ja": "このオブジェクトグループを選択してください。ここには私たちの **$(Player1)** と **$(Player2)** のオブジェクトが含まれています。", + "ko": "이 객체 그룹을 선택하세요, 여기에는 **$(Player1)** 와 **$(Player2)** 객체가 포함되어 있습니다.", + "pl": "Wybierz tę grupę obiektów, zawiera nasze obiekty **$(Player1)** i **$(Player2)**.", + "pt": "Selecione este grupo de objetos, ele contém nossos objetos **$(Player1)** e **$(Player2)**.", + "th": "เลือกกลุ่มวัตถุนี้ มันประกอบด้วยวัตถุ **$(Player1)** และ **$(Player2)** ของเรา", + "ru": "Выберите эту группу объектов, она содержит наши объекты **$(Player1)** и **$(Player2)**.", + "sl": "Izberite to skupino objektov, ki vsebuje naše **$(Player1)** in **$(Player2)** objekte.", + "sq": "Zgjidh grupin e këtyre objekteve, përmban objektet tona **$(Player1)** dhe **$(Player2)**.", + "uk": "Виберіть цю групу об'єктів, вона містить наші об'єкти **$(Player1)** і **$(Player2)**.", + "zh": "选择这个对象组,它包含我们的 **$(Player1)** 和 **$(Player2)** 对象。" + } + }, + "placement": "top", + "mobilePlacement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-Multiplayer--MultiplayerObjectBehavior--IsObjectOwnedByCurrentPlayer", + "isOnClosableDialog": true, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select this condition.\n\nWith this condition you will check if the connected players are using the right Player1 or Player2 object from the group", + "fr": "Sélectionnez cette condition.\n\nAvec cette condition, vous vérifierez si les joueurs connectés utilisent les bons objets Player1 ou Player2 du groupe.", + "ar": "حدد هذا الشرط.\n\nمع هذا الشرط، ستتحقق مما إذا كان اللاعبون المتصلون يستخدمون الكائن Player1 أو Player2 الصحيح من المجموعة.", + "de": "Wählen Sie diese Bedingung aus.\n\nMit dieser Bedingung überprüfen Sie, ob die verbundenen Spieler das richtige Player1- oder Player2-Objekt aus der Gruppe verwenden.", + "es": "Seleccione esta condición.\n\nCon esta condición comprobará si los jugadores conectados están utilizando el objeto Player1 o Player2 correcto del grupo.", + "fi": "Valitse tämä ehto.\n\nTällä ehdolla tarkistetaan, käyttävätkö yhteydessä olevat pelaajat oikeaa Player1- tai Player2-kohdetta ryhmästä.", + "it": "Seleziona questa condizione.\n\nCon questa condizione verificherai se i giocatori connessi stanno utilizzando il Player1 o Player2 corretto dal gruppo.", + "tr": "Bu koşulu seçin.\n\nBu koşul ile bağlı oyuncuların grup içindeki doğru Player1 veya Player2 nesnesini kullanıp kullanmadığını kontrol edeceksiniz.", + "ja": "この条件を選択します。\n\nこの条件で、接続されているプレイヤーがグループから正しいPlayer1またはPlayer2オブジェクトを使用しているかどうかを確認します。", + "ko": "이 조건을 선택하세요.\n\n이 조건으로 연결된 플레이어가 그룹에서 올바른 Player1 또는 Player2 객체를 사용하는지 확인할 수 있습니다.", + "pl": "Wybierz ten warunek.\n\nZ tym warunkiem sprawdzisz, czy połączeni gracze używają odpowiednich obiektów Player1 lub Player2 z grupy.", + "pt": "Selecione esta condição.\n\nCom esta condição, você verificará se os jogadores conectados estão usando o objeto Player1 ou Player2 correto do grupo.", + "th": "เลือกเงื่อนไขนี้\n\nด้วยเงื่อนไขนี้คุณจะตรวจสอบว่าผู้เล่นที่เชื่อมต่อกันใช้วัตถุ Player1 หรือ Player2 ที่ถูกต้องจากกลุ่มหรือไม่", + "ru": "Выберите этот условие.\n\nС помощью этого условия вы проверите, используют ли подключенные игроки правильные объекты Player1 или Player2 из группы.", + "sl": "Izberite to stanje.\n\nS tem stanjem boste preverili, ali povezani igralci uporabljajo pravilne predmete Player1 ali Player2 iz skupine.", + "sq": "Zgjidhni këtë kusht.\n\nMe këtë kusht do të kontrolloni nëse lojtarët e lidhur po përdorin objektet e duhura Player1 ose Player2 nga grupi.", + "uk": "Виберіть цей випадок.\n\nЗ цим умовою ви перевірите, чи використовують підключені гравці правильні об'єкти Player1 або Player2 з групи.", + "zh": "选择此条件。\n\n使用此条件,您将检查连接的玩家是否正在使用组中正确的Player1或Player2对象。" + } + } + }, + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + } + }, + { + "elementToHighlightId": "#ok-button", + "isOnClosableDialog": true, + "tooltip": { + "description": { + "messageByLocale": { + "en": "That's it!", + "fr": "C'est tout !", + "ar": "هذا كل شيء!", + "de": "Das war's!", + "es": "¡Eso es todo!", + "fi": "Siiin se!", + "it": "È tutto!", + "tr": "Bu kadar!", + "ja": "以上です!", + "ko": "그게 다입니다!", + "pl": "To wszystko!", + "pt": "É isso!", + "th": "เสร็จสิ้นแล้ว!", + "ru": "Вот и всё!", + "sl": "To je to!", + "sq": "Kështu është!", + "uk": "Ось і все!", + "zh": "就这样!" + } + } + }, + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + } + }, + { + "elementToHighlightId": "#toolbar-preview-split-menu-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game in multiple previews to emulate two online players!\n\nClick on the **down arrow**, then click **Launch preview in...** > **2 previews in 2 windows**", + "fr": "Nous avons terminé ! Testons notre jeu avec plusieurs prévisualisations pour simuler deux joueurs en ligne !\n\nCliquez sur la **flèche vers le bas**, puis cliquez sur **Lancer la prévisualisation dans...** > **2 prévisualisations dans 2 fenêtres**", + "ar": "لقد انتهينا! دعونا نختبر لعبتنا في عدة معاينات لنحاكي لاعبين اثنين عبر الإنترنت!\n\nانقر على **السهم الأسفل**, ثم انقر **تشغيل المعاينة في...** > **2 معاينات في 2 نوافذ**", + "de": "Wir sind fertig! Testen wir unser Spiel in mehreren Vorschauen, um zwei Online-Spieler zu simulieren!\n\nKlicken Sie auf den **Abwärtspfeil**, dann auf **Vorschau starten in...** > **2 Vorschauen in 2 Fenstern**", + "es": "¡Hemos terminado! ¡Vamos a probar nuestro juego en varias previsualizaciones para emular a dos jugadores en línea!\n\nHaz clic en la **flecha hacia abajo**, luego haz clic en **Iniciar previsualización en...** > **2 previsualizaciones en 2 ventanas**", + "fi": "Olemme valmiit! Testataan peliämme useissa esikatseluissa, jotta voimme jäljitellä kahta verkkopelaajaa!\n\nKlikkaa **alas nuolta**, sitten klikkaa **Käynnistä esikatselu...** > **2 esikatselua 2 ikkunassa**", + "it": "Abbiamo finito! Testiamo il nostro gioco in più anteprime per emulare due giocatori online!\n\nClicca sulla **freccia in giù**, poi clicca su **Avvia anteprima in...** > **2 anteprime in 2 finestre**", + "tr": "Bitti! İki çevrimiçi oyuncuyu taklit etmek için oyunumuzu birden fazla önizlemede test edelim!\n\n**Aşağı ok**'a tıklayın, ardından **Önizlemeyi başlat...** > **2 önizleme 2 pencere**'yi tıklayın", + "ja": "完了です!2人のオンラインプレイヤーをエミュレートするために複数のプレビューでゲームをテストしましょう!\n\n**下向き矢印**をクリックし、次に**プレビューを起動...** > **2つのウィンドウで2つのプレビュー**をクリックします。", + "ko": "작업을 마쳤습니다! 두 명의 온라인 플레이어를 모방하기 위해 여러 프리뷰에서 게임을 테스트해 봅시다!\n\n**아래 화살표**를 클릭한 다음 **미리보기 시작...** > **2개 창에서 2개의 미리보기**를 클릭하세요.", + "pl": "Skończyliśmy! Przetestujmy naszą grę w wielu podglądach, aby naśladować dwóch graczy online!\n\nKliknij **strzałkę w dół**, a następnie kliknij **Uruchom podgląd w...** > **2 podglądy w 2 oknach**", + "pt": "Terminamos! Vamos testar nosso jogo em várias pré-visualizações para simular dois jogadores online!\n\nClique na **seta para baixo**, então clique em **Iniciar pré-visualização em...** > **2 pré-visualizações em 2 janelas**", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราในการแสดงตัวอย่างหลายรูปแบบเพื่อจำลองผู้เล่นสองคนออนไลน์!\n\nคลิกที่ **ลูกศรลง**, จากนั้นคลิกที่ **เริ่มต้นการแสดงตัวอย่างใน...** > **2 การแสดงตัวอย่างใน 2 หน้าต่าง**", + "ru": "Мы закончили! Давайте протестируем нашу игру в нескольких предпросмотрах, чтобы эмулировать двух онлайн игроков!\n\nНажмите на **стрелку вниз**, затем выберите **Запустить предпросмотр в...** > **2 предпросмотра в 2 окнах**", + "sl": "To je to! Testirajmo našo igro v več predogledih, da posnemamo dva spletna igralca!\n\nKliknite na **puščico dol**, nato kliknite **Zaženi predogled v...** > **2 predogleda v 2 oknih**", + "sq": "Kështu është! Le të testojmë lojën tonë në shumë paraparje për të imituar dy lojtarët në linjë!\n\nKlikoni në **shigjetën poshtë**, pastaj klikoni **Lansoje paraparjen në...** > **2 paraparje në 2 dritare**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру в кількох попередніх переглядах, щоб емулювати двох онлайн гравців!\n\nНатисніть на **стрілку вниз**, потім виберіть **Запустити попередній перегляд у...** > **2 попередні перегляди в 2 вікнах**", + "zh": "完成了!让我们在多个预览中测试我们的游戏,以模拟两名在线玩家!\n\n点击 **向下箭头**,然后点击 **在...中启动预览** > **2个窗口中的2个预览**" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "We're done! Let's test our game by launching a preview!", + "fr": "Nous avons terminé ! Testons notre jeu en lançant une prévisualisation !", + "ar": "لقد انتهينا! دعونا نختبر لعبتنا عن طريق تشغيل معاينة!", + "de": "Wir sind fertig! Testen wir unser Spiel, indem wir eine Vorschau starten!", + "es": "¡Hemos terminado! ¡Vamos a probar nuestro juego lanzando una previsualización!", + "fi": "Olemme valmiit! Testataan peliämme käynnistämällä esikatselu!", + "it": "Abbiamo finito! Testiamo il nostro gioco avviando una anteprima!", + "tr": "Bitti! Bir önizleme başlatarak oyunumuzu test edelim!", + "ja": "完了です!プレビューを起動してゲームをテストしましょう!", + "ko": "작업을 마쳤습니다! 미리보기를 시작하여 게임을 테스트해 봅시다!", + "pl": "Skończyliśmy! Przetestujmy naszą grę, uruchamiając podgląd!", + "pt": "Terminamos! Vamos testar nosso jogo iniciando uma pré-visualização!", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราโดยการเริ่มต้นการแสดงตัวอย่าง!", + "ru": "Мы закончили! Давайте протестируем нашу игру, запустив предпросмотр!", + "sl": "To je to! Testirajmo našo igro z zagonom predogleda!", + "sq": "Kështu është! Le të testojmë lojën tonë duke lansuar një paraparje!", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, запустивши попередній перегляд!", + "zh": "完成了!让我们通过启动预览来测试我们的游戏!" + } + }, + "placement": "bottom", + "mobilePlacement": "bottom" + }, + "nextStepTrigger": { + "previewLaunched": true + } + } + ], + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد انتهيت من هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai completato questa lezione!", + "tr": "# Bu dersi tamamladınız!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 마쳤습니다!", + "pl": "# Zakończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณได้เสร็จสิ้นบทเรียนนี้แล้ว!", + "ru": "# Вы завершили это урок!", + "sl": "# Dokončali ste ta pouk!", + "sq": "# Keni përfunduar këtë mësim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你已完成本课程!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, dans ce tutoriel vous avez appris comment :", + "ar": "أحسنت، في هذا الدرس التعليمي تعلمت كيفية :", + "de": "Gut gemacht, in diesem Tutorial haben Sie gelernt, wie Sie:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu dersi tamamladınız ve şunları öğrendiniz:", + "ja": "お疲れ様です、このチュートリアルでは以下の方法を学びました:", + "ko": "잘 했어요, 이 튜토리얼에서는 다음을 배웠습니다:", + "pl": "Dobrze wykonane, w tym samouczku nauczyłeś się, jak:", + "pt": "Bem feito, neste tutorial você aprendeu como:", + "th": "เก่งมาก เรียนรู้วิธีทำดังนี้ในบทแนะนำนี้", + "ru": "Отлично сработано, в этом учебнике вы узнали, как:", + "sl": "Dobro opravljeno, v tem vadnem programu ste se naučili, kako:", + "sq": "Mirë, në këtë udhëzues keni mësuar si të:", + "uk": "Добре зроблено, у цьому підручнику ви вивчили, як:", + "zh": "干得好,在这个教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to add and configure the multiplayer behavior\n\n - How an online player can control their character with the multiplayer ownership system", + "fr": "- Comment ajouter et configurer le comportement multijoueur\n\n - Comment un joueur en ligne peut contrôler son personnage avec le système de propriété multijoueur", + "ar": "- كيفية إضافة وتكوين سلوك متعدد اللاعبين\n\n - كيف يمكن للاعب عبر الإنترنت التحكم في شخصيته باستخدام نظام الملكية متعدد اللاعبين", + "de": "- Wie man das Mehrspieler-Verhalten hinzufügt und konfiguriert\n\n - Wie ein Online-Spieler seinen Charakter mit dem Mehrspieler-Eigentumssystem steuern kann", + "es": "- Cómo añadir y configurar el comportamiento multijugador\n\n - Cómo un jugador en línea puede controlar su personaje con el sistema de propiedad multijugador", + "fi": "- Kuinka lisätä ja määrittää moninpelikäyttäytyminen\n\n - Kuinka verkkopelaaja voi hallita hahmoaan moninpelioikeusjärjestelmällä", + "it": "- Come aggiungere e configurare il comportamento multiplayer\n\n - Come un giocatore online può controllare il suo personaggio con il sistema di proprietà multiplayer", + "tr": "- Çok oyunculu davranışı nasıl ekleyip yapılandıracağınızı\n\n - Çevrimiçi bir oyuncunun çok oyunculu sahiplik sistemiyle karakterini nasıl kontrol edebileceğini", + "ja": "- マルチプレイヤーの動作を追加および設定する方法\n\n - オンラインプレイヤーがマルチプレイヤー所有システムで自分のキャラクターを制御する方法", + "ko": "- 멀티플레이어 동작 추가 및 구성 방법\n\n - 온라인 플레이어가 멀티플레이어 소유권 시스템으로 캐릭터를 제어하는 방법", + "pl": "- Jak dodać i skonfigurować zachowanie wieloosobowe\n\n - Jak gracz online może kontrolować swoją postać za pomocą systemu własności wieloosobowej", + "pt": "- Como adicionar e configurar o comportamento multiplayer\n\n - Como um jogador online pode controlar seu personagem com o sistema de propriedade multiplayer", + "th": "- วิธีการเพิ่มและกำหนดค่าพฤติกรรมการเล่นหลายคน\n\n - วิธีการที่ผู้เล่นออนไลน์สามารถควบคุมตัวละครของเขาด้วยระบบการเป็นเจ้าของหลายคน", + "ru": "- Как добавить и настроить мультиплеерное поведение\n\n - Как онлайн-игрок может контролировать своего персонажа с помощью системы владения в мультиплеере", + "sl": "- Kako dodati in konfigurirati večigralsko vedenje\n\n - Kako lahko spletni igralec nadzoruje svoj lik s sistemom lastništva večigralstva", + "sq": "- Si të shtoni dhe të konfiguroni sjelljen multiplayer\n\n - Si një lojtar në linjë mund të kontrollojë personazhin e tij me sistemin e pronësisë multiplayer", + "uk": "- Як додати та налаштувати багатокористувацьку поведінку\n\n - Як онлайн-гравець може контролювати свого персонажа за допомогою системи власності в багатокористувацькому режимі", + "zh": "- 如何添加和配置多人游戏行为\n\n - 在线玩家如何通过多人游戏所有权系统控制其角色" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des éléments à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir añadiendo cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、それを公開することができます!", + "ko": "이 게임에 계속해서 새로운 요소를 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "th": "คุณสามารถเพิ่มสิ่งต่างๆในเกมนี้ต่อได้หรือตีพิมพ์!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni atë!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续添加内容到这个游戏中或发布它!" + } + } + ] + } +} diff --git a/tutorials/in-app/fireABullet.json b/tutorials/in-app/fireABullet.json new file mode 100644 index 0000000..ac8dd4b --- /dev/null +++ b/tutorials/in-app/fireABullet.json @@ -0,0 +1,682 @@ +{ + "id": "fireABullet", + "titleByLocale": { + "en": "Let's fire a bullet", + "fr": "Tirer une balle", + "ar": "إطلاق رصاصة", + "de": "Eine Kugel abfeuern", + "es": "Dispara una bala", + "fi": "Ammu luoti", + "it": "Spara un proiettile", + "tr": "Bir kurşun ateşle", + "ja": "弾を発射する", + "ko": "총알 발사", + "pl": "Strzelaj pociskiem", + "pt": "Disparar uma bala", + "th": "ยิงลูกพลัด", + "ru": "Выстрелить пулей", + "sl": "Strel izstreli", + "sq": "Qëllo një plumb", + "uk": "Вистрілити кулею", + "zh": "开火" + }, + "bulletPointsByLocale": [ + { + "en": "Use a behavior to fire a bullet.", + "fr": "Utilisez un comportement pour tirer une balle.", + "ar": "استخدم سلوكًا لاطلاق النار بالرصاصة.", + "de": "Verwenden Sie ein Verhalten, um eine Kugel abzufeuern.", + "es": "Utiliza un comportamiento para disparar una bala.", + "fi": "Käytä käyttäytymistä ampuaksesi luodin.", + "it": "Usa un comportamento per sparare un proiettile.", + "tr": "Bir kurşun ateşlemek için bir davranış kullanın.", + "ja": "行動を使用して弾を発射します。", + "ko": "행동을 사용하여 총알을 발사하십시오.", + "pl": "Użyj zachowania, aby strzelać pociskiem.", + "pt": "Use um comportamento para disparar uma bala.", + "th": "ใช้พฤติกรรมเพื่อยิงลูกพลัด.", + "ru": "Используйте поведение для выстрела пулей.", + "sl": "Uporabite vedenje za strel iz strele.", + "sq": "Përdorni një sjellje për të qëlluar një plumb.", + "uk": "Використовуйте поведінку для пострілу кулею.", + "zh": "使用行为来开火。" + }, + { + "en": "Add an action to fire the bullet in the good direction.", + "fr": "Ajoutez une action pour tirer la balle dans la bonne direction.", + "ar": "أضف إجراءً لإطلاق الرصاصة في الاتجاه الصحيح.", + "de": "Fügen Sie eine Aktion hinzu, um die Kugel in die richtige Richtung abzufeuern.", + "es": "Agrega una acción para disparar la bala en la dirección correcta.", + "fi": "Lisää toiminto ampuaksesi luoti oikeaan suuntaan.", + "it": "Aggiungi un'azione per sparare il proiettile nella giusta direzione.", + "tr": "Mermiyi doğru yönde ateşlemek için bir eylem ekleyin.", + "ja": "良い方向に弾を発射するためのアクションを追加します。", + "ko": "좋은 방향으로 총알을 발사하기 위한 동작을 추가하십시오.", + "pl": "Dodaj akcję, aby strzelać pociskiem w dobrym kierunku.", + "pt": "Adicione uma ação para disparar a bala na direção correta.", + "th": "เพิ่มการกระทำเพื่อยิงกระสุนในทิศทางที่ดี", + "ru": "Добавьте действие для выстрела пулей в нужном направлении.", + "sl": "Dodajte dejanje za streljanje krogle v pravo smer.", + "sq": "Shtoni një veprim për të qëlluar plumbin në drejtimin e duhur.", + "uk": "Додайте дію для вистрілу кулею в потрібному напрямку.", + "zh": "添加一个动作,以正确的方向射击子弹。" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "PlayScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "PlayScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/fireABullet/game.json", + "initialProjectData": { + "player": "Player", + "bullet": "Bullet", + "PlayScene": "PlayScene" + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a space shooter. We'll add the capability for the ship to shoot the asteroids using the **Fire Bullet behavior**.\n\nLet's see the current game state.\nClick on the **preview** button to play.", + "fr": "Ce jeu est un jeu de tir spatial. Nous ajouterons la capacité pour le vaisseau de tirer sur les astéroïdes en utilisant le comportement **Fire Bullet**.\n\nVoyons l'état actuel du jeu.\nCliquez sur le bouton **aperçu** pour jouer.", + "ar": "هذه اللعبة هي لعبة إطلاق نار فضائية. سنضيف القدرة للسفينة على إطلاق النار على الكويكبات باستخدام سلوك **Fire Bullet**.\n\nلنرى حالة اللعبة الحالية.\nانقر فوق زر **معاينة** للعب.", + "de": "Dieses Spiel ist ein Weltraum-Shooter. Wir werden die Fähigkeit für das Schiff hinzufügen, die Asteroiden mit dem **Fire Bullet Verhalten** zu beschießen.\n\nLassen Sie uns den aktuellen Spielzustand sehen.\nKlicken Sie auf die **Vorschau**-Schaltfläche, um zu spielen.", + "es": "Este juego es un shooter espacial. Añadiremos la capacidad para que la nave dispare a los asteroides utilizando el comportamiento **Fire Bullet**.\n\nVeamos el estado actual del juego.\nHaz clic en el botón **vista previa** para jugar.", + "fi": "Tämä peli on avaruusammuskelu. Lisäämme alukselle kyvyn ampua asteroidit käyttämällä **Fire Bullet -käyttäytymistä**.\n\nKatsotaan nykyinen pelitila.\nKlikkaa **esikatselu**-painiketta pelataksesi.", + "it": "Questo gioco è uno sparatutto spaziale. Aggiungeremo la capacità per la nave di sparare agli asteroidi utilizzando il comportamento **Fire Bullet**.\n\nVediamo lo stato attuale del gioco.\nClicca sul pulsante **anteprima** per giocare.", + "tr": "Bu oyun bir uzay atış oyunudur. **Fire Bullet davranışı** kullanarak geminin asteroidlere ateş etme yeteneğini ekleyeceğiz.\n\nMevcut oyun durumunu görelim.\nOynamak için **önizleme** düğmesine tıklayın.", + "ja": "このゲームは宇宙シューティングゲームです。**Fire Bullet** の振る舞いを使って、宇宙船が小惑星を撃つ能力を追加します。\n\n現在のゲームの状態を見てみましょう。\n**プレビュー** ボタンをクリックしてプレイします。", + "ko": "이 게임은 우주 슈팅 게임입니다. 우리는 **Fire Bullet** 동작을 사용하여 우주선이 소행성을 격파할 수 있는 능력을 추가할 것입니다.\n\n현재 게임 상태를 확인해 봅시다.\n**미리보기** 버튼을 클릭하여 플레이하세요.", + "pl": "Ta gra to strzelanka kosmiczna. Dodamy możliwość strzelania statku do asteroid za pomocą zachowania **Fire Bullet**.\n\nZobaczmy obecny stan gry.\nKliknij przycisk **Podgląd**, aby zagrać.", + "pt": "Este jogo é um shooter espacial. Vamos adicionar a capacidade para a nave disparar nos asteroides usando o comportamento **Fire Bullet**.\n\nVamos ver o estado atual do jogo.\nClique no botão **pré-visualização** para jogar.", + "th": "เกมนี้เป็นเกมยิงอวกาศ เราจะเพิ่มความสามารถให้กับเรือในการยิงหินดาวด้วยพฤติกรรม **Fire Bullet**\n\nมาดูสถานะปัจจุบันของเกมกัน\nคลิกที่ปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "ru": "Эта игра является космическим шутером. Мы добавим возможность кораблю стрелять по астероидам с использованием поведения **Fire Bullet**.\n\nДавайте посмотрим на текущее состояние игры.\nНажмите кнопку **предварительный просмотр**, чтобы играть.", + "sl": "Ta igra je vesoljski strelec. Dodali bomo zmožnost za ladjo, da strelja asteroide z uporabo vedenja **Fire Bullet**.\n\nPoglejmo trenutno stanje igre.\nKliknite gumb **predogled**, da začnete igrati.", + "sq": "Kjo lojë është një lojë që qëlloi hapësirën. Do të shtojmë aftësinë për anijen për të qëlloi asteroidet duke përdorur sjelljen **Fire Bullet**.\n\nTani le të shohim gjendjen aktuale të lojës.\nKlikoni në butonin **parashikim** për të luajtur.", + "uk": "Ця гра є космічним шутером. Ми додамо можливість для корабля стріляти в астероїди за допомогою поведінки **Fire Bullet**.\n\nДавайте подивимося на поточний стан гри.\nНатисніть кнопку **перегляд**, щоб грати.", + "zh": "这款游戏是一款太空射击游戏。我们将使用 **Fire Bullet** 行为为飞船添加射击小行星的能力。\n\n让我们查看当前游戏状态。\n点击 **预览** 按钮开始游戏。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "bottom-right", + "inGameMessage": { + "messageByLocale": { + "en": "The ship can move, but it cannot yet open fire because the **Fire Bullet behavior** is missing from the $(player) object.\n\nLet's fix it! Close this window and return to the editor.", + "fr": "Le vaisseau peut se déplacer, mais il ne peut pas encore ouvrir le feu car le comportement **Fire Bullet** est absent de l'objet **$(player)**.\n\nAjoutons-le. Fermez cette fenêtre et revenez à l'éditeur.", + "ar": "السفينة يمكنها الحركة، لكنها لا تستطيع فتح النار بعد لأن سلوك **Fire Bullet** مفقود من كائن **$(player)**.\n\nلنضيفه. أغلق هذه النافذة وعد إلى المحرر.", + "de": "Das Schiff kann sich bewegen, aber es kann noch nicht feuern, weil das **Fire Bullet Verhalten** im $(player) Objekt fehlt.\n\nLassen Sie uns das hinzufügen. Schließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "La nave puede moverse, pero aún no puede abrir fuego porque falta el comportamiento **Fire Bullet** en el objeto **$(player)**.\n\nVamos a añadirlo. Cierra esta ventana y regresa al editor.", + "fi": "Alus voi liikkua, mutta se ei voi vielä avata tulta, koska **Fire Bullet -käyttäytymistä** ei ole $(player) -kohteessa.\n\nLisätään se. Sulje tämä ikkuna ja palaa editoriin.", + "it": "La nave può muoversi, ma non può ancora aprire il fuoco perché manca il comportamento **Fire Bullet** nell'oggetto **$(player)**.\n\nAggiungiamolo. Chiudi questa finestra e torna all'editor.", + "tr": "Gemimiz hareket edebilir, ancak henüz **Fire Bullet davranışı** $(player) nesnesinden eksik olduğu için henüz ateş edemez.\n\nEkleyelim. Bu pencereyi kapatın ve düzenleyiciye geri dönün.", + "ja": "宇宙船は動くことができますが、**Fire Bullet** の振る舞いが **$(player)** オブジェクトにないため、まだ射撃できません。\n\n追加しましょう。 このウィンドウを閉じてエディターに戻ってください。", + "ko": "우주선은 움직일 수 있지만 **Fire Bullet** 동작이 **$(player)** 객체에 없기 때문에 아직 발사할 수 없습니다.\n\n추가해 봅시다. 이 창을 닫고 편집기로 돌아가세요.", + "pl": "Statek może się poruszać, ale nie może jeszcze otworzyć ognia, ponieważ brakuje zachowania **Fire Bullet** w obiekcie $(player).\n\nDodajmy to. Zamknij to okno i wróć do edytora.", + "pt": "A nave pode se mover, mas ainda não pode abrir fogo porque o comportamento **Fire Bullet** está ausente do objeto **$(player)**.\n\nVamos adicioná-lo. Feche esta janela e volte para o editor.", + "th": "เรือสามารถเคลื่อนที่ได้ แต่ยังไม่สามารถเปิดไฟได้เพราะ **Fire Bullet behavior** หายไปจาก $(player) object.\n\nเรามาเพิ่มมัน. ปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "ru": "Корабль может двигаться, но пока не может открывать огонь, потому что поведение **Fire Bullet** отсутствует у объекта **$(player)**.\n\nДобавим его. Закройте это окно и вернитесь в редактор.", + "sl": "Ladja se lahko premika, vendar še ne more odpreti ognja, ker manjka vedenje **Fire Bullet** v objektu **$(player)**.\n\nDodajmo ga. Zapri to okno in se vrni v urejevalnik.", + "sq": "Ankandi mund të lëvizë, por nuk mund të hapë zjarrin ende sepse sjellja **Fire Bullet** mungon nga objekti $(player).\n\nTa shtojmë atë. Mbyllni këtë dritare dhe kthehuni te redaktori.", + "uk": "Корабель може рухатись, але він ще не може відкривати вогонь, тому що поведінка **Fire Bullet** відсутня у об'єкта $(player).\n\nДодаймо його. Закрийте це вікно та поверніться до редактора.", + "zh": "飞船可以移动,但由于 **$(player)** 对象中缺少 **Fire Bullet** 行为,因此尚无法开火。\n\n让我们添加它。 关闭此窗口并返回编辑器。" + } + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "player", + "isOnClosableDialog": true, + "behaviorListItemId": "#behavior-item-FireBullet--FireBullet", + "behaviorParameterPanelId": "#behavior-parameters-FireBullet", + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's add the capability for our $(player) to shoot with the help of the **Fire Bullet** behavior.\n\nClick on the 3 dot menu, or right-click on **$(player)**, and select **Edit behaviors**.", + "fr": "Ajoutons la capacité pour notre $(player) de tirer avec l'aide du comportement **Fire Bullet**.\n\nCliquez sur le menu à trois points, ou faites un clic droit sur **$(player)**, et sélectionnez **Modifier les comportements**.", + "ar": "لنضيف القدرة لـ $(player) لاطلاق النار بمساعدة سلوك **Fire Bullet**.\n\nانقر فوق القائمة المنسدلة بثلاث نقاط، أو انقر بزر الماوس الأيمن على **$(player)**، وحدد **تعديل السلوكيات**.", + "de": "Lassen Sie uns die Fähigkeit für unseren $(player) hinzufügen, mit Hilfe des **Fire Bullet**-Verhaltens zu schießen.\n\nKlicken Sie auf das Menü mit den drei Punkten oder klicken Sie mit der rechten Maustaste auf **$(player)** und wählen Sie **Verhalten bearbeiten** aus.", + "es": "Vamos a añadir la capacidad para nuestro $(player) de disparar con la ayuda del comportamiento **Fire Bullet**.\n\nHaz clic en el menú de tres puntos o haz clic derecho en **$(player)** y selecciona **Editar comportamientos**.", + "fi": "Lisätään $(player) -hahmolle kyky ampua **Fire Bullet -käyttäytymisen** avulla.\n\nKlikkaa 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(player)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo la capacità per il nostro $(player) di sparare con l'aiuto del comportamento **Fire Bullet**.\n\nFai clic sul menu a tre punti o fai clic con il pulsante destro del mouse su **$(player)** e seleziona **Modifica comportamenti**.", + "tr": "Gemimizin **Fire Bullet davranışı**nın yardımıyla ateş açma yeteneğini ekleyelim.\n\n3 noktalı menüye tıklayın veya **$(player)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "$(player) に **Fire Bullet** 振る舞いの助けを借りて撃つ能力を追加しましょう。\n\n3つの点のメニューをクリックするか、**$(player)** を右クリックして **動作を編集** を選択してください。", + "ko": "우리 $(player)에게 **Fire Bullet** 동작을 사용하여 발사할 수 있는 능력을 추가해 봅시다.\n\n3 점 메뉴를 클릭하거나 **$(player)**를 마우스 오른쪽 버튼으로 클릭하고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy zdolność strzelania dla naszego $(player) przy pomocy zachowania **Fire Bullet**.\n\nKliknij menu z trzema kropkami lub kliknij prawym przyciskiem myszy na **$(player)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar a capacidade para o nosso $(player) disparar com a ajuda do comportamento **Fire Bullet**.\n\nClique no menu de três pontos, ou clique com o botão direito do mouse em **$(player)** e selecione **Editar comportamentos**.", + "th": "เพิ่มความสามารถให้กับ $(player) ของเราในการยิงด้วยความช่วยเหลือของพฤติกรรม **Fire Bullet**\n\nคลิกที่เมนู 3 จุด หรือคลิกขวาที่ **$(player)** และเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим возможность для нашего $(player) стрелять с помощью поведения **Fire Bullet**.\n\nНажмите на меню с тремя точками или щелкните правой кнопкой мыши на **$(player)** и выберите **Изменить поведение**.", + "sl": "Dodajmo sposobnost za našega $(player) za streljanje s pomočjo vedenja **Fire Bullet**.\n\nKliknite na meni s tremi pikami ali desno kliknite na **$(player)** in izberite **Uredi vedenja**.", + "sq": "Të shtojmë aftësinë për $(player) tonë për të qëlluar me ndihmën e sjelljes **Fire Bullet**.\n\nKlikoni në menunë me tre pikë ose bëni klik djathtas në **$(player)** dhe zgjidhni **Redakto sjelljet**.", + "uk": "Додамо можливість для нашого $(player) стріляти за допомогою поведінки **Fire Bullet**.\n\nНатисніть на меню з трьома крапками або клацніть правою кнопкою миші на **$(player)** і виберіть **Редагувати поведінку**.", + "zh": "让我们使用 **Fire Bullet** 行为帮助我们的 $(player) 添加射击能力。\n\n点击三个点菜单,或右键点击 **$(player)**,然后选择 **编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's add the capability for our $(player) to shoot with the help of the **Fire Bullet** behavior.\n\nSelect, then long press on **$(player)**, then select **Edit behaviors**.", + "fr": "Ajoutons la capacité pour notre $(player) de tirer avec l'aide du comportement **Fire Bullet**.\n\nSélectionnez, puis maintenez enfoncé sur **$(player)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف القدرة لـ $(player) لإطلاق النار بمساعدة سلوك **Fire Bullet**.\n\nحدد، ثم اضغط بشكل طويل على **$(player)**، ثم حدد **تعديل السلوكيات**.", + "de": "Lassen Sie uns die Fähigkeit für unseren $(player) hinzufügen, mit Hilfe des **Fire Bullet**-Verhaltens zu schießen.\n\nWählen Sie, dann halten Sie lange auf **$(player)**, dann wählen Sie **Verhalten bearbeiten**.", + "es": "Vamos a añadir la capacidad para nuestro $(player) de disparar con la ayuda del comportamiento **Fire Bullet**.\n\nSelecciona, luego mantén presionado en **$(player)**, luego selecciona **Editar comportamientos**.", + "fi": "Lisätään $(player) -hahmolle kyky ampua **Fire Bullet -käyttäytymisen** avulla.\n\nValitse, sitten pidä pitkään painettuna **$(player)**, sitten valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo la capacità per il nostro $(player) di sparare con l'aiuto del comportamento **Fire Bullet**.\n\nSeleziona, quindi tieni premuto su **$(player)**, quindi seleziona **Modifica comportamenti**.", + "tr": "Gemimizin **Fire Bullet davranışı**nın yardımıyla ateş açma yeteneğini ekleyelim.\n\nSeçin, ardından **$(player)** üzerinde uzun basın ve **Davranışları Düzenle**'yi seçin.", + "ja": "私たちの $(player) に **Fire Bullet** 振る舞いの助けを借りて撃つ能力を追加しましょう。\n\n**$(player)** を選択し、長押しして、**動作を編集** を選択してください。", + "ko": "우리 $(player)에게 **Fire Bullet** 동작을 사용하여 발사할 수 있는 능력을 추가해 봅시다.\n\n**$(player)**를 선택한 후 길게 누르세요. 그리고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy zdolność strzelania dla naszego $(player) przy pomocy zachowania **Fire Bullet**.\n\nWybierz, następnie przytrzymaj **$(player)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar a capacidade para o nosso $(player) disparar com a ajuda do comportamento **Fire Bullet**.\n\nSelecione, em seguida, pressione e segure em **$(player)**, depois selecione **Editar comportamentos**.", + "th": "เพิ่มความสามารถให้กับ $(player) ของเราในการยิงด้วยความช่วยเหลือของพฤติกรรม **Fire Bullet**\n\nเลือก จากนั้นกดค้างที่ **$(player)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Добавим возможность для нашего $(player) стрелять с помощью поведения **Fire Bullet**.\n\nВыберите, затем удерживайте на **$(player)**, затем выберите **Изменить поведение**.", + "sl": "Dodajmo sposobnost za našega $(player) za streljanje s pomočjo vedenja **Fire Bullet**.\n\nIzberite, nato dolgo pritisnite na **$(player)**, nato izberite **Uredi vedenja**.", + "sq": "Të shtojmë aftësinë për $(player) tonë për të qëlluar me ndihmën e sjelljes **Fire Bullet**.\n\nZgjidhni, pastaj mbani shtypur gjatë në **$(player)**, pastaj zgjidhni **Redakto sjelljet**.", + "uk": "Додамо можливість для нашого $(player) стріляти за допомогою поведінки **Fire Bullet**.\n\nВиберіть, потім утримуйте на **$(player)**, потім виберіть **Редагувати поведінку**.", + "zh": "让我们使用 **Fire Bullet** 行为帮助我们的 $(player) 添加射击能力。\n\n选择,然后长按 **$(player)**,然后选择 **编辑行为**。" + } + }, + "behaviorDisplayNameByLocale": { + "en": "**Fire bullets**", + "fr": "**Tirer des balles**", + "ar": "**إطلاق الرصاص**", + "de": "**Feuerkugeln abfeuern**", + "es": "**Disparar balas**", + "fi": "**Ampua luoteja**", + "it": "**Spara proiettili**", + "tr": "**Ateş etmek**", + "ja": "**弾を発射する**", + "ko": "**총알 발사**", + "pl": "**Strzelanie pociskami**", + "pt": "**Disparar balas**", + "th": "**ยิงกระสุน**", + "ru": "**Выстрелить пулями**", + "sl": "**Streljanje krogel**", + "sq": "**Qëllimi i plumbave**", + "uk": "**Вистрілити кулями**", + "zh": "**发射子弹**" + }, + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it for now with the behavior!\n\nNow we'll add the action to open fire when it's triggered by the player.\n\nWe're not too far from a Star Wars show!", + "fr": "C'est tout pour le moment avec ce comportement !\n\nMaintenant, nous allons ajouter l'action pour ouvrir le feu lorsque le joueur le déclenche.\n\nNous ne sommes pas très loin d'un spectacle Star Wars !", + "ar": "هذا كل شيء للآن مع السلوك!\n\nالآن سنقوم بإضافة الإجراء لفتح النار عندما يتم تشغيله بواسطة اللاعب.\n\nلسنا بعيدين كثيرًا عن عرض حرب النجوم!", + "de": "Das war es vorerst mit dem Verhalten!\n\nJetzt werden wir die Aktion hinzufügen, um das Feuer zu eröffnen, wenn es vom Spieler ausgelöst wird.\n\nWir sind nicht weit von einer Star Wars Show entfernt!", + "es": "¡Eso es todo por ahora con el comportamiento!\n\nAhora añadiremos la acción para abrir fuego cuando lo active el jugador.\n\n¡No estamos muy lejos de un espectáculo de Star Wars!", + "fi": "Tämä oli nyt kaikki käyttäytymisestä!\n\nNyt lisäämme toiminnon, jotta tuli avautuu, kun se laukaistaan pelaajan toimesta.\n\nEmme ole kovin kaukana Star Wars -esityksestä!", + "it": "Per ora è tutto con il comportamento!\n\nOra aggiungeremo l'azione per aprire il fuoco quando viene attivato dal giocatore.\n\nNon siamo troppo lontani da uno spettacolo di Star Wars!", + "tr": "Şimdilik bu kadar davranışla ilgili!\n\nŞimdi, oyuncu tarafından tetiklendiğinde ateş açma eylemini ekleyeceğiz.\n\nStar Wars gösterisine çok uzak değiliz!", + "ja": "これで行動についてはこれで終わりです!\n\n次に、プレイヤーがトリガーしたときに火を開くアクションを追加します。\n\nスター・ウォーズのショーまであと少しです!", + "ko": "이제 행동으로는 여기까지입니다!\n\n이제 플레이어가 트리거할 때 발사를 시작하는 작업을 추가하겠습니다.\n\n스타 워즈 쇼에서 멀지 않습니다!", + "pl": "To na razie wszystko, jeśli chodzi o zachowanie!\n\nTeraz dodamy akcję otwierania ognia, gdy zostanie to uruchomione przez gracza.\n\nNie jesteśmy zbyt daleko od show Star Wars!", + "pt": "Por enquanto, é isso com o comportamento!\n\nAgora vamos adicionar a ação de abrir fogo quando for acionada pelo jogador.\n\nNão estamos muito longe de um show de Star Wars!", + "th": "นั่นคือทุกอย่างที่เกี่ยวกับพฤติกรรมตอนนี้!\n\nตอนนี้เราจะเพิ่มการกระทำในการเปิดไฟเมื่อมีการเรียกใช้โดยผู้เล่น\n\nเราไม่ไกลจากการแสดง Star Wars มากนัก!", + "ru": "На этом пока все с поведением!\n\nТеперь мы добавим действие для открытия огня, когда это сработает игрок.\n\nМы не так уж далеко от шоу Звездных войн!", + "sl": "To je za zdaj vse s vedenjem!\n\nZdaj bomo dodali dejanje za odprtje ognja, ko ga sproži igralec.\n\nNismo daleč od predstave Zvezdnih vojn!", + "sq": "Kjo është gjithçka për tani me sjelljen!\n\nTani do të shtojmë veprimin për të hapur zjarrin kur të aktivizohet nga lojtari.\n\nNuk jemi shumë larg nga një shfaqje e Star Wars!", + "uk": "На цьому поки все з поведінкою!\n\nТепер ми додамо дію для відкриття вогню, коли це викличе гравець.\n\nМи не так далеко від шоу Зоряних війн!", + "zh": "目前为止,这就是关于行为的全部内容!\n\n现在我们将添加一个动作,在玩家触发时开火。\n\n我们离星球大战秀不远了!" + } + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "editorTab:PlayScene:EventsSheet", + "nextStepTrigger": { + "presenceOfElement": "#events-editor[data-active]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's add the fire action to the $(player) object in the event sheet editor.", + "fr": "C'est tout pour le moment avec ce comportement !\n\nMaintenant, nous allons ajouter l'action pour ouvrir le feu lorsque le joueur le déclenche.\n\nNous ne sommes pas très loin d'un spectacle Star Wars !", + "ar": "هذا كل شيء للآن مع السلوك!\n\nالآن سنقوم بإضافة الإجراء لفتح النار عندما يتم تشغيله بواسطة اللاعب.\n\nلسنا بعيدين كثيرًا عن عرض حرب النجوم!", + "de": "Das war es vorerst mit dem Verhalten!\n\nJetzt werden wir die Aktion hinzufügen, um das Feuer zu eröffnen, wenn es vom Spieler ausgelöst wird.\n\nWir sind nicht weit von einer Star Wars Show entfernt!", + "es": "¡Eso es todo por ahora con el comportamiento!\n\nAhora añadiremos la acción para abrir fuego cuando lo active el jugador.\n\n¡No estamos muy lejos de un espectáculo de Star Wars!", + "fi": "Tämä oli nyt kaikki käyttäytymisestä!\n\nNyt lisäämme toiminnon, jotta tuli avautuu, kun se laukaistaan pelaajan toimesta.\n\nEmme ole kovin kaukana Star Wars -esityksestä!", + "it": "Per ora è tutto con il comportamento!\n\nOra aggiungeremo l'azione per aprire il fuoco quando viene attivato dal giocatore.\n\nNon siamo troppo lontani da uno spettacolo di Star Wars!", + "tr": "Şimdilik bu kadar davranışla ilgili!\n\nŞimdi, oyuncu tarafından tetiklendiğinde ateş açma eylemini ekleyeceğiz.\n\nStar Wars gösterisine çok uzak değiliz!", + "ja": "これで行動についてはこれで終わりです!\n\n次に、プレイヤーがトリガーしたときに火を開くアクションを追加します。\n\nスター・ウォーズのショーまであと少しです!", + "ko": "이제 행동으로는 여기까지입니다!\n\n이제 플레이어가 트리거할 때 발사를 시작하는 작업을 추가하겠습니다.\n\n스타 워즈 쇼에서 멀지 않습니다!", + "pl": "To na razie wszystko, jeśli chodzi o zachowanie!\n\nTeraz dodamy akcję otwierania ognia, gdy zostanie to uruchomione przez gracza.\n\nNie jesteśmy zbyt daleko od show Star Wars!", + "pt": "Por enquanto, é isso com o comportamento!\n\nAgora vamos adicionar a ação de abrir fogo quando for acionada pelo jogador.\n\nNão estamos muito longe de um show de Star Wars!", + "th": "นั่นคือทุกอย่างที่เกี่ยวกับพฤติกรรมตอนนี้!\n\nตอนนี้เราจะเพิ่มการกระทำในการเปิดไฟเมื่อมีการเรียกใช้โดยผู้เล่น\n\nเราไม่ไกลจากการแสดง Star Wars มากนัก!", + "ru": "На этом пока все с поведением!\n\nТеперь мы добавим действие для открытия огня, когда это сработает игрок.\n\nМы не так уж далеко от шоу Звездных войн!", + "sl": "To je za zdaj vse s vedenjem!\n\nZdaj bomo dodali dejanje za odprtje ognja, ko ga sproži igralec.\n\nNismo daleč od predstave Zvezdnih vojn!", + "sq": "Kjo është gjithçka për tani me sjelljen!\n\nTani do të shtojmë veprimin për të hapur zjarrin kur të aktivizohet nga lojtari.\n\nNuk jemi shumë larg nga një shfaqje e Star Wars!", + "uk": "На цьому поки все з поведінкою!\n\nТепер ми додамо дію для відкриття вогню, коли це викличе гравець.\n\nМи не так далеко від шоу Зоряних війн!", + "zh": "目前为止,这就是关于行为的全部内容!\n\n现在我们将添加一个动作,在玩家触发时开火。\n\n我们离星球大战秀不远了!" + } + } + } + }, + { + "elementToHighlightId": "#events-editor[data-active] #event-1-1-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Thanks to the previously added behavior on the $(player) object, new actions are available.\n\nLet's add the one to **fire bullets** from the $(player).", + "fr": "Grâce au comportement précédemment ajouté sur l'objet $(player), de nouvelles actions sont disponibles.\n\nAjoutons celle pour **tirer des balles** depuis $(player).", + "ar": "بفضل السلوك الذي تمت إضافته سابقًا على كائن $(player)، هناك أفعال جديدة متاحة.\n\nلنضيف واحدة لـ **إطلاق الرصاص** من $(player).", + "de": "Dank des zuvor hinzugefügten Verhaltens am $(player)-Objekt stehen neue Aktionen zur Verfügung.\n\nFügen wir eine hinzu, um **Kugeln abzufeuern** von $(player).", + "es": "Gracias al comportamiento añadido previamente en el objeto $(player), hay nuevas acciones disponibles.\n\nAñadamos la de **disparar balas** desde $(player).", + "fi": "Aiemmin lisätyn käyttäytymisen ansiosta $(player) -objektissa on nyt uusia toimintoja.\n\nLisätään sellainen, jolla **ammutaan luoteja** $(player) -objektista.", + "it": "Grazie al comportamento precedentemente aggiunto sull'oggetto $(player), sono disponibili nuove azioni.\n\nAggiungiamo quella per **sparare proiettili** da $(player).", + "tr": "Önce eklenen davranış sayesinde $(player) nesnesinde yeni eylemler mevcut.\n\n$(player) nesnesinden **mermi atma** eylemini ekleyelim.", + "ja": "$(player) オブジェクトに以前追加された振る舞いのおかげで、新しいアクションが利用可能になりました。\n\n$(player) から**弾丸を発射**するアクションを追加しましょう。", + "ko": "$(player) 객체에 이전에 추가된 동작 덕분에 새로운 동작이 가능해졌습니다.\n\n$(player)에서 **총알을 발사**하는 하나를 추가해 봅시다.", + "pl": "Dzięki wcześniej dodanemu zachowaniu na obiekcie $(player) dostępne są nowe działania.\n\nDodajmy to, aby **strzelać pociskami** z $(player).", + "pt": "Graças ao comportamento previamente adicionado no objeto $(player), novas ações estão disponíveis.\n\nVamos adicionar a de **disparar balas** a partir de $(player).", + "ru": "Благодаря ранее добавленному поведению на объекте $(player) стали доступны новые действия.\n\nДобавим возможность **стрелять пулями** от $(player).", + "sl": "Zahvaljujoč predhodno dodanemu vedenju na predmetu $(player) so na voljo nove akcije.\n\nDodajmo tisto za **streljanje krogel** iz $(player).", + "sq": "Falë sjelljes së shtuar më parë në objektin $(player), janë në dispozicion veprime të reja.\n\nTë shtojmë atë për **të qëlluar me gëzhojë** nga $(player).", + "th": "ด้วยพฤติกรรมที่เพิ่มไว้ก่อนหน้านี้บนวัตถุ $(player) ทำให้มีการกระทำใหม่ที่ใช้ได้\n\nเราจะเพิ่มอันหนึ่งในการ**ยิงกระสุน** จาก $(player)", + "uk": "Завдяки раніше доданому поведінці на об'єкті $(player) доступні нові дії.\n\nДодамо ту, що **стріляти кулями** з $(player).", + "zh": "多亏了之前添加到$(player)对象上的行为,现在有了新的动作可用。\n\n让我们添加一个**从$(player)发射子弹**的动作。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:player", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-FireBullet--FireBullet--Fire" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(player)**.", + "fr": "Sélectionnez **$(player)**.", + "ar": "حدد **$(player)**.", + "de": "Wählen Sie **$(player)** aus.", + "es": "Selecciona **$(player)**.", + "fi": "Valitse **$(player)**.", + "it": "Seleziona **$(player)**.", + "tr": "**$(player)**'ı seçin.", + "ja": "**$(player)** を選択してください。", + "ko": "**$(player)**를 선택하세요.", + "pl": "Wybierz **$(player)**.", + "pt": "Selecione **$(player)**.", + "ru": "Выберите **$(player)**.", + "sl": "Izberite **$(player)**.", + "sq": "Zgjidh **$(player)**.", + "th": "เลือก **$(player)**.", + "uk": "Виберіть **$(player)**.", + "zh": "选择 **$(player)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-FireBullet--FireBullet--Fire", + "nextStepTrigger": { + "presenceOfElement": "#parameter-2-expression-field" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select this action.", + "fr": "Sélectionnez cette action.", + "ar": "حدد هذا الإجراء.", + "de": "Wählen Sie diese Aktion aus.", + "es": "Seleccione esta acción.", + "fi": "Valitse tämä toiminto.", + "it": "Seleziona questa azione.", + "tr": "Bu eylemi seçin.", + "ja": "このアクションを選択してください。", + "ko": "이 작업을 선택하세요.", + "pl": "Wybierz tę akcję.", + "pt": "Selecione esta ação.", + "ru": "Выберите это действие.", + "sl": "Izberite to dejanje.", + "sq": "Zgjidh këtë veprim.", + "th": "เลือกการกระทำนี้", + "uk": "Виберіть цю дію.", + "zh": "选择此操作。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "Player.PointX(\"BulletSpawn\")" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's make the bullet fire from a specific point of the ship. The point **BulletSpawn** is already set on the $(player) object; let's use it.\n\n Type the formula: `Player.PointX(\"BulletSpawn\")`", + "fr": "Faisons tirer la balle d'un point spécifique du vaisseau. Le point **BulletSpawn** est déjà défini sur l'objet $(player); utilisons-le.\n\n Tapez la formule : `Player.PointX(\"BulletSpawn\")`", + "ar": "لنجعل الرصاص يطلق من نقطة محددة في السفينة. النقطة **BulletSpawn** معينة بالفعل على كائن $(player)؛ لنستخدمها.\n\n اكتب الصيغة: `Player.PointX(\"BulletSpawn\")`", + "de": "Lassen Sie die Kugel aus einem bestimmten Punkt des Schiffes feuern. Der Punkt **BulletSpawn** ist bereits auf dem $(player)-Objekt festgelegt; lassen Sie uns ihn verwenden.\n\n Geben Sie die Formel ein: `Player.PointX(\"BulletSpawn\")`", + "es": "Vamos a hacer que la bala se dispare desde un punto específico de la nave. El punto **BulletSpawn** ya está configurado en el objeto $(player); vamos a usarlo.\n\n Escribe la fórmula: `Player.PointX(\"BulletSpawn\")`", + "fi": "Asetetaan luoti ammuttavaksi aluksen tietystä kohdasta. Piste **BulletSpawn** on jo asetettu $(player) -objektiin; käytetään sitä.\n\n Kirjoita kaava: `Player.PointX(\"BulletSpawn\")`", + "it": "Facciamo sparare il proiettile da un punto specifico della nave. Il punto **BulletSpawn** è già impostato sull'oggetto $(player); usiamolo.\n\n Scrivi la formula: `Player.PointX(\"BulletSpawn\")`", + "tr": "Mermiyi geminin belirli bir noktasından ateşlemesini sağlayalım. **BulletSpawn** noktası zaten $(player) nesnesinde ayarlanmış; kullanalım.\n\n Formülü yazın: `Player.PointX(\"BulletSpawn\")`", + "ja": "弾丸を船の特定のポイントから発射しましょう。ポイント **BulletSpawn** はすでに$(player)オブジェクトに設定されています。使いましょう。\n\n 以下の式を入力してください:`Player.PointX(\"BulletSpawn\")`", + "ko": "총알을 선박의 특정 지점에서 발사하도록 만들어 봅시다. **BulletSpawn** 지점은 이미 $(player) 객체에 설정되어 있습니다. 이를 사용해 봅시다.\n\n 다음 공식을 입력하세요: `Player.PointX(\"BulletSpawn\")`", + "pl": "Pozwólmy, aby pocisk strzelał z określonego punktu statku. Punkt **BulletSpawn** jest już ustawiony na obiekcie $(player); użyjmy go.\n\n Wprowadź wzór: `Player.PointX(\"BulletSpawn\")`", + "pt": "Vamos fazer a bala disparar de um ponto específico da nave. O ponto **BulletSpawn** já está definido no objeto $(player); vamos usá-lo.\n\n Digite a fórmula: `Player.PointX(\"BulletSpawn\")`", + "ru": "Давайте сделаем так, чтобы пуля выстреливала из определенной точки корабля. Точка **BulletSpawn** уже установлена на объекте $(player); давайте использовать ее.\n\n Введите формулу: `Player.PointX(\"BulletSpawn\")`", + "sl": "Naj pustimo, da krogla izstreli iz določene točke ladje. Točka **BulletSpawn** je že nastavljena na $(player) objektu; uporabimo jo.\n\n Vpišite formulo: `Player.PointX(\"BulletSpawn\")`", + "sq": "Le të bëjmë që guri të qëllojë nga një pikë specifike e anijes. Pika **BulletSpawn** është tashmë vendosur në objektin $(player); le ta përdorim.\n\n Shtypni formulën: `Player.PointX(\"BulletSpawn\")`", + "th": "เรามาให้กระสุนถูกยิงจากจุดที่แน่นอนของเรือ จุด **BulletSpawn** ได้ถูกตั้งค่าไว้กับวัตถุ $(player) แล้ว เรามาใช้มันกัน\n\n พิมพ์สูตร: `Player.PointX(\"BulletSpawn\")`", + "uk": "Давайте зробимо кулю вистрілювати з конкретної точки корабля. Точка **BulletSpawn** вже встановлена на об'єкті $(player); давайте використовувати її.\n\n Введіть формулу: `Player.PointX(\"BulletSpawn\")`", + "zh": "让子弹从船的特定点发射。点 **BulletSpawn** 已经设置在 $(player) 对象上;让我们使用它。\n\n 输入公式:`Player.PointX(\"BulletSpawn\")`" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-3-expression-field", + "nextStepTrigger": { + "valueEquals": "Player.PointY(\"BulletSpawn\")" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Apply the second formula for the **Y** point: `Player.PointY(\"BulletSpawn\")`", + "fr": "Appliquez la deuxième formule pour le point **Y** : `Player.PointY(\"BulletSpawn\")`", + "ar": "قم بتطبيق الصيغة الثانية للنقطة **Y** : `Player.PointY(\"BulletSpawn\")`", + "de": "Wenden Sie die zweite Formel für den **Y**-Punkt an: `Player.PointY(\"BulletSpawn\")`", + "es": "Aplica la segunda fórmula para el punto **Y**: `Player.PointY(\"BulletSpawn\")`", + "fi": "Käytä toista kaavaa **Y**-pisteelle: `Player.PointY(\"BulletSpawn\")`", + "it": "Applica la seconda formula per il punto **Y**: `Player.PointY(\"BulletSpawn\")`", + "tr": "**Y** noktası için ikinci formülü uygulayın: `Player.PointY(\"BulletSpawn\")`", + "ja": "2番目の式を適用して **Y** 座標を求めます:`Player.PointY(\"BulletSpawn\")`", + "ko": "**Y** 좌표에 대한 두 번째 공식 적용: `Player.PointY(\"BulletSpawn\")`", + "pl": "Zastosuj drugą formułę dla punktu **Y**: `Player.PointY(\"BulletSpawn\")`", + "pt": "Aplique a segunda fórmula para o ponto **Y**: `Player.PointY(\"BulletSpawn\")`", + "ru": "Примените вторую формулу для **Y** координаты: `Player.PointY(\"BulletSpawn\")`", + "sl": "Uporabite drugo formulo za točko **Y**: `Player.PointY(\"BulletSpawn\")`", + "sq": "Zbatojeni formulën e dytë për pikën **Y**: `Player.PointY(\"BulletSpawn\")`", + "th": "ใช้สูตรที่สองสำหรับจุด **Y** : `Player.PointY(\"BulletSpawn\")`", + "uk": "Застосуйте другу формулу для **Y** точки: `Player.PointY(\"BulletSpawn\")`", + "zh": "应用第二个公式到 **Y** 点:`Player.PointY(\"BulletSpawn\")`" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-4-object-selector", + "nextStepTrigger": { + "valueEquals": "Bullet" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Here, enter the object that will be fired from the ship. For this, we'll use the **$(bullet)** object.", + "fr": "Ici, entrez l'objet qui sera tiré depuis le vaisseau. Pour cela, nous utiliserons l'objet **$(bullet)**.", + "ar": "هنا، أدخل الكائن الذي سيتم إطلاقه من السفينة. لهذا، سنستخدم كائن **$(bullet)**.", + "de": "Geben Sie hier das Objekt ein, das von dem Schiff abgefeuert wird. Dafür verwenden wir das **$(bullet)** Objekt.", + "es": "Aquí, ingresa el objeto que será disparado desde la nave. Para esto, usaremos el objeto **$(bullet)**.", + "fi": "Kirjoita tähän objekti, joka ammutaan alukselta. Käytämme tähän **$(bullet)** -objektia.", + "it": "Qui, inserisci l'oggetto che verrà sparato dalla nave. Per questo, useremo l'oggetto **$(bullet)**.", + "tr": "Burada, gemiden ateşlenecek nesneyi girin. Bunun için **$(bullet)** nesnesini kullanacağız.", + "ja": "ここに、船から発射されるオブジェクトを入力してください。このために、**$(bullet)** オブジェクトを使用します。", + "ko": "여기에 선박에서 발사될 객체를 입력하세요. 이를 위해 **$(bullet)** 객체를 사용할 것입니다.", + "pl": "Tutaj wprowadź obiekt, który zostanie wystrzelony z statku. W tym celu użyjemy obiektu **$(bullet)**.", + "pt": "Aqui, insira o objeto que será disparado pela nave. Para isso, vamos usar o objeto **$(bullet)**.", + "ru": "Здесь введите объект, который будет выпущен из корабля. Для этого мы будем использовать объект **$(bullet)**.", + "sl": "Tu vnesite objekt, ki bo izstreljen iz ladje. Za to bomo uporabili objekt **$(bullet)**.", + "sq": "Këtu, futni objektin që do të shtyhet nga anija. Për këtë, ne do të përdorim objektin **$(bullet)**.", + "th": "ที่นี่ใส่วัตถุที่จะถูกยิงจากเรือ สำหรับนี้เราจะใช้วัตถุ **$(bullet)**", + "uk": "Тут введіть об'єкт, який буде вистрілюватися з корабля. Для цього ми використовуватимемо об'єкт **$(bullet)**.", + "zh": "在这里,输入将从船上发射的对象。为此,我们将使用 **$(bullet)** 对象。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-5-expression-field", + "nextStepTrigger": { + "valueEquals": "Player.Angle()" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "The bullet have to be fired based on the same angle as the $(player). Enter the angle expression from the $(player) object, which is: `Player.Angle()`", + "fr": "La balle doit être tirée selon le même angle que $(player). Entrez l'expression d'angle de l'objet $(player), qui est : `Player.Angle()`", + "ar": "يجب أن يتم إطلاق الرصاص بناءً على نفس الزاوية التي $(player) يوجهها. أدخل تعبير الزاوية من كائن $(player)، وهو: `Player.Angle()`", + "de": "Die Kugel muss unter dem gleichen Winkel wie $(player) abgefeuert werden. Geben Sie den Winkelausdruck vom $(player) Objekt ein, der lautet: `Player.Angle()`", + "es": "La bala debe ser disparada con el mismo ángulo que $(player). Ingresa la expresión del ángulo desde el objeto $(player), que es: `Player.Angle()`", + "fi": "Luodin on ammuttava samasta kulmasta kuin $(player). Syötä kulmausilmaisu $(player) -objektista, joka on: `Player.Angle()`", + "it": "Il proiettile deve essere sparato con lo stesso angolo di $(player). Inserisci l'espressione dell'angolo dall'oggetto $(player), che è: `Player.Angle()`", + "tr": "Mermi, $(player) ile aynı açıya göre ateşlenmelidir. $(player) nesnesinden açı ifadesini girin, yani: `Player.Angle()`", + "ja": "弾丸は $(player) と同じ角度で発射される必要があります。$(player) オブジェクトからの角度式を入力してください。式は `Player.Angle()` です。", + "ko": "총알은 $(player)와 동일한 각도로 발사되어야 합니다. $(player) 객체에서 각도 표현식을 입력하세요. 표현식은 `Player.Angle()`입니다.", + "pl": "Pocisk musi być wystrzelony pod tym samym kątem co $(player). Wprowadź wyrażenie kąta z obiektu $(player), które wynosi: `Player.Angle()`", + "pt": "A bala deve ser disparada com o mesmo ângulo que $(player). Insira a expressão de ângulo do objeto $(player), que é: `Player.Angle()`", + "ru": "Пуля должна быть выпущена под тем же углом, что и $(player). Введите выражение угла из объекта $(player), которое: `Player.Angle()`", + "sl": "Krogla mora biti izstreljena pod enakim kotom kot $(player). Vnesite izraz kota iz objekta $(player), ki je: `Player.Angle()`", + "sq": "Plumba duhet të çahet në bazë të të njëjtës kënd si $(player). Fut shprehjen e këndit nga objekti $(player), që është: `Player.Angle()`", + "th": "กระสุนต้องถูกยิงตามมุมเดียวกับ $(player) กรุณาใส่สูตรมุมจาก $(player) ซึ่งคือ: `Player.Angle()`", + "uk": "Куля повинна бути випущена під тим самим кутом, що і $(player). Введіть вираз кута з об'єкта $(player), який: `Player.Angle()`", + "zh": "子弹必须按照 $(player) 的相同角度发射。请输入从 $(player) 对象获取的角度表达式,即 `Player.Angle()`" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-6-expression-field", + "nextStepTrigger": { + "valueEquals": "175" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Finally, to complete these parameters, fill in this field with a speed of `175`.", + "fr": "Enfin, pour compléter ces paramètres, remplissez ce champ avec une vitesse de `175`.", + "ar": "أخيرًا، لإكمال هذه الوسائط، قم بملء هذا الحقل بسرعة `175`.", + "de": "Abschließend, um diese Parameter zu vervollständigen, füllen Sie dieses Feld mit einer Geschwindigkeit von `175` aus.", + "es": "Finalmente, para completar estos parámetros, llene este campo con una velocidad de `175`.", + "fi": "Lopuksi, täytä nämä parametrit täyttämällä tämä kenttä nopeudella `175`.", + "it": "Infine, per completare questi parametri, compilare questo campo con una velocità di `175`.", + "tr": "Son olarak, bu parametreleri tamamlamak için bu alana `175` hızıyla doldurun.", + "ja": "最後に、これらのパラメータを完成させるために、このフィールドに速度 `175` を入力してください。", + "ko": "마지막으로, 이 매개변수를 완성하려면 이 필드를 속도 `175`으로 채우세요.", + "pl": "Na koniec, aby uzupełnić te parametry, wypełnij to pole prędkością `175`.", + "pt": "Finalmente, para completar esses parâmetros, preencha este campo com uma velocidade de `175`.", + "ru": "Наконец, чтобы завершить эти параметры, заполните это поле со скоростью `175`.", + "sl": "Na koncu, da dokončate te parametre, izpolnite to polje s hitrostjo `175`.", + "sq": "Përfundimisht, për të plotësuar këto parametra, mbushni këtë fushë me një shpejtësi prej `175`.", + "th": "สุดท้ายที่สุดเพื่อสมบูรณ์พารามิเตอร์เหล่านี้ กรุณากรอกช่องนี้ด้วยความเร็ว `175`", + "uk": "На завершення, щоб завершити ці параметри, заповніть це поле зі швидкістю `175`.", + "zh": "最后,为了完成这些参数,请在此字段中填写速度 `175`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's save this.", + "fr": "Enregistrons maintenant cela.", + "ar": "جميل! الآن هيّا نحفظ هذا.", + "de": "Lassen Sie uns das jetzt speichern.", + "es": "Ahora guardemos esto.", + "fi": "Nyt tallennetaan tämä.", + "it": "Ora salviamo questo.", + "tr": "Şimdi bunu kaydedelim.", + "ja": "これを保存しましょう。", + "ko": "이제 이것을 저장해 봅시다.", + "pl": "Teraz zapiszmy to.", + "pt": "Agora vamos salvar isso.", + "ru": "Теперь давайте сохраните это.", + "sl": "Sedaj shranimo to.", + "sq": "Tani le të ruajmë këtë.", + "th": "มาบันทึกสิ่งนี้", + "uk": "Тепер давайте збережемо це.", + "zh": "现在让我们保存这个。" + } + }, + "placement": "top" + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "description": { + "messageByLocale": { + "en": "We're done!\nLet's test our game to shoot the asteroids!\n\nClick on the **Preview** button.", + "fr": "C'est fini !\nTestons notre jeu pour tirer sur les astéroïdes !\n\nCliquez sur le bouton **Aperçu**.", + "ar": "لقد انتهينا!\nلنختبر لعبتنا لإطلاق النار على النيازك!\n\nانقر على زر **معاينة**.", + "de": "Wir sind fertig!\nTesten wir unser Spiel, um auf die Asteroiden zu schießen!\n\nKlicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado!\n¡Probemos nuestro juego para disparar a los asteroides!\n\nHaz clic en el botón **Vista previa**.", + "fi": "Olemme valmiita!\nTestataan peliämme ampuaksemme asteroidit!\n\nKlikkaa **Esikatselu**-painiketta.", + "it": "Abbiamo finito!\nProviamo il nostro gioco per sparare agli asteroidi!\n\nFai clic sul pulsante **Anteprima**.", + "tr": "Bitti!\nAsteroitleri vurmak için oyunumuzu test edelim!\n\n**Önizleme** düğmesine tıklayın.", + "ja": "完了しました!\n小惑星を撃つためにゲームをテストしましょう!\n\n**プレビュー** ボタンをクリックします。", + "ko": "완료되었습니다!\n우리 게임을 테스트하여 소행성을 격추해 봅시다!\n\n**미리보기** 버튼을 클릭하세요.", + "pl": "Skończone!\nPrzetestujmy naszą grę, aby strzelać do asteroid!\n\nKliknij przycisk **Podgląd**.", + "pt": "Terminamos!\nVamos testar nosso jogo para atirar nos asteroides!\n\nClique no botão **Visualizar**.", + "ru": "Мы закончили!\nДавайте протестируем нашу игру, чтобы стрелять по астероидам!\n\nНажмите кнопку **Просмотр**.", + "sl": "Končali smo!\nPreizkusimo našo igro za streljanje asteroidov!\n\nKliknite na gumb **Predogled**.", + "sq": "Jemi gati!\nLe të testojmë lojën tonë për të qëlluar asteroidët!\n\nKliko në butonin **Parashiko**.", + "th": "เราเสร็จสิ้นแล้ว!\nลองทดสอบเกมของเราเพื่อยิงดาวเคราะห์!\n\nคลิกที่ปุ่ม **ดูตัวอย่าง**", + "uk": "Ми закінчили!\nПеревіримо нашу гру, щоб вистріляти в астероїди!\n\nНатисніть кнопку **Попередній перегляд**.", + "zh": "我们完成了!\n让我们测试游戏以射击小行星!\n\n点击 **预览** 按钮。" + } + } + } + ], + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد انتهيت من هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai completato questa lezione!", + "tr": "# Bu dersi tamamladınız!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 마쳤습니다!", + "pl": "# Zakończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณได้เสร็จสิ้นบทเรียนนี้แล้ว!", + "ru": "# Вы завершили это урок!", + "sl": "# Dokončali ste ta pouk!", + "sq": "# Keni përfunduar këtë mësim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你已完成本课程!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, dans ce tutoriel vous avez appris comment :", + "ar": "أحسنت، في هذا الدرس التعليمي تعلمت كيفية :", + "de": "Gut gemacht, in diesem Tutorial haben Sie gelernt, wie Sie:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hienoa, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derste şunları öğrendiniz:", + "ja": "お疲れ様です、このチュートリアルでは以下の方法を学びました:", + "ko": "잘 했어요, 이 튜토리얼에서는 다음을 배웠습니다:", + "pl": "Dobrze wykonane, w tym samouczku nauczyłeś się, jak:", + "pt": "Bem feito, neste tutorial você aprendeu como:", + "th": "เก่งมาก เรียนรู้วิธีทำดังนี้ในบทแนะนำนี้", + "ru": "Отлично сработано, в этом учебнике вы узнали, как:", + "sl": "Dobro opravljeno, v tem vadnem programu ste se naučili, kako:", + "sq": "Mirë, në këtë udhëzues keni mësuar si të:", + "uk": "Добре зроблено, у цьому підручнику ви вивчили, як:", + "zh": "干得好,在这个教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- Add the Fire Bullet behavior\n\n- Use an action from the Fire Bullet behavior\n\n - Set up an action to fire from a specified X and Y point on a sprite", + "fr": "- Ajoutez le comportement Fire Bullet\n\n- Utilisez une action du comportement Fire Bullet\n\n - Configurez une action pour tirer depuis un point spécifié X et Y sur un sprite", + "ar": "- أضف سلوك Fire Bullet\n\n- استخدم إجراء من سلوك Fire Bullet\n\n - قم بإعداد إجراء لإطلاق النار من نقطة معينة X و Y على رسم متحرك", + "de": "- Fügen Sie das Fire Bullet-Verhalten hinzu\n\n- Verwenden Sie eine Aktion aus dem Fire Bullet-Verhalten\n\n - Richten Sie eine Aktion ein, um von einem bestimmten X- und Y-Punkt auf einem Sprite aus zu schießen", + "es": "- Agrega el comportamiento Fire Bullet\n\n- Usa una acción del comportamiento Fire Bullet\n\n - Configura una acción para disparar desde un punto específico X e Y en un sprite", + "fi": "- Lisää Fire Bullet -käyttäytyminen\n\n- Käytä toimintoa Fire Bullet -käyttäytymisestä\n\n - Aseta toiminto ampumaan määritellystä X- ja Y-pisteestä spriteen", + "it": "- Aggiungi il comportamento Fire Bullet\n\n- Usa un'azione dal comportamento Fire Bullet\n\n - Configura un'azione per sparare da un punto specifico X e Y su uno sprite", + "tr": "- Fire Bullet davranışını ekleyin\n\n- Fire Bullet davranışından bir eylem kullanın\n\n - Bir spritedeki belirtilen X ve Y noktasından ateş etmek için bir eylem kurun", + "ja": "- Fire Bullet の動作を追加する\n\n- Fire Bullet の動作からアクションを使用する\n\n - スプライトの指定された X と Y のポイントからの発射を設定する", + "ko": "- Fire Bullet 동작 추가\n\n- Fire Bullet 동작에서 작업 사용\n\n - 스프라이트의 지정된 X 및 Y 지점에서 발사하기 위한 작업 설정", + "pl": "- Dodaj zachowanie Fire Bullet\n\n- Użyj akcji z zachowania Fire Bullet\n\n - Skonfiguruj akcję strzelania z określonego punktu X i Y na sprite", + "pt": "- Adicione o comportamento Fire Bullet\n\n- Use uma ação do comportamento Fire Bullet\n\n - Configure uma ação para disparar de um ponto especificado X e Y em um sprite", + "th": "- เพิ่มพฤติกรรม Fire Bullet\n\n- ใช้การกระทำจากพฤติกรรม Fire Bullet\n\n - ตั้งค่าการกระทำให้ยิงจากจุด X และ Y ที่ระบุบนสไปรต์", + "ru": "- Добавьте поведение Fire Bullet\n\n- Используйте действие из поведения Fire Bullet\n\n - Настройте действие для стрельбы из указанной точки X и Y на спрайте", + "sl": "- Dodaj vedenje Fire Bullet\n\n- Uporabite ukrep iz vedenja Fire Bullet\n\n - Nastavite ukrep za streljanje iz določene točke X in Y na sliki", + "sq": "- Shtoni sjelljen Fire Bullet\n\n- Përdorni një veprim nga sjellja Fire Bullet\n\n - Vendos një veprim për të qëlluar nga një pikë të caktuar X dhe Y në një sprit", + "uk": "- Додайте поведінку Fire Bullet\n\n- Використовуйте дію з поведінки Fire Bullet\n\n - Налаштуйте дію для стрільби з вказаної точки X та Y на спрайті", + "zh": "- 添加 Fire Bullet 行为\n\n- 使用 Fire Bullet 行为中的动作\n\n - 设置从精灵上指定的 X 和 Y 点射击的动作" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des éléments à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir añadiendo cosas a este juego o publicarlo!", + "fi": "Voit jatkaa asioiden lisäämistä tähän peliin tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye devam edebilir veya yayınlayabilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、それを公開することができます!", + "ko": "이 게임에 계속해서 새로운 요소를 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "th": "คุณสามารถเพิ่มสิ่งต่างๆในเกมนี้ต่อได้หรือตีพิมพ์!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni atë!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续添加内容到这个游戏中或发布它!" + } + } + ] + } +} \ No newline at end of file diff --git a/tutorials/in-app/flingGame.json b/tutorials/in-app/flingGame.json index f025e94..eb97e19 100644 --- a/tutorials/in-app/flingGame.json +++ b/tutorials/in-app/flingGame.json @@ -1,5 +1,62 @@ { "id": "flingGame", + "isMiniTutorial": false, + "titleByLocale": { + "en": "Let's make a Fling Game", + "fr": "Faisons un jeu de lancer", + "ar": "لنصنع لعبة رمي", + "de": "Lass uns ein Schleuder-Spiel machen", + "es": "Hagamos un juego de lanzamiento", + "it": "Facciamo un gioco di lancio", + "ja": "フリングゲームを作ろう", + "ko": "플링 게임을 만들어 보자", + "pl": "Zróbmy grę w rzucanie", + "pt": "Vamos fazer um jogo de arremesso", + "th": "มาทำเกมขว้างกันเถอะ", + "ru": "Давайте сделаем игру бросков", + "sl": "Naredimo igro metanja", + "sq": "Le të bëjmë një lojë hedhjeje", + "uk": "Зробимо гру кидання", + "zh": "让我们制作一个弹射游戏" + }, + "bulletPointsByLocale": [ + { + "en": "Learn to create a game from zero.", + "fr": "Apprenez à créer un jeu à partir de zéro.", + "ar": "تعلم إنشاء لعبة من الصفر.", + "de": "Lerne, ein Spiel von Grund auf zu erstellen.", + "es": "Aprende a crear un juego desde cero.", + "it": "Impara a creare un gioco da zero.", + "ja": "ゼロからゲームを作る方法を学びます。", + "ko": "게임을 처음부터 만드는 방법을 배우세요.", + "pl": "Naucz się tworzyć grę od podstaw.", + "pt": "Aprenda a criar um jogo do zero.", + "th": "เรียนรู้วิธีสร้างเกมตั้งแต่เริ่มต้น", + "ru": "Научитесь создавать игру с нуля.", + "sl": "Naučite se ustvariti igro iz nič.", + "sq": "Mësoni të krijoni një lojë nga zeroja.", + "uk": "Навчіться створювати гру з нуля.", + "zh": "学习从零开始创建游戏。" + }, + { + "en": "Add a leaderboard to your game.", + "fr": "Ajoutez un classement à votre jeu.", + "ar": "أضف لوحة المتصدرين إلى لعبتك.", + "de": "Füge deinem Spiel eine Rangliste hinzu.", + "es": "Agrega una tabla de clasificación a tu juego.", + "it": "Aggiungi una classifica al tuo gioco.", + "ja": "ゲームにリーダーボードを追加します。", + "ko": "게임에 리더보드를 추가하세요.", + "pl": "Dodaj tabelę wyników do swojej gry.", + "pt": "Adicione uma tabela de classificação ao seu jogo.", + "th": "เพิ่มกระดานผู้นำในเกมของคุณ", + "ru": "Добавьте таблицу лидеров в вашу игру.", + "sl": "Dodajte lestvico najboljših svoji igri.", + "sq": "Shto një tabelë të drejtuesve në lojën tuaj.", + "uk": "Додайте таблицю лідерів до вашої гри.", + "zh": "为您的游戏添加排行榜。" + } + ], "editorSwitches": { "GoToBuildSection": { "editor": "Home" @@ -28,10 +85,6 @@ "editor": "EventsSheet", "scene": "startScene" }, - "SwitchToEvents6": { - "editor": "EventsSheet", - "scene": "leaderboardScene" - }, "SwitchToEvents7": { "editor": "EventsSheet", "scene": "playScene" @@ -48,25 +101,59 @@ "editor": "Scene", "scene": "playScene" }, - "openLeaderboardScene": { - "editor": "Scene", - "scene": "leaderboardScene" - }, "ClickOnNewObjectButtonForScore": { "editor": "Scene", "scene": "playScene" + }, + "SwitchToStartScene": { + "editor": "Scene", + "scene": "startScene" } }, + "availableLocales": [ + "en", + "fr", + "es", + "pt", + "th", + "ar" + ], "endDialog": { "content": [ { "messageByLocale": { - "en": "## Congratulations!" + "en": "# You've finished your Fling Game!", + "fr": "# Votre jeu est terminé !", + "es": "# ¡Has terminado tu juego Fling!", + "pt": "# Você terminou seu jogo Fling!", + "th": "เกม Fling ของคุณเสร็จแล้ว", + "ar": "# لقد أنهيت لعبة القذف الخاصة بك!" + } + }, + { + "messageByLocale": { + "en": "Share it with your friends and see who gets the highest score!", + "fr": "Partagez le avec vos amis pour voir qui obtiendra le meilleur score !", + "es": "¡Compártelo con tus amigos y ve quién obtiene la puntuación más alta!", + "pt": "Compartilhe com seus amigos e veja quem consegue a maior pontuação!", + "th": "แชร์กับเพื่อนของคุณ และมาลองดูกันว่าใครจะทำคะแนนได้สูงที่สุด!", + "ar": "يمكنك مشاركتها مع الأصدقاء ورؤية من سيحصل على أعلى نتيجة!" } }, { "messageByLocale": { - "en": "You just finished the first part of the fling game tutorial." + "en": "Ready to make a new game? Click to discover what GDevelop can do!", + "fr": "Prêt à créer un nouveau jeu ? Cliquez sur l'image pour découvrir de quoi GDevelop est capable !", + "es": "¿Listo para crear un nuevo juego? ¡Haz clic para descubrir lo que puede hacer GDevelop!", + "pt": "Pronto para criar um novo jogo? Clique para descobrir o que o GDevelop pode fazer!", + "th": "พร้อมสร้างเกมใหม่แล้ว? คลิกเพื่อสำรวจดูว่า GDevelop สามารถทำอะไรได้บ้าง", + "ar": "هل لديك الاستعداد لصنع لعبة جديدة؟ النقر لإكتشاف ماذا يمكن لـ GDevelop أن يفعل!" + } + }, + { + "image": { + "imageSource": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzkiIGhlaWdodD0iMTM2IiB2aWV3Qm94PSIwIDAgNzkgMTM2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMjI4Xzc2OCkiPgo8cGF0aCBkPSJNMzkuODE2MiA4OC43MDM0TDcyLjEyNTQgMTA3LjQzMkwzNS4zNzUyIDEyOC42MTlMMy4wNjU5OSAxMDkuODkxTDM5LjgxNjIgODguNzAzNFoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yMjhfNzY4KSIvPgo8bWFzayBpZD0ibWFzazBfMjI4Xzc2OCIgc3R5bGU9Im1hc2stdHlwZTphbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMTgiIHk9IjY3IiB3aWR0aD0iNDgiIGhlaWdodD0iNjIiPgo8cGF0aCBkPSJNMzYuNDc1IDEyNy44NzFMNjEuNDI4MyAxMTMuNTg4TDY1LjgxODggODIuNzcxOEw0OS45MzcxIDY3LjIxNDRMMTguMjgyIDc2LjcyMTdMMjAuNDk3NSAxMTkuOTExTDI2LjA2ODkgMTIzLjExTDM1LjI1ODYgMTI4LjQzTDM2LjQ3NSAxMjcuODcxWiIgZmlsbD0iI0M0QzRDNCIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfMjI4Xzc2OCkiPgo8cmVjdCB3aWR0aD0iNy4wMTA4NiIgaGVpZ2h0PSI1Ni44Nzk3IiByeD0iMC41IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSA1MC42MzkgNzQuMzUxOCkiIGZpbGw9IiM1NjM4MzkiLz4KPGNpcmNsZSByPSIyLjg4NTAyIiB0cmFuc2Zvcm09Im1hdHJpeCgtMC44NjYwNDQgMC40OTk5NjcgMC44NjYwNDQgMC40OTk5NjcgNDcuMTU1MyA3NC43MzYxKSIgZmlsbD0iI0M0ODI3MCIvPgo8cGF0aCBkPSJNNDMuNTY2NyA4NS4xNTI2QzQ0LjM3MTUgODQuNjg3OCA0NS42NDYzIDg0LjYzNjEgNDYuNTU1NiA4NS4wMzE1QzQ3LjY2NCA4NS41MTM0IDQ3Ljc3NzggODYuNDQ5OSA0Ni43OTY5IDg3LjAxNjRMMzEuMDM4NCA5Ni4xMTgxQzMwLjE3NTIgOTYuNjE2NyAyOC44MDc3IDk2LjY3MjEgMjcuODMyMyA5Ni4yNDhMMjYuOTc0NiA5NS44NzUxQzI2LjM4MDEgOTUuNjE2NyAyNi4zMTkgOTUuMTE0NCAyNi44NDUyIDk0LjgxMDVMNDMuNTY2NyA4NS4xNTI2WiIgZmlsbD0iI0M0ODI3MCIvPgo8cGF0aCBkPSJNNDYuMDQgODYuMzkzNUM0Ni44MTEyIDg1Ljk0NzIgNDguMTMyMSA4Ni4yNjI1IDQ4LjEzMTkgODYuODkyOUw0OC4xMzA5IDkwLjcyNUM0OC4xMzA5IDkwLjkxMjIgNDguMDAyMyA5MS4wOTE3IDQ3Ljc3MzMgOTEuMjI0M0wyNS4wNTUgMTA0LjM3MkMyNC42Njk0IDEwNC41OTYgMjQuMDA4OSAxMDQuNDM4IDI0LjAwOSAxMDQuMTIzTDI0LjAxMDMgOTkuMjg5M0MyNC4wMTAzIDk5LjE5NTcgMjQuMDc0NiA5OS4xMDU5IDI0LjE4OTEgOTkuMDM5Nkw0Ni4wNCA4Ni4zOTM1WiIgZmlsbD0iIzcxNEY0RiIvPgo8cGF0aCBkPSJNNDMuNTY3MyAxMDIuMDQzQzQ0LjM3MiAxMDEuNTc5IDQ1LjY0NjggMTAxLjUyNyA0Ni41NTYxIDEwMS45MjJDNDcuNjY0NSAxMDIuNDA0IDQ3Ljc3ODQgMTAzLjM0MSA0Ni43OTc0IDEwMy45MDdMMzEuMDM4OSAxMTMuMDA5QzMwLjE3NTcgMTEzLjUwOCAyOC44MDgyIDExMy41NjMgMjcuODMyOCAxMTMuMTM5TDI2Ljk3NTEgMTEyLjc2NkMyNi4zODA2IDExMi41MDcgMjYuMzE5NiAxMTIuMDA1IDI2Ljg0NTcgMTExLjcwMUw0My41NjczIDEwMi4wNDNaIiBmaWxsPSIjQzQ4MjcwIi8+CjxwYXRoIGQ9Ik00Ni4wNDA1IDEwMy40MTdDNDYuODExNyAxMDIuOTcxIDQ4LjEzMjUgMTAzLjI4NiA0OC4xMzI0IDEwMy45MTZMNDguMTMxNCAxMDcuNzQ5QzQ4LjEzMTQgMTA3LjkzNiA0OC4wMDI3IDEwOC4xMTUgNDcuNzczOCAxMDguMjQ4TDI1LjA1NTQgMTIxLjM5NkMyNC42Njk4IDEyMS42MTkgMjQuMDA5NCAxMjEuNDYxIDI0LjAwOTUgMTIxLjE0NkwyNC4wMTA3IDExNi4zMTNDMjQuMDEwOCAxMTYuMjE5IDI0LjA3NTEgMTE2LjEyOSAyNC4xODk2IDExNi4wNjNMNDYuMDQwNSAxMDMuNDE3WiIgZmlsbD0iIzcxNEY0RiIvPgo8cGF0aCBkPSJNNDMuNTY3OSAxMTguODkyQzQ0LjM3MjYgMTE4LjQyNyA0NS42NDc0IDExOC4zNzUgNDYuNTU2NyAxMTguNzcxQzQ3LjY2NTEgMTE5LjI1MyA0Ny43NzkgMTIwLjE4OSA0Ni43OTggMTIwLjc1NkwzMS4wMzk1IDEyOS44NTdDMzAuMTc2MyAxMzAuMzU2IDI4LjgwODggMTMwLjQxMSAyNy44MzM0IDEyOS45ODdMMjYuOTc1NyAxMjkuNjE0QzI2LjM4MTIgMTI5LjM1NiAyNi4zMjAyIDEyOC44NTQgMjYuODQ2MyAxMjguNTVMNDMuNTY3OSAxMTguODkyWiIgZmlsbD0iI0M0ODI3MCIvPgo8cGF0aCBkPSJNNDYuMDA2OCAxMjAuMjk4QzQ2Ljc3OCAxMTkuODUyIDQ4LjA5ODkgMTIwLjE2NyA0OC4wOTg3IDEyMC43OThMNDguMDk3NyAxMjQuNjNDNDguMDk3NyAxMjQuODE3IDQ3Ljk2OTEgMTI0Ljk5NiA0Ny43NDAxIDEyNS4xMjlMMjUuMDIxOCAxMzguMjc3QzI0LjYzNjIgMTM4LjUgMjMuOTc1NyAxMzguMzQzIDIzLjk3NTggMTM4LjAyN0wyMy45NzcxIDEzMy4xOTRDMjMuOTc3MSAxMzMuMSAyNC4wNDE0IDEzMy4wMTEgMjQuMTU1OSAxMzIuOTQ0TDQ2LjAwNjggMTIwLjI5OFoiIGZpbGw9IiM3MTRGNEYiLz4KPHJlY3Qgd2lkdGg9IjcuMDEwODYiIGhlaWdodD0iNTYuODc5NyIgcng9IjAuNSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjkuODUxNiA4Ni4zODA5KSIgZmlsbD0iIzU2MzgzOSIvPgo8Y2lyY2xlIHI9IjIuODg1MDIiIHRyYW5zZm9ybT0ibWF0cml4KC0wLjg2NjA0NCAwLjQ5OTk2NyAwLjg2NjA0NCAwLjQ5OTk2NyAyNi4zNjc1IDg2Ljc2NDkpIiBmaWxsPSIjQzQ4MjcwIi8+CjwvZz4KPGcgb3BhY2l0eT0iMC42NSI+CjxwYXRoIGQ9Ik0xNS44NTQ5IDYzLjY4MTVDMTYuMDM3MSA2My42ODE1IDE2LjE4NDcgNjMuNDU5NSAxNi4xODQ3IDYzLjE4NTZDMTYuMTg0NyA2Mi45MTE3IDE2LjAzNzEgNjIuNjg5NyAxNS44NTQ5IDYyLjY4OTdDMTUuNjcyOCA2Mi42ODk3IDE1LjUyNTEgNjIuOTExNyAxNS41MjUxIDYzLjE4NTZDMTUuNTI1MSA2My40NTk1IDE1LjY3MjggNjMuNjgxNSAxNS44NTQ5IDYzLjY4MTVaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0xNS41NjUzIDUzLjE5MTJDMTUuOTA3MyA1My4xOTEyIDE2LjE4NDcgNTIuNzc0MyAxNi4xODQ3IDUyLjI1OTlDMTYuMTg0NyA1MS43NDU2IDE1LjkwNzMgNTEuMzI4NiAxNS41NjUzIDUxLjMyODZDMTUuMjIzMiA1MS4zMjg2IDE0Ljk0NTkgNTEuNzQ1NiAxNC45NDU5IDUyLjI1OTlDMTQuOTQ1OSA1Mi43NzQzIDE1LjIyMzIgNTMuMTkxMiAxNS41NjUzIDUzLjE5MTJaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0xNi44NzY0IDU3LjAwNzVDMTcuMTI5NiA1Ny4wMDc1IDE3LjMzNDkgNTYuNjk4OCAxNy4zMzQ5IDU2LjMxODFDMTcuMzM0OSA1NS45MzczIDE3LjEyOTYgNTUuNjI4NyAxNi44NzY0IDU1LjYyODdDMTYuNjIzMiA1NS42Mjg3IDE2LjQxNzkgNTUuOTM3MyAxNi40MTc5IDU2LjMxODFDMTYuNDE3OSA1Ni42OTg4IDE2LjYyMzIgNTcuMDA3NSAxNi44NzY0IDU3LjAwNzVaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0xMi4wMTUxIDUxLjU4NDdDMTIuMTQ2MSA1MS41ODQ3IDEyLjI1MjQgNTEuNDI0OSAxMi4yNTI0IDUxLjIyNzlDMTIuMjUyNCA1MS4wMzA4IDEyLjE0NjEgNTAuODcxMSAxMi4wMTUxIDUwLjg3MTFDMTEuODg0IDUwLjg3MTEgMTEuNzc3OCA1MS4wMzA4IDExLjc3NzggNTEuMjI3OUMxMS43Nzc4IDUxLjQyNDkgMTEuODg0IDUxLjU4NDcgMTIuMDE1MSA1MS41ODQ3WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMTIuODA4OCA0NC4zODc4QzEyLjkxNzYgNDQuMzg3OCAxMy4wMDU5IDQ0LjI1NTIgMTMuMDA1OSA0NC4wOTE1QzEzLjAwNTkgNDMuOTI3OCAxMi45MTc2IDQzLjc5NTIgMTIuODA4OCA0My43OTUyQzEyLjcgNDMuNzk1MiAxMi42MTE3IDQzLjkyNzggMTIuNjExNyA0NC4wOTE1QzEyLjYxMTcgNDQuMjU1MiAxMi43IDQ0LjM4NzggMTIuODA4OCA0NC4zODc4WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMjQuMzYxMyA0Ny4zNzhDMjQuNzM1MiA0Ny4zNzggMjUuMDM4NCA0Ni45MjIyIDI1LjAzODQgNDYuMzZDMjUuMDM4NCA0NS43OTc4IDI0LjczNTIgNDUuMzQyIDI0LjM2MTMgNDUuMzQyQzIzLjk4NzQgNDUuMzQyIDIzLjY4NDMgNDUuNzk3OCAyMy42ODQzIDQ2LjM2QzIzLjY4NDMgNDYuOTIyMiAyMy45ODc0IDQ3LjM3OCAyNC4zNjEzIDQ3LjM3OFoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTIyLjkwMzggNTAuNTczMUMyMy4wODQ1IDUwLjU3MzEgMjMuMjMxIDUwLjM1MjkgMjMuMjMxIDUwLjA4MTJDMjMuMjMxIDQ5LjgwOTYgMjMuMDg0NSA0OS41ODk0IDIyLjkwMzggNDkuNTg5NEMyMi43MjMxIDQ5LjU4OTQgMjIuNTc2NyA0OS44MDk2IDIyLjU3NjcgNTAuMDgxMkMyMi41NzY3IDUwLjM1MjkgMjIuNzIzMSA1MC41NzMxIDIyLjkwMzggNTAuNTczMVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTI1LjI2MzggNDQuNDcwOEMyNS4zODgyIDQ0LjQ3MDggMjUuNDg5MSA0NC4zMTkyIDI1LjQ4OTEgNDQuMTMyMUMyNS40ODkxIDQzLjk0NTEgMjUuMzg4MiA0My43OTM1IDI1LjI2MzggNDMuNzkzNUMyNS4xMzk0IDQzLjc5MzUgMjUuMDM4NiA0My45NDUxIDI1LjAzODYgNDQuMTMyMUMyNS4wMzg2IDQ0LjMxOTIgMjUuMTM5NCA0NC40NzA4IDI1LjI2MzggNDQuNDcwOFoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTIyLjk2MzIgNjMuMDFDMjMuNDYwNyA2My4wMSAyMy44NjQxIDYyLjQwMzYgMjMuODY0MSA2MS42NTU0QzIzLjg2NDEgNjAuOTA3MyAyMy40NjA3IDYwLjMwMDggMjIuOTYzMiA2MC4zMDA4QzIyLjQ2NTYgNjAuMzAwOCAyMi4wNjIyIDYwLjkwNzMgMjIuMDYyMiA2MS42NTU0QzIyLjA2MjIgNjIuNDAzNiAyMi40NjU2IDYzLjAxIDIyLjk2MzIgNjMuMDFaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00Ni40NDI2IDk3LjQxMDJDNDYuNjQ0NyA5Ny40MTAyIDQ2LjgwODYgOTcuMTYzOCA0Ni44MDg2IDk2Ljg1OTlDNDYuODA4NiA5Ni41NTU5IDQ2LjY0NDcgOTYuMzA5NiA0Ni40NDI2IDk2LjMwOTZDNDYuMjQwNCA5Ni4zMDk2IDQ2LjA3NjYgOTYuNTU1OSA0Ni4wNzY2IDk2Ljg1OTlDNDYuMDc2NiA5Ny4xNjM4IDQ2LjI0MDQgOTcuNDEwMiA0Ni40NDI2IDk3LjQxMDJaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01MC40OTk2IDgxLjExNDZDNTAuNzIxIDgxLjExNDYgNTAuOTAwNSA4MC44NDQ4IDUwLjkwMDUgODAuNTExOUM1MC45MDA1IDgwLjE3OSA1MC43MjEgNzkuOTA5MiA1MC40OTk2IDc5LjkwOTJDNTAuMjc4MiA3OS45MDkyIDUwLjA5ODggODAuMTc5IDUwLjA5ODggODAuNTExOUM1MC4wOTg4IDgwLjg0NDggNTAuMjc4MiA4MS4xMTQ2IDUwLjQ5OTYgODEuMTE0NloiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTQ5LjM2MDQgNzcuMzI1MkM0OS42NTg4IDc3LjMyNTIgNDkuOTAwNyA3Ni45NjE1IDQ5LjkwMDcgNzYuNTEyOEM0OS45MDA3IDc2LjA2NDEgNDkuNjU4OCA3NS43MDA0IDQ5LjM2MDQgNzUuNzAwNEM0OS4wNjIgNzUuNzAwNCA0OC44MjAxIDc2LjA2NDEgNDguODIwMSA3Ni41MTI4QzQ4LjgyMDEgNzYuOTYxNSA0OS4wNjIgNzcuMzI1MiA0OS4zNjA0IDc3LjMyNTJaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01Mi4xODA5IDY4LjYwMjRDNTIuMzE1NyA2OC42MDI0IDUyLjQyNDkgNjguNDM4MSA1Mi40MjQ5IDY4LjIzNTVDNTIuNDI0OSA2OC4wMzI5IDUyLjMxNTcgNjcuODY4NyA1Mi4xODA5IDY3Ljg2ODdDNTIuMDQ2MSA2Ny44Njg3IDUxLjkzNjkgNjguMDMyOSA1MS45MzY5IDY4LjIzNTVDNTEuOTM2OSA2OC40MzgxIDUyLjA0NjEgNjguNjAyNCA1Mi4xODA5IDY4LjYwMjRaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01Ni41ODI3IDYwLjA0MzJDNTcuMDEzNiA2MC4wNDMyIDU3LjM2MjkgNTkuNTE3OSA1Ny4zNjI5IDU4Ljg3QzU3LjM2MjkgNTguMjIyIDU3LjAxMzYgNTcuNjk2OCA1Ni41ODI3IDU3LjY5NjhDNTYuMTUxNyA1Ny42OTY4IDU1LjgwMjMgNTguMjIyIDU1LjgwMjMgNTguODdDNTUuODAyMyA1OS41MTc5IDU2LjE1MTcgNjAuMDQzMiA1Ni41ODI3IDYwLjA0MzJaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01NS41MTIzIDU2LjQ2OTNDNTUuNjU2NyA1Ni40NjkzIDU1Ljc3MzcgNTYuMjkzMyA1NS43NzM3IDU2LjA3NjJDNTUuNzczNyA1NS44NTkxIDU1LjY1NjcgNTUuNjgzMSA1NS41MTIzIDU1LjY4MzFDNTUuMzY3OSA1NS42ODMxIDU1LjI1MDkgNTUuODU5MSA1NS4yNTA5IDU2LjA3NjJDNTUuMjUwOSA1Ni4yOTMzIDU1LjM2NzkgNTYuNDY5MyA1NS41MTIzIDU2LjQ2OTNaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00Ni40ODU1IDY5LjAyOTdDNDYuNzExMyA2OS4wMjk3IDQ2Ljg5NDQgNjguNzU0NCA0Ni44OTQ0IDY4LjQxNDlDNDYuODk0NCA2OC4wNzUzIDQ2LjcxMTMgNjcuOCA0Ni40ODU1IDY3LjhDNDYuMjU5NiA2Ny44IDQ2LjA3NjYgNjguMDc1MyA0Ni4wNzY2IDY4LjQxNDlDNDYuMDc2NiA2OC43NTQ0IDQ2LjI1OTYgNjkuMDI5NyA0Ni40ODU1IDY5LjAyOTdaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00NC40NTA4IDkwLjA0MDFDNDQuNTEwMyA5MC4wNDAxIDQ0LjU1ODUgODkuOTY3NSA0NC41NTg1IDg5Ljg3ODFDNDQuNTU4NSA4OS43ODg2IDQ0LjUxMDMgODkuNzE2MSA0NC40NTA4IDg5LjcxNjFDNDQuMzkxMyA4OS43MTYxIDQ0LjM0MzEgODkuNzg4NiA0NC4zNDMxIDg5Ljg3ODFDNDQuMzQzMSA4OS45Njc1IDQ0LjM5MTMgOTAuMDQwMSA0NC40NTA4IDkwLjA0MDFaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00NC4wMTM0IDk4LjE3NDJDNDQuMjU0OCA5OC4xNzQyIDQ0LjQ1MDUgOTcuODggNDQuNDUwNSA5Ny41MTdDNDQuNDUwNSA5Ny4xNTQxIDQ0LjI1NDggOTYuODU5OSA0NC4wMTM0IDk2Ljg1OTlDNDMuNzcyMSA5Ni44NTk5IDQzLjU3NjQgOTcuMTU0MSA0My41NzY0IDk3LjUxN0M0My41NzY0IDk3Ljg4IDQzLjc3MjEgOTguMTc0MiA0NC4wMTM0IDk4LjE3NDJaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00Ny40MTQ4IDg5LjcxODNDNDcuNzQ5NSA4OS43MTgzIDQ4LjAyMDggODkuMzEwNCA0OC4wMjA4IDg4LjgwNzFDNDguMDIwOCA4OC4zMDM5IDQ3Ljc0OTUgODcuODk2IDQ3LjQxNDggODcuODk2QzQ3LjA4MDEgODcuODk2IDQ2LjgwODggODguMzAzOSA0Ni44MDg4IDg4LjgwNzFDNDYuODA4OCA4OS4zMTA0IDQ3LjA4MDEgODkuNzE4MyA0Ny40MTQ4IDg5LjcxODNaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00Ni42MjY3IDgzLjM2MDFDNDYuNzI3NCA4My4zNjAxIDQ2LjgwOSA4My4yMzczIDQ2LjgwOSA4My4wODU5QzQ2LjgwOSA4Mi45MzQ1IDQ2LjcyNzQgODIuODExOCA0Ni42MjY3IDgyLjgxMThDNDYuNTI2IDgyLjgxMTggNDYuNDQ0NCA4Mi45MzQ1IDQ2LjQ0NDQgODMuMDg1OUM0Ni40NDQ0IDgzLjIzNzMgNDYuNTI2IDgzLjM2MDEgNDYuNjI2NyA4My4zNjAxWiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMjUuNDM1NCA5MS4zOTczQzI1Ljc0NDIgOTEuMzk3MyAyNS45OTQ1IDkxLjAyMDkgMjUuOTk0NSA5MC41NTY3QzI1Ljk5NDUgOTAuMDkyNCAyNS43NDQyIDg5LjcxNjEgMjUuNDM1NCA4OS43MTYxQzI1LjEyNjcgODkuNzE2MSAyNC44NzY0IDkwLjA5MjQgMjQuODc2NCA5MC41NTY3QzI0Ljg3NjQgOTEuMDIwOSAyNS4xMjY3IDkxLjM5NzMgMjUuNDM1NCA5MS4zOTczWiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMjcuMzA1OCA4My44MjU5QzI3LjQ0MTMgODMuODI1OSAyNy41NTExIDgzLjY2MDggMjcuNTUxMSA4My40NTdDMjcuNTUxMSA4My4yNTMzIDI3LjQ0MTMgODMuMDg4MSAyNy4zMDU4IDgzLjA4ODFDMjcuMTcwMyA4My4wODgxIDI3LjA2MDQgODMuMjUzMyAyNy4wNjA0IDgzLjQ1N0MyNy4wNjA0IDgzLjY2MDggMjcuMTcwMyA4My44MjU5IDI3LjMwNTggODMuODI1OVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTE5LjQ1NyA4Mi45ODkyQzE5LjgwMTMgODIuOTg5MiAyMC4wODA0IDgyLjU2OTYgMjAuMDgwNCA4Mi4wNTE5QzIwLjA4MDQgODEuNTM0MiAxOS44MDEzIDgxLjExNDUgMTkuNDU3IDgxLjExNDVDMTkuMTEyNyA4MS4xMTQ1IDE4LjgzMzYgODEuNTM0MiAxOC44MzM2IDgyLjA1MTlDMTguODMzNiA4Mi41Njk2IDE5LjExMjcgODIuOTg5MiAxOS40NTcgODIuOTg5MloiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTIzLjE2OTUgOTcuOTYyNEMyMy41NTMgOTcuOTYyNCAyMy44NjQgOTcuNDk0OSAyMy44NjQgOTYuOTE4MkMyMy44NjQgOTYuMzQxNSAyMy41NTMgOTUuODc0IDIzLjE2OTUgOTUuODc0QzIyLjc4NTkgOTUuODc0IDIyLjQ3NSA5Ni4zNDE1IDIyLjQ3NSA5Ni45MTgyQzIyLjQ3NSA5Ny40OTQ5IDIyLjc4NTkgOTcuOTYyNCAyMy4xNjk1IDk3Ljk2MjRaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0xNy44OTY3IDc5LjQxMzNDMTguMDMzNyA3OS40MTMzIDE4LjE0NDcgNzkuMjQ2NCAxOC4xNDQ3IDc5LjA0MDRDMTguMTQ0NyA3OC44MzQ1IDE4LjAzMzcgNzguNjY3NSAxNy44OTY3IDc4LjY2NzVDMTcuNzU5NyA3OC42Njc1IDE3LjY0ODcgNzguODM0NSAxNy42NDg3IDc5LjA0MDRDMTcuNjQ4NyA3OS4yNDY0IDE3Ljc1OTcgNzkuNDEzMyAxNy44OTY3IDc5LjQxMzNaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01Ny44MTA4IDgzLjk0NjZDNTguMTU4OCA4My45NDY2IDU4LjQ0MDkgODMuNTIyNCA1OC40NDA5IDgyLjk5OTJDNTguNDQwOSA4Mi40NzU5IDU4LjE1ODggODIuMDUxOCA1Ny44MTA4IDgyLjA1MThDNTcuNDYyNyA4Mi4wNTE4IDU3LjE4MDYgODIuNDc1OSA1Ny4xODA2IDgyLjk5OTJDNTcuMTgwNiA4My41MjI0IDU3LjQ2MjcgODMuOTQ2NiA1Ny44MTA4IDgzLjk0NjZaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00My41NzU0IDExLjI5NDhDNDQuMDY2MyAxMS4yOTQ4IDQ0LjQ2NDMgMTAuNjk2NCA0NC40NjQzIDkuOTU4MzFDNDQuNDY0MyA5LjIyMDE5IDQ0LjA2NjMgOC42MjE4MyA0My41NzU0IDguNjIxODNDNDMuMDg0NSA4LjYyMTgzIDQyLjY4NjUgOS4yMjAxOSA0Mi42ODY1IDkuOTU4MzFDNDIuNjg2NSAxMC42OTY0IDQzLjA4NDUgMTEuMjk0OCA0My41NzU0IDExLjI5NDhaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik01Ny41MTU1IDcyLjcyNjZDNTcuNjc4NCA3Mi43MjY2IDU3LjgxMDQgNzIuNTI4IDU3LjgxMDQgNzIuMjgzMUM1Ny44MTA0IDcyLjAzODIgNTcuNjc4NCA3MS44Mzk2IDU3LjUxNTUgNzEuODM5NkM1Ny4zNTI2IDcxLjgzOTYgNTcuMjIwNiA3Mi4wMzgyIDU3LjIyMDYgNzIuMjgzMUM1Ny4yMjA2IDcyLjUyOCA1Ny4zNTI2IDcyLjcyNjYgNTcuNTE1NSA3Mi43MjY2WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNNTYuNDM5MiA4NC43ODExQzU2LjU5MjUgODQuNzgxMSA1Ni43MTY4IDg0LjU5NDMgNTYuNzE2OCA4NC4zNjM4QzU2LjcxNjggODQuMTMzNCA1Ni41OTI1IDgzLjk0NjUgNTYuNDM5MiA4My45NDY1QzU2LjI4NiA4My45NDY1IDU2LjE2MTcgODQuMTMzNCA1Ni4xNjE3IDg0LjM2MzhDNTYuMTYxNyA4NC41OTQzIDU2LjI4NiA4NC43ODExIDU2LjQzOTIgODQuNzgxMVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTU2LjE3MjUgNzYuNDU4N0M1Ni4zMTkxIDc2LjQ1ODcgNTYuNDM3OSA3Ni4yOCA1Ni40Mzc5IDc2LjA1OTVDNTYuNDM3OSA3NS44MzkxIDU2LjMxOTEgNzUuNjYwNCA1Ni4xNzI1IDc1LjY2MDRDNTYuMDI1OSA3NS42NjA0IDU1LjkwNyA3NS44MzkxIDU1LjkwNyA3Ni4wNTk1QzU1LjkwNyA3Ni4yOCA1Ni4wMjU5IDc2LjQ1ODcgNTYuMTcyNSA3Ni40NTg3WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNNTQuMTE2IDkwLjAzODlDNTQuMzQyNSA5MC4wMzg5IDU0LjUyNjIgODkuNzYyNyA1NC41MjYyIDg5LjQyMkM1NC41MjYyIDg5LjA4MTMgNTQuMzQyNSA4OC44MDUyIDU0LjExNiA4OC44MDUyQzUzLjg4OTQgODguODA1MiA1My43MDU3IDg5LjA4MTMgNTMuNzA1NyA4OS40MjJDNTMuNzA1NyA4OS43NjI3IDUzLjg4OTQgOTAuMDM4OSA1NC4xMTYgOTAuMDM4OVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTU2LjY4MDQgMzUuODU3N0M1Ni45NTczIDM1Ljg1NzcgNTcuMTgxOCAzNS41MjAxIDU3LjE4MTggMzUuMTAzOEM1Ny4xODE4IDM0LjY4NzQgNTYuOTU3MyAzNC4zNDk5IDU2LjY4MDQgMzQuMzQ5OUM1Ni40MDM1IDM0LjM0OTkgNTYuMTc5IDM0LjY4NzQgNTYuMTc5IDM1LjEwMzhDNTYuMTc5IDM1LjUyMDEgNTYuNDAzNSAzNS44NTc3IDU2LjY4MDQgMzUuODU3N1oiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTU2LjQyMDUgMjguNjAwMUM1Ni41NjM0IDI4LjYwMDEgNTYuNjc5MiAyOC40MjU5IDU2LjY3OTIgMjguMjExMUM1Ni42NzkyIDI3Ljk5NjIgNTYuNTYzNCAyNy44MjIgNTYuNDIwNSAyNy44MjJDNTYuMjc3NiAyNy44MjIgNTYuMTYxNyAyNy45OTYyIDU2LjE2MTcgMjguMjExMUM1Ni4xNjE3IDI4LjQyNTkgNTYuMjc3NiAyOC42MDAxIDU2LjQyMDUgMjguNjAwMVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTUyLjcyNzkgMjAuNDgyN0M1Mi44OTUzIDIwLjQ4MjcgNTMuMDMwOSAyMC4yNzg3IDUzLjAzMDkgMjAuMDI3MUM1My4wMzA5IDE5Ljc3NTUgNTIuODk1MyAxOS41NzE1IDUyLjcyNzkgMTkuNTcxNUM1Mi41NjA2IDE5LjU3MTUgNTIuNDI0OSAxOS43NzU1IDUyLjQyNDkgMjAuMDI3MUM1Mi40MjQ5IDIwLjI3ODcgNTIuNTYwNiAyMC40ODI3IDUyLjcyNzkgMjAuNDgyN1oiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTUyLjc4MjkgMzIuNTE1M0M1Mi45ODE0IDMyLjUxNTMgNTMuMTQyMiAzMi4yNzM0IDUzLjE0MjIgMzEuOTc1MUM1My4xNDIyIDMxLjY3NjcgNTIuOTgxNCAzMS40MzQ4IDUyLjc4MjkgMzEuNDM0OEM1Mi41ODQ1IDMxLjQzNDggNTIuNDIzNyAzMS42NzY3IDUyLjQyMzcgMzEuOTc1MUM1Mi40MjM3IDMyLjI3MzQgNTIuNTg0NSAzMi41MTUzIDUyLjc4MjkgMzIuNTE1M1oiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTUxLjIzNDIgNDIuMzQwNUM1MS40MTg1IDQyLjM0MDUgNTEuNTY4IDQyLjExNTggNTEuNTY4IDQxLjgzODZDNTEuNTY4IDQxLjU2MTQgNTEuNDE4NSA0MS4zMzY3IDUxLjIzNDIgNDEuMzM2N0M1MS4wNDk4IDQxLjMzNjcgNTAuOTAwNCA0MS41NjE0IDUwLjkwMDQgNDEuODM4NkM1MC45MDA0IDQyLjExNTggNTEuMDQ5OCA0Mi4zNDA1IDUxLjIzNDIgNDIuMzQwNVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTIxLjg3MzQgMTcuMjM3MkMyMS45Nzc4IDE3LjIzNzIgMjIuMDYyNCAxNy4xMDk5IDIyLjA2MjQgMTYuOTUyOUMyMi4wNjI0IDE2Ljc5NiAyMS45Nzc4IDE2LjY2ODcgMjEuODczNCAxNi42Njg3QzIxLjc2OSAxNi42Njg3IDIxLjY4NDMgMTYuNzk2IDIxLjY4NDMgMTYuOTUyOUMyMS42ODQzIDE3LjEwOTkgMjEuNzY5IDE3LjIzNzIgMjEuODczNCAxNy4yMzcyWiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMjQuMDUwNiAzMC4yNDU1QzI0LjM1MjcgMzAuMjQ1NSAyNC41OTc2IDI5Ljg3NzMgMjQuNTk3NiAyOS40MjNDMjQuNTk3NiAyOC45Njg4IDI0LjM1MjcgMjguNjAwNiAyNC4wNTA2IDI4LjYwMDZDMjMuNzQ4NSAyOC42MDA2IDIzLjUwMzUgMjguOTY4OCAyMy41MDM1IDI5LjQyM0MyMy41MDM1IDI5Ljg3NzMgMjMuNzQ4NSAzMC4yNDU1IDI0LjA1MDYgMzAuMjQ1NVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTIwLjQ2NTMgMzUuODU3N0MyMC43NDIyIDM1Ljg1NzcgMjAuOTY2NyAzNS41MjAxIDIwLjk2NjcgMzUuMTAzOEMyMC45NjY3IDM0LjY4NzQgMjAuNzQyMiAzNC4zNDk5IDIwLjQ2NTMgMzQuMzQ5OUMyMC4xODg0IDM0LjM0OTkgMTkuOTYzOSAzNC42ODc0IDE5Ljk2MzkgMzUuMTAzOEMxOS45NjM5IDM1LjUyMDEgMjAuMTg4NCAzNS44NTc3IDIwLjQ2NTMgMzUuODU3N1oiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTE4Ljc2MTUgMzAuNjA1NkMxOC44Njg4IDMwLjYwNTYgMTguOTU1OSAzMC40NzQ3IDE4Ljk1NTkgMzAuMzEzM0MxOC45NTU5IDMwLjE1MTkgMTguODY4OCAzMC4wMjEgMTguNzYxNSAzMC4wMjFDMTguNjU0MSAzMC4wMjEgMTguNTY3MSAzMC4xNTE5IDE4LjU2NzEgMzAuMzEzM0MxOC41NjcxIDMwLjQ3NDcgMTguNjU0MSAzMC42MDU2IDE4Ljc2MTUgMzAuNjA1NloiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTE0LjYyMjggMzMuNjkyNkMxNC44MzkgMzMuNjkyNiAxNS4wMTQzIDMzLjQyOTEgMTUuMDE0MyAzMy4xMDRDMTUuMDE0MyAzMi43Nzg5IDE0LjgzOSAzMi41MTU0IDE0LjYyMjggMzIuNTE1NEMxNC40MDY2IDMyLjUxNTQgMTQuMjMxMyAzMi43Nzg5IDE0LjIzMTMgMzMuMTA0QzE0LjIzMTMgMzMuNDI5MSAxNC40MDY2IDMzLjY5MjYgMTQuNjIyOCAzMy42OTI2WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMTcuNTk5MSA0Mi4xMzY5QzE3Ljk5ODIgNDIuMTM2OSAxOC4zMjE3IDQxLjY1MDUgMTguMzIxNyA0MS4wNTA0QzE4LjMyMTcgNDAuNDUwMyAxNy45OTgyIDM5Ljk2MzkgMTcuNTk5MSAzOS45NjM5QzE3LjIgMzkuOTYzOSAxNi44NzY1IDQwLjQ1MDMgMTYuODc2NSA0MS4wNTA0QzE2Ljg3NjUgNDEuNjUwNSAxNy4yIDQyLjEzNjkgMTcuNTk5MSA0Mi4xMzY5WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNNDEuMjQyIDE2LjI1M0M0MS40MjcxIDE2LjI1MyA0MS41NzcyIDE2LjAyNzQgNDEuNTc3MiAxNS43NDkxQzQxLjU3NzIgMTUuNDcwNyA0MS40MjcxIDE1LjI0NTEgNDEuMjQyIDE1LjI0NTFDNDEuMDU2OSAxNS4yNDUxIDQwLjkwNjggMTUuNDcwNyA0MC45MDY4IDE1Ljc0OTFDNDAuOTA2OCAxNi4wMjc0IDQxLjA1NjkgMTYuMjUzIDQxLjI0MiAxNi4yNTNaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0yNy43OTM3IDkuNDQ0NTlDMjguMDk2NiA5LjQ0NDU5IDI4LjM0MjEgOS4wNzU0NyAyOC4zNDIxIDguNjIwMTJDMjguMzQyMSA4LjE2NDc4IDI4LjA5NjYgNy43OTU2NSAyNy43OTM3IDcuNzk1NjVDMjcuNDkwOSA3Ljc5NTY1IDI3LjI0NTQgOC4xNjQ3OCAyNy4yNDU0IDguNjIwMTJDMjcuMjQ1NCA5LjA3NTQ3IDI3LjQ5MDkgOS40NDQ1OSAyNy43OTM3IDkuNDQ0NTlaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00My4xNjg4IDMuMjIxNTFDNDMuMzkzMiAzLjIyMTUxIDQzLjU3NTEgMi45NDgwNSA0My41NzUxIDIuNjEwNzJDNDMuNTc1MSAyLjI3MzM4IDQzLjM5MzIgMS45OTk5MiA0My4xNjg4IDEuOTk5OTJDNDIuOTQ0NSAxLjk5OTkyIDQyLjc2MjYgMi4yNzMzOCA0Mi43NjI2IDIuNjEwNzJDNDIuNzYyNiAyLjk0ODA1IDQyLjk0NDUgMy4yMjE1MSA0My4xNjg4IDMuMjIxNTFaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik0zNC40MzQgMTkuMzAxNUMzNC44MTMyIDE5LjMwMTUgMzUuMTIwNSAxOC44Mzk0IDM1LjEyMDUgMTguMjY5NEMzNS4xMjA1IDE3LjY5OTQgMzQuODEzMiAxNy4yMzczIDM0LjQzNCAxNy4yMzczQzM0LjA1NDkgMTcuMjM3MyAzMy43NDc2IDE3LjY5OTQgMzMuNzQ3NiAxOC4yNjk0QzMzLjc0NzYgMTguODM5NCAzNC4wNTQ5IDE5LjMwMTUgMzQuNDM0IDE5LjMwMTVaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00MC42NDA2IDMzLjY5MjFDNDAuOTU2MSAzMy42OTIxIDQxLjIxMTggMzMuMzA3NiA0MS4yMTE4IDMyLjgzMzNDNDEuMjExOCAzMi4zNTkxIDQwLjk1NjEgMzEuOTc0NiA0MC42NDA2IDMxLjk3NDZDNDAuMzI1MiAzMS45NzQ2IDQwLjA2OTUgMzIuMzU5MSA0MC4wNjk1IDMyLjgzMzNDNDAuMDY5NSAzMy4zMDc2IDQwLjMyNTIgMzMuNjkyMSA0MC42NDA2IDMzLjY5MjFaIiBmaWxsPSIjRDFGRUY5Ii8+CjxwYXRoIGQ9Ik00My43ODQzIDM0Ljk3ODhDNDMuODk5OCAzNC45Nzg4IDQzLjk5MzQgMzQuODM4IDQzLjk5MzQgMzQuNjY0M0M0My45OTM0IDM0LjQ5MDYgNDMuODk5OCAzNC4zNDk5IDQzLjc4NDMgMzQuMzQ5OUM0My42Njg4IDM0LjM0OTkgNDMuNTc1MSAzNC40OTA2IDQzLjU3NTEgMzQuNjY0M0M0My41NzUxIDM0LjgzOCA0My42Njg4IDM0Ljk3ODggNDMuNzg0MyAzNC45Nzg4WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMzEuNzIzNiAzNC42NjRDMzEuOTAyIDM0LjY2NCAzMi4wNDY3IDM0LjQ0NjUgMzIuMDQ2NyAzNC4xNzgyQzMyLjA0NjcgMzMuOTA5OSAzMS45MDIgMzMuNjkyNCAzMS43MjM2IDMzLjY5MjRDMzEuNTQ1MSAzMy42OTI0IDMxLjQwMDQgMzMuOTA5OSAzMS40MDA0IDM0LjE3ODJDMzEuNDAwNCAzNC40NDY1IDMxLjU0NTEgMzQuNjY0IDMxLjcyMzYgMzQuNjY0WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNMzAuMzc3MSAyNy43MDk1QzMwLjU3NzcgMjcuNzA5NSAzMC43NDA0IDI3LjQ2NDkgMzAuNzQwNCAyNy4xNjMyQzMwLjc0MDQgMjYuODYxNSAzMC41Nzc3IDI2LjYxNjkgMzAuMzc3MSAyNi42MTY5QzMwLjE3NjQgMjYuNjE2OSAzMC4wMTM3IDI2Ljg2MTUgMzAuMDEzNyAyNy4xNjMyQzMwLjAxMzcgMjcuNDY0OSAzMC4xNzY0IDI3LjcwOTUgMzAuMzc3MSAyNy43MDk1WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNNDEuODIwMiAyMC4wMjdDNDEuOTUzNSAyMC4wMjcgNDIuMDYxNiAxOS44NjQ1IDQyLjA2MTYgMTkuNjY0MUM0Mi4wNjE2IDE5LjQ2MzcgNDEuOTUzNSAxOS4zMDEzIDQxLjgyMDIgMTkuMzAxM0M0MS42ODcgMTkuMzAxMyA0MS41Nzg5IDE5LjQ2MzcgNDEuNTc4OSAxOS42NjQxQzQxLjU3ODkgMTkuODY0NSA0MS42ODcgMjAuMDI3IDQxLjgyMDIgMjAuMDI3WiIgZmlsbD0iI0QxRkVGOSIvPgo8cGF0aCBkPSJNNDAuMDEyOSAxMy4zNDI2QzQwLjE3NTEgMTMuMzQyNiA0MC4zMDY2IDEzLjE0NSA0MC4zMDY2IDEyLjkwMTJDNDAuMzA2NiAxMi42NTc0IDQwLjE3NTEgMTIuNDU5NyA0MC4wMTI5IDEyLjQ1OTdDMzkuODUwOCAxMi40NTk3IDM5LjcxOTQgMTIuNjU3NCAzOS43MTk0IDEyLjkwMTJDMzkuNzE5NCAxMy4xNDUgMzkuODUwOCAxMy4zNDI2IDQwLjAxMjkgMTMuMzQyNloiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTkuNDU1NTUgNTkuNDYyN0M5LjYwMTQxIDU5LjQ2MjcgOS43MTk2NiA1OS4yODQ5IDkuNzE5NjYgNTkuMDY1NkM5LjcxOTY2IDU4Ljg0NjMgOS42MDE0MSA1OC42Njg1IDkuNDU1NTUgNTguNjY4NUM5LjMwOTY5IDU4LjY2ODUgOS4xOTE0MyA1OC44NDYzIDkuMTkxNDMgNTkuMDY1NkM5LjE5MTQzIDU5LjI4NDkgOS4zMDk2OSA1OS40NjI3IDkuNDU1NTUgNTkuNDYyN1oiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTI3Ljg2NjEgMTcuNTIzOUMyOC4wOTk0IDE3LjUyMzkgMjguMjg4NCAxNy4yMzk2IDI4LjI4ODQgMTYuODg4OUMyOC4yODg0IDE2LjUzODIgMjguMDk5NCAxNi4yNTM5IDI3Ljg2NjEgMTYuMjUzOUMyNy42MzI5IDE2LjI1MzkgMjcuNDQzOCAxNi41MzgyIDI3LjQ0MzggMTYuODg4OUMyNy40NDM4IDE3LjIzOTYgMjcuNjMyOSAxNy41MjM5IDI3Ljg2NjEgMTcuNTIzOVoiIGZpbGw9IiNEMUZFRjkiLz4KPHBhdGggZD0iTTExLjEwNiA2MS4yMDFDMTEuNDI1MSA2MS4yMDEgMTEuNjgzOCA2MC44MTIgMTEuNjgzOCA2MC4zMzIyQzExLjY4MzggNTkuODUyNCAxMS40MjUxIDU5LjQ2MzQgMTEuMTA2IDU5LjQ2MzRDMTAuNzg2OCA1OS40NjM0IDEwLjUyODEgNTkuODUyNCAxMC41MjgxIDYwLjMzMjJDMTAuNTI4MSA2MC44MTIgMTAuNzg2OCA2MS4yMDEgMTEuMTA2IDYxLjIwMVoiIGZpbGw9IiNEMUZFRjkiLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjIiIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfMjI4Xzc2OCkiPgo8cGF0aCBkPSJNMzIuMzYzIDcxLjQ2M0wyNy4yMjU0IDY3LjY0MTRDMjUuMTk2MSA2Ni4xMzE5IDI0LjAwMDEgNjMuNzUxNyAyNC4wMDAxIDYxLjIyMjVMMjQgNDguMjA0MUMyNCA0NS43MjkgMjUuMTQ1NyA0My4zOTMyIDI3LjEwMyA0MS44NzhMMzIuNDc5NCAzNy43MTYxQzM1LjMxNzQgMzUuNTE5MiAzOS4yNzExIDM1LjQ4MTEgNDIuMTUwOSAzNy42MjNMNDcuMjA4OSA0MS4zODUxQzQ5LjIzODQgNDIuODk0NiA1MC40MzQ1IDQ1LjI3NDkgNTAuNDM0NSA0Ny44MDQyVjYwLjg2NjlDNTAuNDM0NSA2My4zMTY4IDQ5LjMxMiA2NS42MzE2IDQ3LjM4ODMgNjcuMTQ4Nkw0Mi4wOTE1IDcxLjMyNThDMzkuMjUyMyA3My41NjQ4IDM1LjI2NDIgNzMuNjIxIDMyLjM2MyA3MS40NjNaIiBmaWxsPSIjNUNGOUJFIi8+CjwvZz4KPHBhdGggZD0iTTM3LjIyNDYgNDAuMzkzN0w0Ny45NzE1IDU0LjE2MTdMMzcuMjI0NiA2MC41NTU0VjQwLjM5MzdaIiBmaWxsPSIjQjVGRkUzIi8+CjxwYXRoIGQ9Ik0zNy4yMjQ2IDY4Ljc4MTZMMjYuNDc3NyA1NC4xNjE4TDM3LjIyNDYgNjAuNTU1OEwzNy4yMjQ2IDY4Ljc4MTZaIiBmaWxsPSIjMUFEMjhEIi8+CjxwYXRoIGQ9Ik0zNy4yMjQ0IDQwLjM5NVY2MC41NTY0TDI2LjQ3NzUgNTQuMTYyN0wzNy4yMjQ0IDQwLjM5NVoiIGZpbGw9IiM1Q0Y5QkUiLz4KPHBhdGggZD0iTTM3LjIyNDQgNjguNzgwOEwzNy4yMjQ0IDYwLjU1NTJMNDcuOTcxMiA1NC4xNjEyTDM3LjIyNDQgNjguNzgwOFoiIGZpbGw9IiM1Q0Y5QkUiLz4KPHBhdGggZD0iTTIwLjcxMzkgMTE1LjA2NEMyMC41MzEgMTE3LjI1OSAxOC40NjM5IDEyMS41OTUgMTEuNjU4NyAxMjEuMzc1QzEyLjI5OSAxMTguOTk3IDE1LjAwNjQgMTE0LjQwNSAyMC43MTM5IDExNS4wNjRaIiBmaWxsPSIjMDA5RTYyIi8+CjxwYXRoIGQ9Ik0zLjA0ODI2IDExNy4wNTlDNC43NTUxOSAxMTYuNTk5IDguNTkxMTggMTE2Ljk3OSAxMC4yNzk3IDEyMi4xNzVDOC4zMTAwNyAxMjIuMzQgNC4xMDYzIDEyMS41NDcgMy4wNDgyNiAxMTcuMDU5WiIgZmlsbD0iIzAwOUU2MiIvPgo8cGF0aCBkPSJNNjUuMDExNyAxMDkuMjYyQzY1LjUzNTkgMTExLjM5OCA2Ny43MDczIDExNS40MDMgNzIuMTk4OSAxMTQuMzQyQzcxLjMzNjYgMTEyLjA4NCA2OC42OTIgMTA3LjkwNiA2NS4wMTE3IDEwOS4yNjJaIiBmaWxsPSIjMDA5RTYyIi8+CjxwYXRoIGQ9Ik03Ny4xNDIxIDEwOS4wMzFDNzUuOTIxIDEwOC43OSA3My40MzU5IDEwOS42MzkgNzMuMjY0IDExNC45NThDNzQuNjA1OCAxMTQuODc1IDc3LjI2MDEgMTEzLjU3NCA3Ny4xNDIxIDEwOS4wMzFaIiBmaWxsPSIjMDA5RTYyIi8+CjxwYXRoIGQ9Ik01Ny44NTQ5IDExNC4wMzdDNTcuNjYyOSAxMTUuMzIgNTguMjYxOSAxMTguMDg3IDYyLjE5NDcgMTE4Ljg4MkM2Mi4xNDkyIDExNy40MzEgNjEuMjE3NiAxMTQuNDMxIDU3Ljg1NDkgMTE0LjAzN1oiIGZpbGw9IiMwMDlFNjIiLz4KPHBhdGggZD0iTTUzLjcxNDggMTI4LjgyQzUzLjgxOTcgMTMwLjExNSA1My4wMzQxIDEzMi44MzcgNDkuMDUyNyAxMzMuMzY1QzQ5LjE5NjQgMTMxLjkxOSA1MC4zMjk5IDEyOC45ODYgNTMuNzE0OCAxMjguODJaIiBmaWxsPSIjMDA5RTYyIi8+CjxwYXRoIGQ9Ik00NC4yMDcgMTMyLjcwMUM0NC42MjU2IDEzMy40NjMgNDYuMDY3MyAxMzQuNjk0IDQ4LjQ4NTcgMTMzLjUyMkM0Ny44NzI4IDEzMi43NjcgNDYuMTU5MSAxMzEuNTQ2IDQ0LjIwNyAxMzIuNzAxWiIgZmlsbD0iIzAwOUU2MiIvPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2ZfMjI4Xzc2OCIgeD0iOC4wMDAwMiIgeT0iMjAuMDQyMSIgd2lkdGg9IjU4LjQzNDUiIGhlaWdodD0iNjkuMDAyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8yMjhfNzY4Ii8+CjwvZmlsdGVyPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjI4Xzc2OCIgeDE9IjM3Ljc2IiB5MT0iMTQxLjU3MyIgeDI9IjYuOTM1NDYiIHkyPSIxMDYuNTA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiM2NDRBQ0YiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjQ0QUNGIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjhfNzY4Ij4KPHJlY3Qgd2lkdGg9Ijc5IiBoZWlnaHQ9IjEzNiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K", + "linkHref": "https://www.youtube.com/@GDevelopApp/shorts" } } ] @@ -74,14 +161,19 @@ "flow": [ { "id": "GoToBuildSection", - "elementToHighlightId": "#home-build-tab", + "elementToHighlightId": "#home-build-tab, #home-create-tab", "nextStepTrigger": { "presenceOfElement": "#home-create-project-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Head over to the **Build section**" + "en": "Head over to the **Create section**.", + "fr": "Commençons par aller dans l'onglet **Créer**.", + "es": "Vamos a la sección **Crear**.", + "pt": "Vamos para a seção **Criar**.", + "th": "ไปยัง **Build section**", + "ar": "التوجه إلى القسم **بناء**." } }, "placement": "right" @@ -90,16 +182,41 @@ { "elementToHighlightId": "#home-create-project-button", "nextStepTrigger": { - "presenceOfElement": "#create-project-button" + "presenceOfElement": "#empty-project-tile, #create-project-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Let's create a new **project** for this tutorial!" + "en": "Let's create a new **project** for this tutorial!", + "fr": "Créons un nouveau **projet** pour ce tutoriel.", + "es": "¡Vamos a crear un nuevo **proyecto** para este tutorial!", + "pt": "Vamos criar um novo **projeto** para este tutorial!", + "th": "มาสร้าง **โปรเจกต์** ใหม่ สำหรับบทเรียนนี้กันเถอะ!", + "ar": "هيّا نقوم بإنشاء **مشروع** جديد لهذا البرنامج التعليمي!" } } } }, + { + "elementToHighlightId": "#empty-project-tile", + "nextStepTrigger": { + "presenceOfElement": "#create-project-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's create an **empty project**.", + "fr": "Créons un **projet vide**.", + "es": "¡Creemos un **proyecto vacío**!", + "pt": "Vamos criar um **projeto vazio**.", + "th": "มาสร้าง **โปรเจกต์เปล่า**", + "ar": "لنقم بإنشاء **مشروع فارغ**." + } + } + }, + "isOnClosableDialog": true, + "skippable": true + }, { "elementToHighlightId": "#create-project-button", "nextStepTrigger": { @@ -108,7 +225,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's go!" + "en": "Let's go!", + "fr": "C'est parti !", + "es": "¡Vamos!", + "pt": "Vamos!", + "th": "ไปกันเลย!", + "ar": "لنبدأ!" } } }, @@ -121,30 +243,41 @@ "id": "OpenPropertiesManager", "elementToHighlightId": "#main-toolbar-project-manager-button", "nextStepTrigger": { - "presenceOfElement": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-game-settings" + "presenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-game-settings" }, "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Project Manager**" + "en": "Open the **Project Manager**.", + "fr": "Ouvrez le **Gestionnaire de projet**.", + "es": "Abre el **Gestor de proyectos**.", + "pt": "Abra o **Gerenciador de projetos**.", + "th": "เปิด **โปรเจกต์เมเนเจอร์**", + "ar": "فتح **مدير المشروع**." } }, "placement": "right" } }, { - "elementToHighlightId": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-game-settings", + "elementToHighlightId": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-game-settings", "nextStepTrigger": { "presenceOfElement": "#project-manager-tab-game-properties" }, "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Game Settings** tab." + "en": "Open the **Game Settings** tab.", + "fr": "Ouvrez les **Paramètres du jeu**.", + "es": "Abre la pestaña **Configuración del juego**.", + "pt": "Abra a guia **Configurações do jogo**.", + "th": "เปิดแท็บ **ตั้งค่าเกม**", + "ar": "فتح نافذة **إعدادات اللعبة**." } } }, - "isOnClosableDialog": true + "isOnClosableDialog": true, + "skippable": true }, { "elementToHighlightId": "#project-manager-tab-game-properties", @@ -154,7 +287,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Open the game **properties**." + "en": "Open the game **properties**.", + "fr": "Ouvrez les **Propriétés** du jeu.", + "es": "Abre las **Propiedades** del juego.", + "pt": "Abra as **Propriedades** do jogo.", + "th": "เปิด **คุณสมบัติ** ของเกม", + "ar": "فتح **خصائص** اللعبة." } } }, @@ -163,12 +301,18 @@ { "elementToHighlightId": "#game-resolution-width", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "1280" }, + "deprecated": true, "tooltip": { "description": { "messageByLocale": { - "en": "Change the width to **1280** pixels." + "en": "Change the width to **1280** pixels.", + "fr": "Définissez une largeur de **1280** pixels.", + "es": "Cambia el ancho a **1280** píxeles.", + "pt": "Mude a largura para **1280** pixels.", + "th": "เปลี่ยนความกว้างเป็น **1280** พิกเซล", + "ar": "تغيير العرض إلى **1280** بكسل." } } }, @@ -177,12 +321,18 @@ { "elementToHighlightId": "#game-resolution-height", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "720" }, + "deprecated": true, "tooltip": { "description": { "messageByLocale": { - "en": "Change the height to **720** pixels." + "en": "Change the height to **720** pixels.", + "fr": "Et une hauteur de **720** pixels.", + "es": "Cambia la altura a **720** píxeles.", + "pt": "Mude a altura para **720** pixels.", + "th": "เปลี่ยนความสูงเป็น **720** พิกเซล", + "ar": "تغيير الارتفاع إلى **720** بكسل." } } }, @@ -196,7 +346,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Set this to **no changes to the game size**." + "en": "Set this to **no changes to the game size**.", + "fr": "Choisissez l'option **Aucune modification de la taille du jeu**.", + "es": "Establece esto en **No hay cambios en el tamaño del juego**.", + "pt": "Defina isso como **Nenhuma alteração no tamanho do jogo**.", + "th": "ตั้งค่าเป็น **ไม่เปลี่ยนแปลงขนาดของเกม**", + "ar": "تعيين هذه إلى **لا تغيير في حجم اللعبة**." } } }, @@ -210,11 +365,36 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "On a terminé.", + "es": "Ya hemos terminado.", + "pt": "Estamos prontos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForBorder", "elementToHighlightId": "#add-new-object-button", @@ -223,9 +403,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "First, let's find a border for our **scene**." + "en": "First, let's find a border for our **scene**.", + "fr": "Commençons par trouver une bordure à notre **scène**.", + "es": "Primero, busquemos un borde para nuestra **escena**.", + "pt": "Primeiro, vamos encontrar uma borda para nossa **cena**.", + "th": "ขั้นแรก หาขอบเขตของ **scene**", + "ar": "أولًا، هيّا نعثر على حدود **مشهدنا**." } } } @@ -238,7 +424,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose an **object** from the asset store" + "en": "Let's choose an **object** from the asset store", + "fr": "Nous allons choisir un **objet** dans le magasin de ressources.", + "es": "Vamos a elegir un **objeto** de la tienda de recursos.", + "pt": "Vamos escolher um objeto da loja de recursos.", + "th": "เลือก **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار **كائن** من متجر العناصر" } }, "placement": "bottom" @@ -254,12 +445,22 @@ "tooltip": { "title": { "messageByLocale": { - "en": "We're looking for a tiled sprite that we can resize easily" + "en": "We're looking for a tiled sprite that we can resize easily", + "fr": "Nous allons chercher une mosaïque que nous pouvons facilement redimensionner", + "es": "Buscamos un sprite mosaico que podamos redimensionar fácilmente", + "pt": "Estamos procurando por um sprite em mosaico que possamos redimensionar facilmente", + "th": "เรากำลังมองหา tiled sprite ที่สามารถปรับขนาดได้ง่าย", + "ar": "نحن نبحث عن كائن مبلط يمكن إعادة تحجيمه بسهولة" } }, "description": { "messageByLocale": { - "en": "Tip: search for “**tiled sprite**”." + "en": "Tip: search for “**tiled sprite**”.", + "fr": "Un conseil, cherchez la traduction en anglais: “**tiled sprite**”.", + "es": "Consejo: busca “**tiled sprite**”.", + "pt": "Dica: procure por “**tiled sprite**”.", + "th": "แนะนำ: ค้นหาเป็นภาษาอังกฤษ “**tiled sprite**”", + "ar": "تلميح: البحث عن **tiled sprite**." } } }, @@ -277,12 +478,17 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-0" + "objectAddedInLayout": true }, "tooltip": { "description": { "messageByLocale": { - "en": "Add this asset to your project." + "en": "Add this asset to your project.", + "fr": "Ajoutez cette ressource à votre projet.", + "es": "Agrega este recurso a tu proyecto.", + "pt": "Adicione este recurso ao seu projeto.", + "th": "เพิ่ม asset ไปยังโปรเจกต์ของคุณ", + "ar": "إضافة هذا العنصر إلى مشروعك." } } }, @@ -300,11 +506,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's add the $(border) to our game!" + "en": "Let's add the $(border) to our game!", + "fr": "Ajoutons $(border) à notre projet !", + "es": "¡Agreguemos $(border) a nuestro juego!", + "pt": "Vamos adicionar $(border) ao nosso jogo!", + "th": "มาใส่ $(border) ในเกมกันเถอะ!", + "ar": "هيّا نقوم بإضافة الـ $(border) إلى لعبتنا" } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:border", "nextStepTrigger": { @@ -313,17 +555,29 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(border) from the menu to the canvas." + "en": "Drag $(border) from the menu to the canvas.", + "fr": "Faites glisser $(border) du menu au canvas.", + "es": "Arrastra $(border) desde el menú al lienzo.", + "pt": "Arraste $(border) do menu para o canvas.", + "th": "ลาก $(border) จากเมนูไปยังแคนวาส", + "ar": "سحب $(border) من القائمة إلى اللوحة." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "Ya terminé", + "pt": "Terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت!" } } }, @@ -331,14 +585,40 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Place and resize at least 4 instances of $(border) to create a closed frame around your screen ($(instancesCount:border)/4)." + "en": "Place and resize at least 4 instances of $(border) to create a closed frame around the screen ($(instancesCount:border)/4).", + "fr": "Ajoutez et redimensionnez 4 instances de $(border) de manière à créer un cadre fermé autour de l'écran ($(instancesCount:border)/4).", + "es": "Coloca y redimensiona al menos 4 instancias de $(border) para crear un marco cerrado alrededor de la pantalla ($(instancesCount:border)/4).", + "pt": "Coloque e redimensione pelo menos 4 instâncias de $(border) para criar um quadro fechado ao redor da tela ($(instancesCount:border)/4).", + "th": "วางและปรับขนาดอย่างน้อย 4 อินสแตนซ์ ของ $(border) เพื่อสร้างกรอบรอบหน้าจอ ($(instancesCount:border)/4)", + "ar": "إدراج وإعادة تحجيم 4 مثيلات على الأقل من $(border) لإنشاء إطار مغلق حول الشاشة ($(instancesCount:border)/4)." } }, "placement": "top", "image": { "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Mi45MzEgMzAuMDE2IDE0MC4yNzkgOTUuMTY4IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3QgeD0iNTIuOTMxIiB5PSIzMC4wMTYiIHdpZHRoPSIxNDAuMjc5IiBoZWlnaHQ9Ijk1LjE2OCIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiBub25lOyBzdHJva2Utd2lkdGg6IDJweDsiLz4KICA8cmVjdCB4PSI1NS4wMjMiIHk9IjEwOS45NjciIHdpZHRoPSIxMzYuMTkiIGhlaWdodD0iMTIuODA3IiBzdHlsZT0iZmlsbDogcmdiKDU0LCAyMjAsIDM5KTsiLz4KICA8cmVjdCB4PSI1NS4wMjMiIHk9IjMyLjIwNSIgd2lkdGg9IjEzNi4xOSIgaGVpZ2h0PSIxMi44MDciIHN0eWxlPSJmaWxsOiByZ2IoNTQsIDIyMCwgMzkpOyIvPgogIDxyZWN0IHg9IjE3OC4yMjQiIHk9IjQ2LjIxMyIgd2lkdGg9IjEyLjg1OCIgaGVpZ2h0PSI2Mi4zMzYiIHN0eWxlPSJmaWxsOiByZ2IoNTQsIDIyMCwgMzkpOyIvPgogIDxyZWN0IHg9IjU1LjAxNCIgeT0iNDYuMjczIiB3aWR0aD0iMTIuODU4IiBoZWlnaHQ9IjYyLjMzNiIgc3R5bGU9ImZpbGw6IHJnYig1NCwgMjIwLCAzOSk7Ii8+Cjwvc3ZnPg==" } - } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true }, { "id": "ClickOnNewObjectButtonForProjectile", @@ -348,9 +628,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Now let's find an **object** that we can throw." + "en": "Now let's find an **object** that we can throw.", + "fr": "Maintenant, trouvons un **objet** que nous allons lancer.", + "es": "Ahora, busquemos un **objeto** que podamos lanzar.", + "pt": "Agora, vamos encontrar um **objeto** que possamos jogar.", + "th": "ทีนี้เราจะหา **วัตถุ** ที่เราจะใช้สำหรับโยน", + "ar": "الآن هيّا نعثر على **كائن** يمكننا قذفه." } } } @@ -363,7 +649,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose an object from the asset store." + "en": "Let's choose an object from the **asset store**.", + "fr": "Nous allons choisir un objet dans le **magasin de ressources**.", + "es": "Vamos a elegir un objeto de la **tienda de recursos**.", + "pt": "Vamos escolher um objeto da **loja de recursos**.", + "th": "เลือก **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار كائن من **متجر العناصر**." } }, "placement": "bottom" @@ -379,7 +670,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select a rounded object that you'd like to throw (try **ball**)." + "en": "Select a rounded object that you'd like to throw (try **ball**).", + "fr": "Ajoutez un objet rond que vous aimeriez lancer (essayez **ball**).", + "es": "Agrega un objeto redondo que te gustaría lanzar (intenta con **ball**).", + "pt": "Adicione um objeto redondo que você gostaria de jogar (tente **ball**).", + "th": "เลือกวัตถุที่กลมที่คุณอยากจะโยน (ลอง **ball**)", + "ar": "تحديد كائن مستدير قد يناسبك إلقائه (تجربة **ball**)." } } }, @@ -388,7 +684,7 @@ { "stepId": "CloseAssetStoreForProjectile", "trigger": { - "presenceOfElement": "#object-item-1" + "objectAddedInLayout": true } } ] @@ -404,7 +700,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-1" + "objectAddedInLayout": true }, "mapProjectData": { "projectile": "sceneLastObjectName:playScene" @@ -420,24 +716,87 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Perfect, let's see how to throw it easily." + "en": "Perfect, let's see how to throw it easily.", + "fr": "Parfait, voyons maintenant comment le lancer.", + "es": "Perfecto, veamos cómo lanzarlo fácilmente.", + "pt": "Perfeito, vamos ver como jogá-lo facilmente.", + "th": "สมบูรณ์แบบ ลองมาดูวิธีโยนมันแบบง่ายๆกัน", + "ar": "ممتاز، هيّا نرى كيفية رميه بسهولة." } } } }, { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "interactsWithCanvas": true, "elementToHighlightId": "objectInObjectsList:projectile", "nextStepTrigger": { - "instanceAddedOnScene": "projectile" + "instanceAddedOnScene": "projectile", + "instancesCount": 3 }, "tooltip": { "description": { "messageByLocale": { - "en": "Add 3 **instances** of the **object** *$(projectile)* inside the frame." + "en": "Add 3 **instances** of the **object** *$(projectile)* inside the frame.", + "fr": "Ajoutez 3 **instances** de **l'objet** *$(projectile)* dans le cadre.", + "es": "Agrega 3 **instancias** del **objeto** *$(projectile)* dentro del marco.", + "pt": "Adicione 3 **instâncias** do **objeto** *$(projectile)* dentro do quadro.", + "th": "เพิ่ม 3 **instances** ของ **วัตถุ** *$(projectile)* ภายในเฟรม", + "ar": "إضافة 3 **مثيلات** من **الكائن** *$(projectile)* داخل الإطار." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForTarget", "elementToHighlightId": "#add-new-object-button", @@ -446,9 +805,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Now let's find a target to aim." + "en": "Now let's find a target to aim.", + "fr": "Maintenant trouvons une cible à atteindre.", + "es": "Ahora busquemos un objetivo para apuntar.", + "pt": "Agora vamos encontrar um alvo para mirar.", + "th": "ทีนี้เราจะหาเป้าสำหรับโยนวัตถุใส่", + "ar": "الآن هيّا نعثر على هدف لإصابته." } } } @@ -461,7 +826,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose a new **object** from the asset store." + "en": "Let's choose a new **object** from the asset store.", + "fr": "Nous allons choisir un objet dans le **magasin de ressources**.", + "es": "Vamos a elegir un **objeto** nuevo desde la tienda de recursos.", + "pt": "Vamos escolher um novo **objeto** da loja de recursos.", + "th": "เลือก **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار **كائن** جديد من متجر العناصر." } }, "placement": "bottom" @@ -477,7 +847,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select an object that you would like to use as a target to throw $(projectile) at." + "en": "Select an object that you would like to use as a target to throw $(projectile) at.", + "fr": "Cherchez une cible qui vous plaît (essayez **target**).", + "es": "Busca un objeto que te gustaría usar como un objetivo para lanzar $(projectile) a.", + "pt": "Selecione um objeto que você gostaria de usar como um alvo para jogar $(projectile) em.", + "th": "เลือกวัตถุที่คุณอยากจะโยน $(projectile) ใส่ (ลอง **target**)", + "ar": "تحديد كائن قد يناسبك استخدامه كهدف لقذف الـ $(projectile) عليه." } } }, @@ -486,7 +861,7 @@ { "stepId": "CloseAssetStoreForTarget", "trigger": { - "presenceOfElement": "#object-item-2" + "objectAddedInLayout": true } } ] @@ -502,7 +877,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-2" + "objectAddedInLayout": true }, "mapProjectData": { "target": "sceneLastObjectName:playScene" @@ -518,11 +893,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Perfect, let's add it to the **scene**." + "en": "Perfect, let's add it to the **scene**.", + "fr": "Ajoutez cet objet à votre **scène**.", + "es": "Perfecto, agreguemoslo a la **escena**.", + "pt": "Perfeito, vamos adicioná-lo à **cena**.", + "th": "สมบูรณ์แบบ ใส่มันลงไปใน **scene**", + "ar": "ممتاز، هيّا نقوم بإضافته إلى **المشهد**." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:target", "nextStepTrigger": { @@ -531,11 +942,36 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add $(target) inside the frame." + "en": "Add $(target) inside the frame.", + "fr": "Ajoutez $(target) dans le cadre.", + "es": "Agrega $(target) dentro del marco.", + "pt": "Adicione $(target) dentro do quadro.", + "th": "เพิ่ม $(target) เข้าไปภายในเฟรม", + "ar": "إضافة $(target) داخل الإطار." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForBlock", "elementToHighlightId": "#add-new-object-button", @@ -544,9 +980,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Finally let's find something to protect $(target)." + "en": "Finally let's find something to protect $(target).", + "fr": "Finalement, trouvons quelque chose pour protéger $(target).", + "es": "Finalmente, encontremos algo para proteger $(target).", + "pt": "Finalmente, vamos encontrar algo para proteger $(target).", + "th": "ขั้นสุดท้าย เราจะหาอะไรมาป้องกัน $(target)", + "ar": "أخيرًا وليس آخرًا، هيّا نعثر على شيء يحمي $(target)." } } } @@ -559,7 +1001,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose a new object from the asset store." + "en": "Let's choose a new object from the asset store.", + "fr": "Nous allons choisir un objet dans le **Magasin de ressources**.", + "es": "Vamos a elegir un nuevo objeto de la tienda de recursos.", + "pt": "Vamos escolher um novo objeto da loja de recursos.", + "th": "เลือก **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار **كائن** جديد من متجر العناصر." } }, "placement": "bottom" @@ -575,7 +1022,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select a **block** object you would like to use as an obstacle for your $(projectile)." + "en": "Select a **block** object you would like to use as an obstacle for your $(projectile).", + "fr": "Cherchez un objet qui servira d'obstacle aux $(projectile) (cherchez **block**).", + "es": "Busca un objeto que sirva como obstáculo para tus $(projectile) (busca **block**).", + "pt": "Procure um objeto que sirva como obstáculo para seus $(projectile) (procure **block**).", + "th": "เลือกวัตถุ **block** ที่คุณอยากจะใช้เป็นสิ่งกีดขวาง $(projectile) (ลอง **block**)", + "ar": "تحديد **عقبة** قد يناسبك استخدامه كحاجز لـ $(projectile) خاصتك." } } }, @@ -584,7 +1036,7 @@ { "stepId": "CloseAssetStoreForBlock", "trigger": { - "presenceOfElement": "#object-item-3" + "objectAddedInLayout": true } } ] @@ -600,7 +1052,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-3" + "objectAddedInLayout": true }, "mapProjectData": { "block": "sceneLastObjectName:playScene" @@ -616,24 +1068,97 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Perfect, let's add it to the **scene**." + "en": "Perfect, let's add it to the **scene**.", + "fr": "Parfait, ajoutez le à la **scène**.", + "es": "Perfecto, agreguemoslo a la **escena**.", + "pt": "Perfeito, vamos adicioná-lo à **cena**.", + "th": "สมบูรณ์แบบ ใส่มันลงไปใน **scene**", + "ar": "ممتاز، هيّا نقوم بإضافته إلى **المشهد**." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:block", "nextStepTrigger": { - "instanceAddedOnScene": "block" + "instanceAddedOnScene": "block", + "instancesCount": 2 }, "tooltip": { "description": { "messageByLocale": { - "en": "Add multiple $(block)s inside the frame." + "en": "Add multiple $(block)s inside the frame.", + "fr": "Ajoutez plusieurs instances de $(block) dans le cadre.", + "es": "Agrega múltiples instancias de $(block) dentro del marco.", + "pt": "Adicione várias instâncias de $(block) dentro do quadro.", + "th": "เพิ่ม $(block) ปริมาณมากใส่ลงไปในเฟรม", + "ar": "إضافة العديد من الـ $(block) داخل الإطار." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:border", "nextStepTrigger": { @@ -642,13 +1167,23 @@ "tooltip": { "title": { "messageByLocale": { - "en": "Now, let's add some physics to our **objects**." + "en": "Now, let's add some physics to our **objects**.", + "fr": "Maintenant, ajoutons un moteur physique à nos **objets**.", + "es": "Ahora, agreguemos un motor físico a nuestros **objetos**.", + "pt": "Agora, vamos adicionar um motor físico aos nossos **objetos**.", + "th": "ทีนี้เราจะเพิ่มฟิสิกส์ให้ **objects**", + "ar": "الآن، هيّا نقوم بإضافة بعض الفيزيائيات إلى **كائننا**." } }, "placement": "left", "description": { "messageByLocale": { - "en": "Right click on $(border) and select “Edit behaviors”." + "en": "Right click on $(border) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(border) et cliquez sur “Modifier les comportements”.", + "es": "Haz clic derecho en $(border) y selecciona “Editar comportamientos”.", + "pt": "Clique com o botão direito em $(border) e selecione “Editar comportamentos”.", + "th": "คลิกขวา $(border) และเลือก “แก้ไขพฤติกรรม”", + "ar": "نقرة بزر الفأرة الأيمن على $(border) وتحديد **تحرير السلوكيات**." } } } @@ -661,7 +1196,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the object here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Los **comportamientos** del **objeto** se encuentran en esta pestaña.", + "pt": "Os **comportamentos** do **objeto** estão nesta guia.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -676,7 +1216,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Add a new behavior." + "messageByLocale": { + "en": "Add a new behavior.", + "fr": "Ajoutez un nouveau comportement.", + "es": "Agrega un nuevo comportamiento.", + "pt": "Adicione um novo comportamento.", + "th": "เพิ่มพฤติกรรมใหม่", + "ar": "إضافة سلوك جديد." + } } }, "isOnClosableDialog": true @@ -688,7 +1235,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Select the **Physics behavior**." + "messageByLocale": { + "en": "Select the **Physics behavior**.", + "fr": "Sélectionnez le comportement **Moteur physique**.", + "es": "Selecciona el comportamiento **Motor físico**.", + "pt": "Selecione o comportamento **Motor físico**.", + "th": "เลือก **พฤติกรรมฟิสิกส์**", + "ar": "تحديد **سلوك الفيزياء**." + } } }, "isOnClosableDialog": true @@ -696,12 +1250,17 @@ { "elementToHighlightId": "#physics2-parameter-body-type", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Static" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select **static**." + "en": "Select **static**.", + "fr": "Choisissez l'option **Fixe**.", + "es": "Selecciona **estático**.", + "pt": "Selecione **estático**.", + "th": "เลือก **คงที่**", + "ar": "تحديد **ثابت**." } }, "placement": "top" @@ -716,11 +1275,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We'll see later how to use the other parameters. We're good now." + "en": "We'll see later how to use the other parameters. We're good now.", + "fr": "Nous verrons plus tard à quoi servent les autres paramètres. C'est tout pour le moment.", + "es": "Más adelante veremos cómo usar los otros parámetros. Por ahora, estamos bien.", + "pt": "Mais tarde veremos como usar os outros parâmetros. Por enquanto, estamos bem.", + "th": "สำหรับพารามิเตอร์อื่นๆเดี๋ยวจะกลับมาดูอีกครั้ง ตอนนี้ยังไม่ต้องไปสนใจ", + "ar": "سوف نرى لاحقًا كيفية استخدام الخصائص الأخرى. نحن على الطريق الصحيح حاليًا." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:projectile", "nextStepTrigger": { @@ -730,7 +1325,12 @@ "placement": "left", "description": { "messageByLocale": { - "en": "Now right click on $(projectile) and select “Edit behaviors”." + "en": "Now right click on $(projectile) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(projectile) et cliquez sur “Modifier les comportements”.", + "es": "Haz clic derecho en $(projectile) y selecciona “Editar comportamientos”.", + "pt": "Clique com o botão direito em $(projectile) e selecione “Editar comportamentos”.", + "th": "คลิกขวาที่ $(projectile) และเลือก “แก้ไขพฤติกรรม”", + "ar": "الآن نقرة بزر الفأرة الأيمن على $(projectile) وتحديد **تحرير السلوكيات**." } } } @@ -743,7 +1343,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the **object** here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Los **comportamientos** del **objeto** se encuentran en esta pestaña.", + "pt": "Os **comportamentos** do **objeto** estão nesta guia.", + "th": "ดู **พฤติกรรม** จาก **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -758,7 +1363,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Add a new behavior." + "messageByLocale": { + "en": "Add a new behavior.", + "fr": "Ajoutez un nouveau comportement.", + "es": "Agrega un nuevo comportamiento.", + "pt": "Adicione um novo comportamento.", + "th": "เพิ่มพฤติกรรมใหม่", + "ar": "إضافة سلوك جديد." + } } }, "isOnClosableDialog": true @@ -770,7 +1382,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Select the Physics behavior." + "messageByLocale": { + "en": "Select the Physics behavior.", + "fr": "Sélectionnez le comportement Moteur physique.", + "es": "Selecciona el comportamiento Motor físico.", + "pt": "Selecione o comportamento Motor físico.", + "th": "เลือกพฤติกรรมฟิสิกส์", + "ar": "تحديد سلوك الفيزياء." + } } }, "isOnClosableDialog": true @@ -778,12 +1397,17 @@ { "elementToHighlightId": "#physics2-parameter-shape", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Circle" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select Circle." + "en": "Select **Circle**.", + "fr": "Choisissez l'option **Cercle**.", + "es": "Selecciona **Círculo**.", + "pt": "Selecione **Círculo**.", + "th": "เลือก **วงกลม**", + "ar": "تحديد **دائرة**." } }, "placement": "top" @@ -793,12 +1417,17 @@ { "elementToHighlightId": "#physics2-parameter-density", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "5" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the density to 5." + "en": "Change the density to 5.", + "fr": "Utilisez une densité de 5.", + "es": "Cambia la densidad a 5.", + "pt": "Mude a densidade para 5.", + "th": "ปรับความหนาแน่นเป็น 5", + "ar": "تغيير الكثافة (Density) إلى 5." } }, "placement": "top" @@ -808,12 +1437,17 @@ { "elementToHighlightId": "#physics2-parameter-angular-damping", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "15" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the angular damping to 15." + "en": "Change the angular damping to 15.", + "fr": "Utilisez un amortissement angulaire de 15.", + "es": "Cambia el amortiguamiento angular a 15.", + "pt": "Mude o amortecimento angular para 15.", + "th": "ปรับการลดแรงสั่นสะเทือนเชิงมุมเป็น 15", + "ar": "تغيير التثبيط الزاوي (Angular Damping) إلى 15." } }, "placement": "top" @@ -828,11 +1462,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're good." + "en": "We're good.", + "fr": "C'est bon.", + "es": "Está bien.", + "pt": "Está bom.", + "th": "เรียบร้อยแล้ว", + "ar": "نحن على الطريق الصحيح." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:target", "nextStepTrigger": { @@ -842,7 +1512,12 @@ "placement": "left", "description": { "messageByLocale": { - "en": "Now right click on $(target) and select “Edit behaviors”." + "en": "Now right click on $(target) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(target) et cliquez sur “Modifier les comportements”.", + "es": "Ahora haz clic derecho en $(target) y selecciona “Editar comportamientos”.", + "pt": "Agora clique com o botão direito em $(target) e selecione “Editar comportamentos”.", + "th": "คลิกขวาที่ $(target) และเลือก “แก้ไขพฤติกรรม”", + "ar": "الآن نقرة بزر الفأرة الأيمن على $(target) وتحديد **تحرير السلوكيات**." } } } @@ -855,7 +1530,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the **object** here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Aquí puedes ver los **comportamientos** del **objeto**.", + "pt": "Veja os **comportamentos** do **objeto** aqui.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -877,7 +1557,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Select the Physics behavior." + "messageByLocale": { + "en": "Select the Physics behavior.", + "fr": "Sélectionnez le comportement Moteur physique.", + "es": "Selecciona el comportamiento Física.", + "pt": "Selecione o comportamento Física.", + "th": "เลือกพฤติกรรมฟิสิกส์", + "ar": "تحديد سلوك الفيزياء." + } } }, "isOnClosableDialog": true @@ -889,10 +1576,48 @@ }, "tooltip": { "description": { - "messageByLocale": "No need to change anything." + "messageByLocale": { + "en": "No need to change anything.", + "fr": "La configuration de base suffit. Continuons.", + "es": "No necesitas cambiar nada.", + "pt": "Não é necessário alterar nada.", + "th": "ไม่ต้องเปลี่ยนแปลงอะไร", + "ar": "لا حاجة إلى تغيير أي شيء" + } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:block", "nextStepTrigger": { @@ -902,7 +1627,12 @@ "placement": "left", "description": { "messageByLocale": { - "en": "Now right click on $(block) and select “Edit behaviors”." + "en": "Now right click on $(block) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(block) et cliquez sur “Modifier les comportements”.", + "es": "Ahora haz clic derecho en $(block) y selecciona “Editar comportamientos”.", + "pt": "Agora clique com o botão direito em $(block) e selecione “Editar comportamentos”.", + "th": "คลิกขวาที่ $(block) และเลือก “แก้ไขพฤติกรรม”", + "ar": "الآن نقرة بزر الفأرة الأيمن على $(block) وتحديد **تحرير السلوكيات**." } } } @@ -915,7 +1645,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the **object** here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Aquí puedes ver los **comportamientos** del **objeto**.", + "pt": "Veja os **comportamentos** do **objeto** aqui.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -937,7 +1672,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Select the Physics behavior." + "messageByLocale": { + "en": "Select the Physics behavior.", + "fr": "Sélectionnez le comportement Moteur physique.", + "es": "Selecciona el comportamiento Física.", + "pt": "Selecione o comportamento Física.", + "th": "เลือกพฤติกรรมฟิสิกส์", + "ar": "تحديد سلوك الفيزياء." + } } }, "isOnClosableDialog": true @@ -952,35 +1694,51 @@ "id": "OpenPropertiesManagerForExtension", "elementToHighlightId": "#main-toolbar-project-manager-button", "nextStepTrigger": { - "presenceOfElement": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-extensions" + "presenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-extensions" }, "tooltip": { "title": { "messageByLocale": { - "en": "Now we'll make it possible to drag the $(projectile)." + "en": "Now we'll make it possible for the player to drag the $(projectile).", + "fr": "Maintenant, nous allons faire en sorte que le joueur puisse faire glisser $(projectile) avec sa souris.", + "es": "Ahora vamos a hacer que el jugador pueda arrastrar $(projectile) con el ratón.", + "pt": "Agora vamos fazer com que o jogador possa arrastar $(projectile) com o mouse.", + "th": "ทีนี้เราจะทำให้ผู้เล่นสามารถลาก $(projectile)", + "ar": "الآن هيّا نجعل اللاعبين قادرين على سحب الـ $(projectile)." } }, "description": { "messageByLocale": { - "en": "For this, we will install an **extension**.\n\nOpen the **Project Manager**" + "en": "For this, we will install an **extension**.\n\nOpen the **Project Manager**.", + "fr": "Pour cela, nous allons installer un **extension**.\n\nOuvrez le **Gestionnaire de projet**.", + "es": "Para ello, vamos a instalar una **extensión**.\n\nAbre el **Gestor de proyectos**.", + "pt": "Para isso, vamos instalar uma **extensão**.\n\nAbra o **Gerenciador de projetos**.", + "th": "โดยเราจะติดตั้ง **extension**\n\nเปิด **โปรเจกต์เมเนเจอร์**", + "ar": "للقيام بذلك، سوف نقوم بتثبيت **ملحق**.\n\nفتح **مدير المشروع**." } }, "placement": "right" } }, { - "elementToHighlightId": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-extensions", + "elementToHighlightId": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-extensions", "nextStepTrigger": { "presenceOfElement": "#project-manager-extension-search-or-create" }, "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Extensions** tab." + "en": "Open the **Extensions** tab.", + "fr": "Ouvrez l'onglet **Extensions**.", + "es": "Abre la pestaña **Extensiones**.", + "pt": "Abra a guia **Extensões**.", + "th": "เปิดแท็บ **Extensions**", + "ar": "فتح نافذة **الملحقات**." } } }, - "isOnClosableDialog": true + "isOnClosableDialog": true, + "skippable": true }, { "elementToHighlightId": "#project-manager-extension-search-or-create", @@ -990,7 +1748,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Open the extension store" + "en": "Open the extension store", + "fr": "Ouvrez le **Magasin d'extension**.", + "es": "Abre la **Tienda de extensiones**.", + "pt": "Abra a **Loja de extensões**.", + "th": "เปิดร้านค้า extension", + "ar": "فتح متجر الملحقات" } } }, @@ -1004,7 +1767,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Search for the **draggable** extension (for physics objects)." + "en": "Search for the **draggable** extension (for physics objects).", + "fr": "Cherchez l'extension **draggable**.", + "es": "Busca la extensión **draggable**.", + "pt": "Procure pela extensão **draggable**.", + "th": "ค้นหา **draggable** extension (สำหรับวัตถุฟิสิกส์)", + "ar": "البحث عن الملحق\n\n**draggable** (for physics objects)" } } }, @@ -1019,7 +1787,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Click on the extension." + "en": "Click on the extension.", + "fr": "Cliquez sur l'extension.", + "es": "Haz clic en la extensión.", + "pt": "Clique na extensão.", + "th": "คลิกที่ extension", + "ar": "النقر على الملحق." } } }, @@ -1033,9 +1806,16 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Install the extension." + "en": "Install the extension in your project.", + "fr": "Installez l'extension dans votre projet.", + "es": "Instala la extensión en tu proyecto.", + "pt": "Instale a extensão no seu projeto.", + "th": "ติดตั้ง extension ในโปรเจกต์ของคุณ", + "ar": "تثبيت الملحق في مشروعك." } - } + }, + "placement": "left", + "mobilePlacement": "top" }, "isOnClosableDialog": true }, @@ -1047,11 +1827,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Close the store." + "en": "Close the store.", + "fr": "Fermez le magasin.", + "es": "Cierra la tienda.", + "pt": "Feche a loja.", + "th": "ปิดหน้าต่างของร้านค้า", + "ar": "إغلاق المتجر." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:projectile", "nextStepTrigger": { @@ -1061,7 +1877,12 @@ "placement": "left", "description": { "messageByLocale": { - "en": "Now right click on $(projectile) and select “Edit behaviors”." + "en": "Now right click on $(projectile) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(projectile) et cliquez sur “Modifier les comportements”.", + "es": "Haz clic derecho en $(projectile) y selecciona “Editar comportamientos”.", + "pt": "Clique com o botão direito em $(projectile) e selecione “Editar comportamentos”.", + "th": "คลิกขวาที่ $(projectile) และเลือก “แก้ไขพฤติกรรม”", + "ar": "الآن نقرة بزر الفأرة الأيمن على $(projectile) وتحديد **تحرير السلوكيات**." } } } @@ -1074,7 +1895,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the **object** here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Los **comportamientos** del **objeto** se encuentran en esta pestaña.", + "pt": "Os **comportamentos** do **objeto** estão nesta guia.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -1089,7 +1915,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Add a new behavior." + "messageByLocale": { + "en": "Add a new behavior.", + "fr": "Ajoutez un nouveau comportement.", + "es": "Agrega un nuevo comportamiento.", + "pt": "Adicione um novo comportamento.", + "th": "เพิ่มพฤติกรรมใหม่", + "ar": "إضافة سلوك جديد." + } } }, "isOnClosableDialog": true @@ -1099,25 +1932,19 @@ "nextStepTrigger": { "presenceOfElement": "#behavior-parameters-DraggablePhysics" }, - "tooltip": { - "description": { - "messageByLocale": "Select the Draggable behavior." - } - }, - "isOnClosableDialog": true - }, - { - "elementToHighlightId": "#object-editor-dialog #apply-button", - "nextStepTrigger": { - "absenceOfElement": "#object-editor-dialog" - }, "tooltip": { "description": { "messageByLocale": { - "en": "That's it!" + "en": "Select the Draggable behavior.", + "fr": "Sélectionnez le comportement Draggable.", + "es": "Selecciona el comportamiento Draggable.", + "pt": "Selecione o comportamento Draggable.", + "th": "เลือกพฤติกรรม Draggable", + "ar": "تحديد السلوك Draggable." } } - } + }, + "isOnClosableDialog": true }, { "elementToHighlightId": "#object-editor-dialog #apply-button", @@ -1127,7 +1954,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "That's it!" + "en": "That's it!", + "fr": "C'est tout !", + "es": "¡Eso es todo!", + "pt": "É isso aí!", + "th": "เรียบร้อยแล้ว!", + "ar": "هذا كل شيء!" } } } @@ -1140,7 +1972,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Click on the **Preview** button to see how you can click and drag your $(projectile) around the scene!" + "en": "Click on the **Preview** button to see how you can click and drag your $(projectile) around the scene!", + "fr": "Cliquez sur **Aperçu** pour tester votre jeu. Cliquez et faites glisser $(projectile) dans la scène !", + "es": "¡Haz clic en el botón **Vista previa** para ver cómo puedes hacer clic y arrastrar tu $(projectile) por la escena!", + "pt": "Clique no botão **Pré-visualizar** para ver como você pode clicar e arrastar seu $(projectile) pela cena!", + "th": "ลองคลิกที่ **ดูตัวอย่าง** แล้วทำการคลิกและลาก $(projectile) ไปมาเพื่อทดสอบกันเถอะ!", + "ar": "الضغط على الزر **معاينة** لرؤية كيف يمكنك ضغط وسحب كائنك $(projectile) في أرجاء المشهد!" } }, "placement": "bottom" @@ -1152,27 +1989,67 @@ "content": [ { "messageByLocale": { - "en": "## Congratulations!" + "en": "## Congratulations!", + "fr": "## Félicitations !", + "es": "## ¡Felicidades!", + "pt": "## Parabéns!", + "th": "## ยินดีด้วย!", + "ar": "## تهانينا!" } }, { "messageByLocale": { - "en": "You have finished the first part of your Fling Game." + "en": "You have finished the first part of your Fling Game.", + "fr": "Vous avez terminé la première partie de votre jeu.", + "es": "Has terminado la primera parte de tu juego.", + "pt": "Você terminou a primeira parte do seu jogo.", + "th": "ส่วนแรกของเกม Fling ของคุณเสร็จแล้ว", + "ar": "لقد أنهيت أول جزء من لعبة القذف خاصتك." } }, { "messageByLocale": { - "en": "Now you've discovered the basics of GDevelop:\n- [Objects](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [Instances](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [Behaviors](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [Scenes](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)" + "en": "You've discovered the basics of GDevelop:\n- [Objects](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [Instances](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [Behaviors](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [Scenes](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)", + "fr": "Vous avez découvert les bases de GDevelop:\n- [les objets](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [les instances](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [les comportements](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [les scènes](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)", + "es": "Has descubierto los fundamentos de GDevelop:\n- [Objetos](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [Instancias](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [Comportamientos](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [Escenas](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)", + "pt": "Você descobriu os fundamentos do GDevelop:\n- [Objetos](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [Instâncias](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [Comportamentos](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [Cenas](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)", + "th": "คุณได้เรียนรู้พื้นฐานของ GDevelop:\n- [Objects](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [Instances](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [Behaviors](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [Scenes](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor", + "ar": "لقد اكتشفت أساسيات GDevelop:\n- [كائنات](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=In%20GDevelop%2C%20everything%20on%20the,add%20text%20to%20a%20game)\n- [مثيلات](https://wiki.gdevelop.io/gdevelop5/objects#:~:text=After%20creating%20an%20object%2C%20GDevelop,an%20instance%20of%20the%20object)\n- [سلوكيات](https://wiki.gdevelop.io/gdevelop5/behaviors#:~:text=In%20GDevelop%2C%20behaviors%20add%20significant,following%20the%20laws%20of%20physics)\n- [مشاهد](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor#:~:text=The%20Scene%20Editor%20is%20where,events%20in%20the%20Events%20Editor)" } }, { "messageByLocale": { - "en": "You can take a break, or continue with the next chapter." + "en": "Now you can take a break from the tutorial, or continue to the next chapter.", + "fr": "Vous pouvez maintenant faire une pause avant de commencer le prochain chapitre.", + "es": "Ahora puedes hacer una pausa antes de comenzar el próximo capítulo.", + "pt": "Agora você pode fazer uma pausa antes de começar o próximo capítulo.", + "th": "คุณสามารถหยุดพักบทเรียนตรงนี้ หรือเข้าสู่บทเรียนถัดไปเลยก็ได้", + "ar": "يمكنك الآن أخذ استراحة أو استئناف البرنامج التعليمي إلى الفصل التالي." } } ] } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForBackground", "elementToHighlightId": "#add-new-object-button", @@ -1181,9 +2058,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Let's find a background for our game." + "en": "Let's find a background for our game.", + "fr": "Cherchons un arrière-plan pour notre jeu.", + "es": "Busquemos un fondo para nuestro juego.", + "pt": "Vamos encontrar um fundo para o nosso jogo.", + "th": "หาพื้นหลังสำหรับเกม", + "ar": "هيّا نعثر على خلفية للعبتنا." } } } @@ -1196,7 +2079,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose an **object** from the asset store." + "en": "Let's choose an **object** from the asset store.", + "fr": "Nous allons choisir un objet dans le **magasin de ressources**.", + "es": "Vamos a elegir un **objeto** de la tienda de recursos.", + "pt": "Vamos escolher um **objeto** na loja de recursos.", + "th": "ค้นหา **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار **كائن** من متجر العناصر." } }, "placement": "bottom" @@ -1212,7 +2100,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Type “**background**”." + "en": "Type “**background**”.", + "fr": "Cherchez “**background**”.", + "es": "Escribe “**background**”.", + "pt": "Digite “**background**”.", + "th": "ประเภท “**background**”", + "ar": "كتابة **background**." } } }, @@ -1221,7 +2114,7 @@ { "stepId": "CloseAssetStoreForBackground", "trigger": { - "presenceOfElement": "#object-item-4" + "objectAddedInLayout": true } } ] @@ -1237,7 +2130,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-4" + "objectAddedInLayout": true }, "mapProjectData": { "background": "sceneLastObjectName:playScene" @@ -1253,30 +2146,78 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Perfect, let's use it in our **scene**." + "en": "Perfect, let's use it in our **scene**.", + "fr": "Parfait, ajoutez le à la **scène**.", + "es": "Perfecto, añádelo a la **escena**.", + "pt": "Perfeito, vamos usá-lo na nossa **cena**.", + "th": "สมบูรณ์แบบ ใส่มันลงไปใน **scene**", + "ar": "ممتاز، هيّا نستخدمه في **مشهدنا**." } } } }, { - "elementToHighlightId": "objectInObjectsList:background", + "elementToHighlightId": "#toolbar-open-objects-panel-button", "nextStepTrigger": { - "instanceAddedOnScene": "background" + "presenceOfElement": "#add-new-object-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(background) from the menu to the canvas." + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" } }, - "placement": "left" - } + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:background", + "nextStepTrigger": { + "instanceAddedOnScene": "background" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag $(background) from the menu to the canvas.", + "fr": "Faites glisser $(background) du menu au canvas.", + "es": "Arrastra $(background) desde el menú al lienzo.", + "pt": "Arraste $(background) do menu para o canvas.", + "th": "ลาก $(background) จากเมนูไปยังแคนวาส", + "ar": "سحب $(background) من القائمة إلى اللوحة." + } + }, + "placement": "left" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "He terminado", + "pt": "Eu terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, @@ -1284,12 +2225,39 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Drag to expand the size of $(background) until it stretches over your entire game area." + "en": "Drag to expand the size of $(background) until it stretches over your entire game area.", + "fr": "Redimensionnez $(background) de façon à ce qu'il couvre toute la zone de jeu.", + "es": "Arrastra para ampliar el tamaño de $(background) hasta que se estire sobre toda la zona de juego.", + "pt": "Arraste para expandir o tamanho de $(background) até que ele se estenda sobre toda a área do jogo.", + "th": "ลากเพื่อปรับขนาด $(background) จนมันครอบคลุมบริเวณทั้งหมดในเกมของคุณ", + "ar": "سحب لتوسيع حجم الـ $(background) حتى يتم تغطية اللعبة بأكملها." } }, "image": { "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Mi45MzEgMzAuMDE2IDE0MC4yNzkgOTUuMTY4IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjMuMDcxIiB5MT0iMzAuMDE2IiB4Mj0iMTIzLjA3MSIgeTI9IjEyNS4xODQiIGlkPSJncmFkaWVudC0wIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTYyNTc4LCAwLCAwLCAwLjk2MjU3OCwgNC42MDU1NTksIDEuMTIzMjU4KSIgc3ByZWFkTWV0aG9kPSJwYWQiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMCwgMjA4LCAyNTUpOyIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMTY0LCAyMzcsIDI1NSk7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB4PSI1Mi45MzEiIHk9IjMwLjAxNiIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAycHg7IGZpbGw6IHVybCgjZ3JhZGllbnQtMCk7IGZpbGwtb3BhY2l0eTogMTsgZmlsbC1ydWxlOiBub256ZXJvOyIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiByZ2IoMTY1LCAxNTgsIDg1KTsiIGQ9Ik0gNTIuNzY3IDEyNS4xNjkgTCA1Mi44MSAxMTIuNDMgTCAxMTQuNjM3IDExMC44NDggTCAxNDYuNDIgOTEuNDUgTCAxNTguOTU5IDgxLjkyNCBMIDE2Ny41MTUgNzEuMTg0IEwgMTc3Ljc4OCA2MS40MTEgTCAxODMuMzYgNTYuNjU4IEwgMTkzLjI3OSA2NS42OTcgTCAxOTMuMTg2IDEyNS4yOTMgTCA1Mi43NjcgMTI1LjE2OSBaIi8+CiAgPHJlY3QgeD0iNTUuMDIzIiB5PSIzMi4yMDUiIHdpZHRoPSIxMzYuMTkiIGhlaWdodD0iMTIuODA3IiBzdHlsZT0iZmlsbDogcmdiKDU0LCAyMjAsIDM5KTsgb3BhY2l0eTogMC40MzsiLz4KICA8cmVjdCB4PSI1NS4wMTQiIHk9IjQ2LjI3MyIgd2lkdGg9IjEyLjg1OCIgaGVpZ2h0PSI2Mi4zMzYiIHN0eWxlPSJmaWxsOiByZ2IoNTQsIDIyMCwgMzkpOyBvcGFjaXR5OiAwLjQzOyIvPgogIDxwb2x5Z29uIHN0eWxlPSJmaWxsOiByZ2IoNywgMTE1LCAzMCk7IiBwb2ludHM9IjcyLjYxIDEwOS44MDggODUuNTc2IDEwMS44MyA3NC4xNDEgMTAxLjAxNSA4NC44NTIgOTAuNTIgNzcuMjUgODkuNjY3IDg2LjY5NCA4MS42MzcgODEuNjI5IDgwLjkxOCA5MC40MzcgNjcuOTI1IDk1LjcyNiA4MS41NzIgOTEuNTA2IDgxLjg1IDk3LjAzMSA5MS45MDggOTIuMTY0IDkxLjY2OCAxMDAuNTc4IDEwMS44NTQgOTMuMjM2IDEwMS41NTQgMTA1LjUxOCAxMTMuNDk2Ii8+CiAgPHBvbHlnb24gc3R5bGU9ImZpbGw6IHJnYig3LCAxMTUsIDMwKTsiIHBvaW50cz0iOTYuMTUzIDc1LjYwNyAxMDcuMzM5IDgzLjc5NyA5Ny42NjkgODQuNSAxMDYuODI5IDkzLjE1MyAxMDAuNjAxIDkzLjM2OSAxMDcuMTg5IDEwMC43MDcgMTA0LjA3IDEwMC45NzUgMTEwLjU4NyAxMTIuNzY1IDExNy4yODggOTkuNTY0IDExMy42MDMgMTAwLjI2IDExNy41MzUgOTEuMzk3IDExMi45MTIgOTMuMTc0IDExOS43NzEgODQuNzE5IDExMy44MTcgODQuMDM1IDEyMS4xNzEgNzQuMzE3IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSwgMCwgMCwgLTEsIDIyMC41NzgwMDMsIDE4Ni43NzgpIi8+CiAgPHJlY3QgeD0iNTUuMDIzIiB5PSIxMDkuOTY3IiB3aWR0aD0iMTM2LjE5IiBoZWlnaHQ9IjEyLjgwNyIgc3R5bGU9ImZpbGw6IHJnYig1NCwgMjIwLCAzOSk7IG9wYWNpdHk6IDAuNDM7Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiIGQ9Ik0gMTc1LjIyNiA3OS42MTMgTCAxNjIuODQ2IDc2LjkyOCBMIDE2Ny41MTUgNzEuMTg0IEwgMTc3Ljc4OCA2MS40MTEgTCAxODMuMzYgNTYuNjU4IEwgMTkzLjI3OSA2NS42OTcgTCAxOTMuMTg2IDc2LjMzOSBaIi8+CiAgPHJlY3QgeD0iMTc4LjIyNCIgeT0iNDYuMjEzIiB3aWR0aD0iMTIuODU4IiBoZWlnaHQ9IjYyLjMzNiIgc3R5bGU9ImZpbGw6IHJnYig1NCwgMjIwLCAzOSk7IG9wYWNpdHk6IDAuNDM7Ii8+CiAgPHJlY3QgeD0iNTIuOTUiIHk9IjI5Ljk4NCIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IG5vbmU7IHN0cm9rZS13aWR0aDogMnB4OyIvPgo8L3N2Zz4=" } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "elementToHighlightId": "#toolbar-open-properties-panel-button", + "skippable": true, + "nextStepTrigger": { + "presenceOfElement": "#instance-properties-editor" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **instance** properties editor panel and select the instance of $(background) on the scene.", + "fr": "Ouvrez le panneau d'édition des propriétés de **l'instance** et sélectionnez l'instance de $(background) sur la scène.", + "es": "Abre el panel de edición de propiedades de **la instancia** y selecciona la instancia de $(background) en la escena.", + "pt": "Abra o painel de edição de propriedades da **instância** e selecione a instância de $(background) na cena.", + "th": "เปิดแผงควบคุมสำหรับแก้ไขคุณสมบัติ **instance** และเลือก instance ของ $(background) ใน scence", + "ar": "فتح لوحة خصائص **المثيل** وتحديد مثيل الـ $(background) على الشاشة." + } + }, + "placement": "bottom" } }, { @@ -1301,25 +2269,76 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Select the instance of $(background) on the scene" + "en": "Select the instance of $(background) on the scene.", + "fr": "Sélectionnez l'instance de $(background) sur la scène.", + "es": "Selecciona la instancia de $(background) en la escena.", + "pt": "Selecione a instância de $(background) na cena.", + "th": "เลือก instance ของ $(background) ใน scence", + "ar": "تحديد المثيل $(background) بالمشهد." } } } }, + { + "elementToHighlightId": "#toolbar-open-properties-panel-button", + "skippable": true, + "nextStepTrigger": { + "presenceOfElement": "#instance-properties-editor" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **instance** properties editor panel and select the instance of $(grabArea) on the scene.", + "fr": "Ouvrez le panneau d'édition des propriétés de **l'instance** et sélectionnez l'instance de $(grabArea) sur la scène.", + "es": "Abre el panel de edición de propiedades de **la instancia** y selecciona la instancia de $(grabArea) en la escena.", + "pt": "Abra o painel de edição de propriedades da **instância** e selecione a instância de $(grabArea) na cena.", + "th": "เปิดแผงควบคุมสำหรับแก้ไขคุณสมบัติ **instance** และเลือก instance ของ $(grabArea) ใน scence", + "ar": "فتح لوحة خصائص **المثيل** وتحديد مثيل الـ $(grabArea) على الشاشة." + } + }, + "placement": "bottom" + } + }, { "elementToHighlightId": "#instance-properties-editor [id=\"Z Order\"]", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "-1" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the z order of $(background) to **-1** so that it is behind all other **instances** on the **scene**." + "en": "Change the z order of $(background) to **-1** so that it is behind all other **instances** on the **scene**.", + "fr": "Définissez la position sur l'axe z de $(background) à -1 pour qu'il soit derrière toutes les autres **instances** de la scène.", + "es": "Cambia el orden z de $(background) a **-1** para que esté detrás de todas las demás **instancias** de la **escena**.", + "pt": "Altere a ordem z de $(background) para **-1** para que ele fique atrás de todas as outras **instâncias** na **cena**.", + "th": "ปรับค่าลำดับ z ของ $(background) เป็น **-1** เพื่อให้พื้นหลังปรากฏอยู่ข้างหลัง **instances** อื่น", + "ar": "تغيير ترتيب $(background) إلى **-1** حيث يكون خلف كل **المثيلات** الأخرى في **المشهد**." } }, - "placement": "right" + "placement": "right", + "mobilePlacement": "top" } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForObstacle", "elementToHighlightId": "#add-new-object-button", @@ -1328,9 +2347,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Let's add some protection for $(target)." + "en": "Let's add some protection for $(target).", + "fr": "Ajoutons un objet pour protéger $(target).", + "es": "Agreguemos un objeto para proteger a $(target).", + "pt": "Vamos adicionar um objeto para proteger $(target).", + "th": "เพิ่มวัตถุป้องกันให้ $(target)", + "ar": "هيّا نقوم بإضافة بعض الحماية لصالح $(target)." } } } @@ -1343,7 +2368,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose an **object** from the asset store." + "en": "Let's choose an **object** from the asset store.", + "fr": "Nous allons choisir un objet dans le **magasin de ressources**.", + "es": "Vamos a elegir un **objeto** de la tienda de recursos.", + "pt": "Vamos escolher um **objeto** na loja de recursos.", + "th": "เพิ่ม **วัตถุ** จาก ร้านค้า asset", + "ar": "هيّا نقوم باختيار **كائن** من متجر العناصر." } }, "placement": "bottom" @@ -1359,7 +2389,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Search for **block**." + "en": "Search for **block**.", + "fr": "Cherchez “**block**”.", + "es": "Busca **block**.", + "pt": "Procure por **block**.", + "th": "ค้นหา “**block**”", + "ar": "البحث عن **block**." } } }, @@ -1368,7 +2403,7 @@ { "stepId": "CloseAssetStoreForObstacle", "trigger": { - "presenceOfElement": "#object-item-5" + "objectAddedInLayout": true } } ] @@ -1384,7 +2419,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-5" + "objectAddedInLayout": true }, "mapProjectData": { "obstacle": "sceneLastObjectName:playScene" @@ -1400,11 +2435,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Perfect, let's add them to the **scene**." + "en": "Perfect, let's add it to the **scene**.", + "fr": "Parfait, ajoutez le à la **scène**.", + "es": "Perfecto, agreguemoslo a la **escena**.", + "pt": "Perfeito, vamos adicioná-lo à **cena**.", + "th": "สมบูรณ์แบบ ใส่มันลงไปใน **scene**", + "ar": "ممتاز، هيّا نقوم بإضافته إلى **المشهد**." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:obstacle", "nextStepTrigger": { @@ -1414,12 +2485,22 @@ "placement": "left", "title": { "messageByLocale": { - "en": "Let's make them static so that they act as a wall." + "en": "Let's make them static so that they act as a wall.", + "fr": "Faisons en sorte qu'il reste fixe comme un mur.", + "es": "Hagamos que se mantengan estáticos como una pared.", + "pt": "Vamos mantê-los estáticos como uma parede.", + "th": "ทำให้คงที่เพื่อใช้ทำหน้าที่เป็นผนัง", + "ar": "هيّا نعينه ككائن ثابت حيث سيمثل الجدار." } }, "description": { "messageByLocale": { - "en": "Right click on $(obstacle) and select “Edit behaviors”." + "en": "Right click on $(obstacle) and select “Edit behaviors”.", + "fr": "Faites un clic droit sur $(obstacle) et cliquez sur “Modifier les comportements”.", + "es": "Haga clic derecho en $(obstacle) y seleccione “Editar comportamientos”.", + "pt": "Clique com o botão direito em $(obstacle) e selecione “Editar comportamentos”.", + "th": "คลิกขวาที่ $(obstacle) และเลือก “แก้ไขพฤติกรรม”", + "ar": "نقرة بزر الفأرة الأيمن على $(obstacle) وتحديد **تحرير السلوكيات**." } } } @@ -1432,7 +2513,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "See the **behaviors** of the **object** here." + "en": "See the **behaviors** of the **object** here.", + "fr": "Les **comportements** de **l'objet** se trouvent dans cet onglet.", + "es": "Aquí puedes ver los **comportamientos** del **objeto**.", + "pt": "Veja os **comportamentos** do **objeto** aqui.", + "th": "ดู **พฤติกรรม** ของ **วัตถุ** ที่นี่", + "ar": "رؤية **سلوكيات الكائن** هنا." } }, "placement": "bottom" @@ -1447,7 +2533,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Add a new behavior." + "messageByLocale": { + "en": "Add a new behavior.", + "fr": "Ajoutez un nouveau comportement.", + "es": "Agrega un nuevo comportamiento.", + "pt": "Adicione um novo comportamento.", + "th": "เพิ่มพฤติกรรมใหม่", + "ar": "إضافة سلوك جديد." + } } }, "isOnClosableDialog": true @@ -1459,7 +2552,14 @@ }, "tooltip": { "description": { - "messageByLocale": "Select the Physics behavior." + "messageByLocale": { + "en": "Select the Physics behavior.", + "fr": "Sélectionnez le comportement Moteur physique.", + "es": "Selecciona el comportamiento Física.", + "pt": "Selecione o comportamento Física.", + "th": "เลือกพฤติกรรมฟิสิกส์", + "ar": "تحديد سلوك الفيزياء." + } } }, "isOnClosableDialog": true @@ -1467,12 +2567,17 @@ { "elementToHighlightId": "#physics2-parameter-body-type", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Static" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select **static**." + "en": "Select **static**.", + "fr": "Choisissez l'option **Fixe**.", + "es": "Selecciona **estático**.", + "pt": "Selecione **estático**.", + "th": "เลือก **คงที่**", + "ar": "تحديد **ثابت**." } }, "placement": "top" @@ -1487,24 +2592,86 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're good." + "en": "We're good.", + "fr": "C'est bon.", + "es": "Está bien.", + "pt": "Está bom.", + "th": "เรียบร้อยแล้ว", + "ar": "نحن على الطريق الصحيح." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:obstacle", "nextStepTrigger": { - "instanceAddedOnScene": "obstacle" + "instanceAddedOnScene": "obstacle", + "instancesCount": 2 }, "tooltip": { "description": { "messageByLocale": { - "en": "Add a few $(obstacle) to the **scene** to protect $(target)." + "en": "Add a few $(obstacle) to the **scene** to protect $(target).", + "fr": "Ajoutez quelques $(obstacle) à la **scène** pour protéger $(target).", + "es": "Agrega algunos $(obstacle) a la **escena** para proteger a $(target).", + "pt": "Adicione alguns $(obstacle) à **cena** para proteger $(target).", + "th": "เพิ่ม $(obstacle) ปริมาณนิดหน่อยลงใน **scene** เพื่อป้องกัน $(target)", + "ar": "إضافة بضعة $(obstacle) إلى **المشهد** لحماية $(target)." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForWinning", "elementToHighlightId": "#add-new-object-button", @@ -1513,9 +2680,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Now let's create a winning message!" + "en": "Now let's create a winning message!", + "fr": "Maintenant, nous allons ajouter un message quand le joueur atteint la cible.", + "es": "¡Ahora creemos un mensaje de victoria!", + "pt": "Agora vamos criar uma mensagem de vitória!", + "th": "ทีนี้เราจะสร้างข้อความแสดงชัยชนะ!", + "ar": "الآن هيّا نقوم بإنشاء رسالة الفوز!" } } } @@ -1528,11 +2701,17 @@ "tooltip": { "description": { "messageByLocale": { - "en": "This time, we'll create a text from scratch." + "en": "This time, we'll create a text from scratch.", + "fr": "Cette fois-ci, nous allons créer un texte de zéro.", + "es": "Esta vez crearemos un texto desde cero.", + "pt": "Desta vez, vamos criar um texto do zero.", + "th": "คราวนี้ เราจะสร้างข้อความโดยทำขึ้นมาเอง", + "ar": "هذه المرة، سنقوم بإنشاء نص من الصفر." } }, "placement": "bottom" }, + "skippable": true, "isOnClosableDialog": true }, { @@ -1543,7 +2722,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select **Text** object" + "en": "Select **Text** object", + "fr": "Sélectionnez l'objet **Texte**", + "es": "Selecciona el objeto **Texto**", + "pt": "Selecione o objeto **Texto**", + "th": "เลือกวัตถุ **ข้อความ**", + "ar": "تحديد الكائن **نص**" } }, "placement": "bottom" @@ -1553,12 +2737,17 @@ { "elementToHighlightId": "#object-name", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "YouWin" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the object name to “**YouWin**”." + "en": "Change the object name to “**YouWin**”.", + "fr": "Utilisez “**YouWin**” comme nom d'objet.", + "es": "Cambia el nombre del objeto a “**YouWin**”.", + "pt": "Mude o nome do objeto para “**YouWin**”.", + "th": "แก้ไขชื่อของวัตถุเป็น “**YouWin**”", + "ar": "تغيير اسم الكائن إلى **YouWin**." } }, "placement": "bottom" @@ -1568,12 +2757,17 @@ { "elementToHighlightId": "#text-object-font-size", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "200" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the font size to **200**." + "en": "Change the font size to **200**.", + "fr": "Utilisez une taille de **200**.", + "es": "Cambia el tamaño de la fuente a **200**.", + "pt": "Mude o tamanho da fonte para **200**.", + "th": "แก้ไขขนาดฟอนต์เป็น **200**", + "ar": "تغيير حجم الخط إلى **200**." } }, "placement": "bottom" @@ -1588,7 +2782,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Change the text to “**You Win!**”" + "en": "Change the text to “**You Win!**”", + "fr": "Cet objet texte devra afficher “**Gagné !**”", + "es": "Cambia el texto a “**¡Ganaste!**”", + "pt": "Mude o texto para “**Você Venceu!**”", + "th": "แก้ไขข้อความเป็น “**คุณชนะ!**”", + "ar": "إدخال أي نص يدل على فوز اللاعبين\n\n(على سبيل المثال: **لقد فزت**)." } }, "placement": "bottom" @@ -1603,7 +2802,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "¡Terminamos!", + "pt": "Terminamos.", + "th": "เรียบร้อยแล้ว", + "ar": "انتهينا." } } }, @@ -1611,6 +2815,37 @@ "youWinText": "sceneLastObjectName:playScene" } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:youWinText", "nextStepTrigger": { @@ -1619,11 +2854,18 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(youWinText) into the **scene**, and center it as well as possible." + "en": "Drag $(youWinText) into the **scene**, and center it as well as possible.", + "fr": "Faites glisser $(youWinText) du menu au canvas et centrez le sur la scène.", + "es": "Arrastra $(youWinText) al **escenario** y centra el objeto lo mejor que puedas.", + "pt": "Arraste $(youWinText) para a **cena** e centralize-o o mais próximo possível.", + "th": "ลาก $(youWinText) ไปยัง **scene** และพยายามจัดตำแหน่งให้อยู่ตรงกลาง", + "ar": "سحب $(youWinText) داخل **المشهد**، وإدراجه في المنتصف قدر الإمكان." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "elementToHighlightId": "#toolbar-open-layers-panel-button", @@ -1633,7 +2875,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Layers** panel." + "en": "Open the **Layers** panel.", + "fr": "Ouvrez le panneau des **calques*.", + "es": "Abre el panel de **Capas**.", + "pt": "Abra o painel **Camadas**.", + "th": "เปิดแผงควบคุม **Layers**", + "ar": "فتح لوحة **الطبقات**." } }, "placement": "bottom" @@ -1648,7 +2895,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add a new layer." + "en": "Add a new layer.", + "fr": "Créez un nouveau calque.", + "es": "Añade una nueva capa.", + "pt": "Adicione uma nova camada.", + "th": "เพิ่มเลเยอร์ใหม่", + "ar": "إضافة طبقة جديدة." } }, "placement": "top" @@ -1657,12 +2909,17 @@ { "elementToHighlightId": "#layer-1 #layer-name", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "WinLayer" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the name to **WinLayer**." + "en": "Change the name to **WinLayer**.", + "fr": "Utlisez le nom **WinLayer**.", + "es": "Cambia el nombre a **WinLayer**.", + "pt": "Mude o nome para **WinLayer**.", + "th": "เปลี่ยนชื่อเป็น **WinLayer**", + "ar": "تغيير الاسم إلى **WinLayer**." } }, "placement": "top" @@ -1676,7 +2933,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Hide the **layer**." + "en": "Hide the **layer**.", + "fr": "Cachez le **calque**.", + "es": "Oculta la **capa**.", + "pt": "Esconda a **camada**.", + "th": "ซ่อน *เลเยอร์*", + "ar": "إخفاء **الطبقة**." } }, "placement": "top" @@ -1686,14 +2948,24 @@ "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "Terminé", + "pt": "Terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, "tooltip": { "description": { "messageByLocale": { - "en": "Now select the $(youWinText) **instance** on the **scene** and change its **layer** using the **properties panel**.\n\nIt should have disappeared!" + "en": "Now select the $(youWinText) **instance** on the **scene** and change its **layer** using the **properties panel**.\n\nIt should have disappeared!", + "fr": "Sélectionnez l'instance de $(youWinText) sur la **scène** et changez son **calque** en utilisant le **panneau des propriétés**.\n\nIl devrait maintenant être caché.", + "es": "Ahora selecciona la **instancia** de $(youWinText) en la **escena** y cambia su **capa** usando el **panel de propiedades**.\n\n¡Debería haber desaparecido!", + "pt": "Agora selecione a **instância** de $(youWinText) na **cena** e altere sua **camada** usando o **painel de propriedades**.\n\nEle deve ter desaparecido!", + "th": "ทีนี้เลือก $(youWinText) **instance** บน **scence** และเปลี่ยน **เลเยอร์** โดยใช้ **แผงควบคุมคุณสมบัติ**\n\nมันควรจะหายไป!", + "ar": "الآن تحديد **المثيل** $(youWinText) **بالمشهد** وتغيير طبقته باستخدام **لوحة الخصائص**.\n\nمن المفترض أن يختفي!" } }, "standalone": true @@ -1707,7 +2979,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We are now going to add some logic to our game." + "en": "We are now going to add some logic to our game.", + "fr": "Nous allons maintenant ajouter de la logique à notre jeu.", + "es": "Ahora vamos a añadir lógica a nuestro juego.", + "pt": "Agora vamos adicionar lógica ao nosso jogo.", + "th": "เราจะเพิ่มโลจิกบางอย่างเข้าไปในเกม", + "ar": "سوف نقوم الآن بإضافة بعض المنطق إلى لعبتنا." } } } @@ -1721,7 +2998,12 @@ "tooltip": { "title": { "messageByLocale": { - "en": "Let's add our first **Event**!" + "en": "Let's add our first **Event**!", + "fr": "Créons notre premier **évènement** !", + "es": "¡Añadamos nuestro primer **evento**!", + "pt": "Vamos adicionar nosso primeiro **evento**!", + "th": "มาเพิ่ม **อีเวนท์** แรกกันเถอะ!", + "ar": "هيّا نقوم بإضافة أول **حدث** لنا!" } } } @@ -1734,7 +3016,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add a **condition**." + "en": "Add a **condition**.", + "fr": "Créez une **condition**.", + "es": "Añade una **condición**.", + "pt": "Adicione uma **condição**.", + "th": "เพิ่ม **เงื่อนไข**", + "ar": "إضافة **شرط**." } } } @@ -1747,7 +3034,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(projectile)." + "en": "Select $(projectile).", + "fr": "Cliquez sur $(projectile).", + "es": "Selecciona $(projectile).", + "pt": "Selecione $(projectile).", + "th": "เลือก $(projectile)", + "ar": "تحديد $(projectile)." } } }, @@ -1761,7 +3053,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the collision condition." + "en": "Select the collision condition.", + "fr": "Cliquez sur la condition collision.", + "es": "Selecciona la condición de colisión.", + "pt": "Selecione a condição de colisão.", + "th": "เลือกเงื่อนไขการชนกัน", + "ar": "تحديد شرط التصادم." } } }, @@ -1775,7 +3072,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(target)." + "en": "Select $(target).", + "fr": "Cliquez sur $(target).", + "es": "Selecciona $(target).", + "pt": "Selecione $(target).", + "th": "เลือก $(target)", + "ar": "تحديد $(target)." } }, "placement": "top" @@ -1790,7 +3092,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **condition** is all set." + "en": "Alright, the **condition** is all set.", + "fr": "La condition est maintenant configurée.", + "es": "La condición está configurada.", + "pt": "A condição está configurada.", + "th": "เอาล่ะ **เงื่อนไข** ได้ถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط **شرط** تمامًا." } }, "placement": "top" @@ -1804,7 +3111,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's add an **action** now." + "en": "Let's add an **action** now.", + "fr": "Créez une **action** maintenant.", + "es": "Añade una **acción** ahora.", + "pt": "Adicione uma **ação** agora.", + "th": "เพิ่ม **การกระทำ**", + "ar": "هيّا نقوم بإضافة **إجراء** الآن." } } } @@ -1817,7 +3129,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(target)." + "en": "Select $(target).", + "fr": "Cliquez sur $(target).", + "es": "Selecciona $(target).", + "pt": "Selecione $(target).", + "th": "เลือก $(target)", + "ar": "تحديد $(target)." } } }, @@ -1831,7 +3148,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We will make $(target) disappear on collision." + "en": "We will make $(target) disappear on collision.", + "fr": "Nous allons faire disparaître $(target) au moment de la collision.", + "es": "Haremos que $(target) desaparezca en la colisión.", + "pt": "Vamos fazer com que $(target) desapareça na colisão.", + "th": "เราจะทำให้ $(target) หายไปหลังจากชน", + "ar": "سوف نجعل $(target) يختفي مع التصادم." } } }, @@ -1845,7 +3167,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, $(target) will now disappear when $(projectile) hits it." + "en": "Alright, $(target) will now disappear when $(projectile) hits it.", + "fr": "Parfait, $(target) va disparaître quand un $(projectile) l'atteindra.", + "es": "Perfecto, $(target) desaparecerá cuando $(projectile) lo golpee.", + "pt": "Ótimo, $(target) desaparecerá quando $(projectile) o atingir.", + "th": "เอาล่ะ ทีนี้ $(target) จะหายไปเมื่อถูก $(projectile) ชน", + "ar": "حسنًا، الآن سوف يختفي $(target) وقتما يضربه $(projectile)." } }, "placement": "top" @@ -1859,7 +3186,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's add another **action** that will be executed for the same **condition**." + "en": "Let's add another **action** that will be executed for the same **condition**.", + "fr": "Créons une autre **action** qui sera exécutée pour la même **condition**.", + "es": "Añade otra **acción** que se ejecutará para la misma **condición**.", + "pt": "Adicione outra **ação** que será executada para a mesma **condição**.", + "th": "สร้าง **การกระทำ** เพิ่มอีก ซึ่งจะใช้ในกรณี **เงื่อนไข** เดียวกัน", + "ar": "هيّا نقوم بإضافة **إجراء** آخر حيث سيتم تنفيذه بواسطة نفس **الشرط**." } } } @@ -1872,7 +3204,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Search for “layer”." + "en": "Search for “layer”.", + "fr": "Cherchez “calque”.", + "es": "Busca “capa”.", + "pt": "Procure por “camada”.", + "th": "ค้นหา “layer”", + "ar": "البحث عن **طبقة**." } } }, @@ -1886,7 +3223,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the **Show a layer** action." + "en": "Select the **Show a layer** action.", + "fr": "Cliquez sur l'action **Afficher un calque**.", + "es": "Selecciona la **acción Mostrar una capa**.", + "pt": "Selecione a **ação Mostrar uma camada**.", + "th": "เลือกการกระทำ **แสดงเลเยอร์**", + "ar": "تحديد الإجراء **إظهار طبقة**." } } }, @@ -1900,7 +3242,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the **layer** you created." + "en": "Select the **layer** you created.", + "fr": "Sélectionnez le **calque** que vous avez créé.", + "es": "Selecciona la **capa** que has creado.", + "pt": "Selecione a **camada** que você criou.", + "th": "เลือก **เลเยอร์** ที่คุณสร้าง", + "ar": "تحديد **الطبقة** التي قمت بإنشائها." } }, "placement": "top" @@ -1915,7 +3262,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, now the title should appear when the player hits $(target) with $(projectile)." + "en": "Alright, now the title should appear when the player hits $(target) with $(projectile).", + "fr": "Maintenant, le titre de victoire devrait apparaître quand le joueur touche $(target) avec $(projectile).", + "es": "Ahora, el título de victoria debería aparecer cuando el jugador golpee a $(target) con $(projectile).", + "pt": "Agora, o título de vitória deve aparecer quando o jogador atingir $(target) com $(projectile).", + "th": "เอาล่ะ ทีนี้ข้อความควรจะปรากฎเมื่อผู้เล่นโยน $(projectile) ชน $(target)", + "ar": "حسنًا، من المفترض أن يظهر العنوان عندما يقوم اللاعبون بضرب $(target) بواسطة $(projectile)." } }, "placement": "top" @@ -1929,11 +3281,36 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's get back to the **scene** to create some constraints for the player." + "en": "Let's get back to the **scene** to create some constraints for the player.", + "fr": "Retournons à la **scène** pour ajouter des contraintes au joueur ou à la joueuse.", + "es": "Volvamos a la **escena** para crear algunas restricciones para el jugador.", + "pt": "Vamos voltar para a **cena** para criar algumas restrições para o jogador.", + "th": "กลับไปยัง **scene** เพื่อสร้างขีดจำกัดให้ผู้เล่น ", + "ar": "هيّا نعود إلى **المشهد** لفرض بعض القيود على اللاعبين." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "SwitchToScene1", "elementToHighlightId": "#add-new-object-button", @@ -1944,7 +3321,12 @@ "placement": "left", "description": { "messageByLocale": { - "en": "We'll define an area where the player can grab $(projectile). Outside of this area, the $(projectile)s will be free." + "en": "We'll define an area where the player can grab $(projectile). Outside of this area, the $(projectile)s will be free.", + "fr": "Nous allons définir une zone où le joueur ou la joueuse peut attraper les $(projectile)s. En dehors de cette zone, les $(projectile)s seront en mouvement libre.", + "es": "Definiremos un área donde el jugador pueda coger $(projectile)s. Fuera de esta área, los $(projectile)s serán libres.", + "pt": "Vamos definir uma área onde o jogador pode pegar $(projectile)s. Fora desta área, os $(projectile)s serão livres.", + "th": "เราจะกำหนดพื้นที่ที่ผู้เล่นจะสามารถจับ $(projectile) นอกเหนือจากพื้นที่ดังกล่าวนั้น $(projectile) จะเป็นอิสระ", + "ar": "سوف نقوم بتحديد المنطقة التي يمكن للاعبين الإمساك بكل الـ $(projectile). وخارج تلك المنطقة، ستكون كل الـ $(projectile) حرة." } } } @@ -1957,7 +3339,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's choose an **object** from the asset store" + "en": "Let's choose an object from the asset store", + "fr": "Nous allons choisir un objet dans le **magasin de ressources**.", + "es": "Vamos a elegir un objeto de la tienda de recursos.", + "pt": "Vamos escolher um objeto da loja de recursos.", + "th": "เลือกวัตถุจากร้านค้า asset", + "ar": "هيّا نقوم باختيار كائن من متجر العناصر" } }, "placement": "bottom" @@ -1973,7 +3360,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Type “**background**”." + "en": "Type “**background**”.", + "fr": "Cherchez “**background**”.", + "es": "Escribe “**background**”.", + "pt": "Digite “**background**”.", + "th": "พิมพ์ “**background**”", + "ar": "كتابة **background**." } } }, @@ -1981,7 +3373,7 @@ { "stepId": "CloseAssetStoreForGrabArea", "trigger": { - "presenceOfElement": "#object-item-7" + "objectAddedInLayout": true } } ], @@ -1998,7 +3390,7 @@ "elementToHighlightId": "#add-asset-button", "isTriggerFlickering": true, "nextStepTrigger": { - "presenceOfElement": "#object-item-7" + "objectAddedInLayout": true }, "mapProjectData": { "grabArea": "sceneLastObjectName:playScene" @@ -2014,11 +3406,47 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's use it now!" + "en": "Let's use it now!", + "fr": "Mettons la zone en place.", + "es": "¡Vamos a usarla ahora!", + "pt": "Vamos usá-la agora!", + "th": "เอาไปใช้เลย!", + "ar": "لنستخدم هذا الآن!" } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:grabArea", "nextStepTrigger": { @@ -2027,17 +3455,29 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(grabArea) from the menu to the canvas." + "en": "Drag $(grabArea) from the menu to the canvas.", + "fr": "Faites glisser $(grabArea) du menu à au canvas.", + "es": "Arrastra $(grabArea) desde el menú al lienzo.", + "pt": "Arraste $(grabArea) do menu para o canvas.", + "th": "ลาก $(grabArea) จากเมนูไปยังแคนวาส", + "ar": "سحب $(grabArea) من القائمة إلى اللوحة." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "He terminado", + "pt": "Eu terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, @@ -2045,26 +3485,39 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Drag and resize $(grabArea) until it covers the lower left side of the game screen." + "en": "Drag and resize $(grabArea) until it covers the lower left side of the game screen.", + "fr": "Placez et redimensionnez $(grabArea) de telle sorte à ce qu'il couvre le coin en bas à gauche de l'écran de jeu.", + "es": "Arrastra y redimensiona $(grabArea) hasta que cubra la parte inferior izquierda de la pantalla del juego.", + "pt": "Arraste e redimensione $(grabArea) até que ele cubra a parte inferior esquerda da tela do jogo.", + "th": "ลากและปรับขนาด $(grabArea) จนมันครอบคลุมบริเวณซ้ายล่างในหน้าจอเกมของคุณ", + "ar": "سحب وإعادة تحجيم $(grabArea) حتى يغطي أسفل الجانب الأيسر من شاشة اللعبة." } }, "image": { "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Mi45MzEgMzAuMDE2IDE0MC4yNzkgOTUuMTY4IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjMuMDcxIiB5MT0iMzAuMDE2IiB4Mj0iMTIzLjA3MSIgeTI9IjEyNS4xODQiIGlkPSJncmFkaWVudC0wIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTYyNTc4LCAwLCAwLCAwLjk2MjU3OCwgNC42MDU1NTksIDEuMTIzMjU4KSIgc3ByZWFkTWV0aG9kPSJwYWQiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMCwgMjA4LCAyNTUpOyIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMTY0LCAyMzcsIDI1NSk7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB4PSI1Mi45MzEiIHk9IjMwLjAxNiIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAycHg7IGZpbGw6IHVybCgjZ3JhZGllbnQtMCk7IGZpbGwtb3BhY2l0eTogMTsgZmlsbC1ydWxlOiBub256ZXJvOyIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiByZ2IoMTY1LCAxNTgsIDg1KTsiIGQ9Ik0gNTIuNzY3IDEyNS4xNjkgTCA1Mi44MSAxMTIuNDMgTCAxMTQuNjM3IDExMC44NDggTCAxNDYuNDIgOTEuNDUgTCAxNTguOTU5IDgxLjkyNCBMIDE2Ny41MTUgNzEuMTg0IEwgMTc3Ljc4OCA2MS40MTEgTCAxODMuMzYgNTYuNjU4IEwgMTkzLjI3OSA2NS42OTcgTCAxOTMuMTg2IDEyNS4yOTMgTCA1Mi43NjcgMTI1LjE2OSBaIi8+CiAgPHJlY3QgeD0iNTUuMDIzIiB5PSIzMi4yMDUiIHdpZHRoPSIxMzYuMTkiIGhlaWdodD0iMTIuODA3IiBzdHlsZT0iZmlsbDogcmdiKDU0LCAyMjAsIDM5KTsgb3BhY2l0eTogMC40MzsiLz4KICA8cmVjdCB4PSI1NS4wMTQiIHk9IjQ2LjI3MyIgd2lkdGg9IjEyLjg1OCIgaGVpZ2h0PSI2Mi4zMzYiIHN0eWxlPSJmaWxsOiByZ2IoNTQsIDIyMCwgMzkpOyBvcGFjaXR5OiAwLjQzOyIvPgogIDxwb2x5Z29uIHN0eWxlPSJmaWxsOiByZ2IoNywgMTE1LCAzMCk7IiBwb2ludHM9IjcyLjYxIDEwOS44MDggODUuNTc2IDEwMS44MyA3NC4xNDEgMTAxLjAxNSA4NC44NTIgOTAuNTIgNzcuMjUgODkuNjY3IDg2LjY5NCA4MS42MzcgODEuNjI5IDgwLjkxOCA5MC40MzcgNjcuOTI1IDk1LjcyNiA4MS41NzIgOTEuNTA2IDgxLjg1IDk3LjAzMSA5MS45MDggOTIuMTY0IDkxLjY2OCAxMDAuNTc4IDEwMS44NTQgOTMuMjM2IDEwMS41NTQgMTA1LjUxOCAxMTMuNDk2Ii8+CiAgPHBvbHlnb24gc3R5bGU9ImZpbGw6IHJnYig3LCAxMTUsIDMwKTsiIHBvaW50cz0iOTYuMTUzIDc1LjYwNyAxMDcuMzM5IDgzLjc5NyA5Ny42NjkgODQuNSAxMDYuODI5IDkzLjE1MyAxMDAuNjAxIDkzLjM2OSAxMDcuMTg5IDEwMC43MDcgMTA0LjA3IDEwMC45NzUgMTEwLjU4NyAxMTIuNzY1IDExNy4yODggOTkuNTY0IDExMy42MDMgMTAwLjI2IDExNy41MzUgOTEuMzk3IDExMi45MTIgOTMuMTc0IDExOS43NzEgODQuNzE5IDExMy44MTcgODQuMDM1IDEyMS4xNzEgNzQuMzE3IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSwgMCwgMCwgLTEsIDIyMC41NzgwMDMsIDE4Ni43NzgpIi8+CiAgPHJlY3QgeD0iNTUuMDIzIiB5PSIxMDkuOTY3IiB3aWR0aD0iMTM2LjE5IiBoZWlnaHQ9IjEyLjgwNyIgc3R5bGU9ImZpbGw6IHJnYig1NCwgMjIwLCAzOSk7IG9wYWNpdHk6IDAuNDM7Ii8+CiAgPHBhdGggc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiIGQ9Ik0gMTc1LjIyNiA3OS42MTMgTCAxNjIuODQ2IDc2LjkyOCBMIDE2Ny41MTUgNzEuMTg0IEwgMTc3Ljc4OCA2MS40MTEgTCAxODMuMzYgNTYuNjU4IEwgMTkzLjI3OSA2NS42OTcgTCAxOTMuMTg2IDc2LjMzOSBaIi8+CiAgPHJlY3QgeD0iMTc4LjIyNCIgeT0iNDYuMjEzIiB3aWR0aD0iMTIuODU4IiBoZWlnaHQ9IjYyLjMzNiIgc3R5bGU9ImZpbGw6IHJnYig1NCwgMjIwLCAzOSk7IG9wYWNpdHk6IDAuNDM7Ii8+CiAgPHJlY3QgeD0iNTIuOTUiIHk9IjI5Ljk4NCIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IG5vbmU7IHN0cm9rZS13aWR0aDogMnB4OyIvPgogIDxyZWN0IHg9IjY4Ljc5IiB5PSI3OC43MSIgd2lkdGg9IjQ4LjI3IiBoZWlnaHQ9IjMwLjc1NSIgc3R5bGU9ImZpbGw6IHJnYmEoMjU1LCA1NiwgMjQ1LCAwLjg2KTsiLz4KPC9zdmc+" } - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "elementToHighlightId": "#instance-properties-editor [id=\"Z Order\"]", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "0" }, "tooltip": { "description": { "messageByLocale": { - "en": "Make sure that $(background) is selected and change this value to **0**." + "en": "Make sure that $(grabArea) is selected and change this value to **0**.", + "fr": "Sélectionnez l'instance de $(grabArea) et définissez sa position sur l'axe z à **0**.", + "es": "Asegúrate de que $(grabArea) está seleccionado y cambia este valor a **0**.", + "pt": "Certifique-se de que $(grabArea) está selecionado e mude este valor para **0**.", + "th": "ดูให้แน่ใจว่า $(grabArea) ถูกเลือกอยู่ และปรับค่านี้เป็น **0**", + "ar": "التحقق أنه تم تحديد $(grabArea) مع تغيير قيمته إلى **0**." } }, - "placement": "right" + "placement": "right", + "mobilePlacement": "top" } }, { @@ -2075,7 +3528,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's deactivate the draggable **behavior** when outside of the $(grabArea)." + "en": "Let's deactivate the draggable **behavior** of $(projectile) when outside of the $(grabArea).", + "fr": "Maintenant, désactivons le **comportement** “draggable” quand les $(projectile)s sont en dehors de la zone $(grabArea).", + "es": "Ahora, desactivemos el **comportamiento** “draggable” cuando los $(projectile)s estén fuera de la zona $(grabArea).", + "pt": "Agora, desative o **comportamento** “draggable” quando os $(projectile)s estiverem fora da área $(grabArea).", + "th": "ปิดฟังก์ชันในการสามารถถูกลาก **พฤติกรรม** ของ $(projectile) เมื่ออยู่ภายนอก $(grabArea)", + "ar": "هيّا نقوم بإلغاء تفعيل السلوك (Draggable) الخاص بكل الـ $(projectile) عندما يكون خارج الـ $(grabArea)." } } } @@ -2090,7 +3548,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's create a new event!" + "en": "Let's create a new event!", + "fr": "Créez un nouvel évènement.", + "es": "¡Creemos un nuevo evento!", + "pt": "Vamos criar um novo evento!", + "th": "สร้างอีเวนท์ใหม่กันเถอะ!", + "ar": "هيّا نقوم بإنشاء حدث جديد!" } } } @@ -2103,7 +3566,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add a **condition**." + "en": "Add a **condition**.", + "fr": "Ajoutez une **condition**.", + "es": "Agrega una **condición**.", + "pt": "Adicione uma **condição**.", + "th": "เพิ่ม **เงื่อนไข**", + "ar": "إضافة **شرط**." } } } @@ -2116,7 +3584,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(projectile)." + "en": "Select $(projectile).", + "fr": "Cliquez sur $(projectile).", + "es": "Selecciona $(projectile).", + "pt": "Selecione $(projectile).", + "th": "เลือก $(projectile)", + "ar": "تحديد $(projectile)." } } }, @@ -2130,7 +3603,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the collision condition." + "en": "Select the collision condition.", + "fr": "Cliquez sur la condition collision.", + "es": "Selecciona la condición de colisión.", + "pt": "Selecione a condição de colisão.", + "th": "เลือกเงื่อนไขการชนกัน", + "ar": "تحديد شرط التصادم." } } }, @@ -2144,7 +3622,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(grabArea)." + "en": "Select $(grabArea).", + "fr": "Cliquez sur $(grabArea).", + "es": "Selecciona $(grabArea).", + "pt": "Selecione $(grabArea).", + "th": "เลือก $(grabArea)", + "ar": "تحديد $(grabArea)." } }, "placement": "top" @@ -2159,7 +3642,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **condition** is all set." + "en": "Alright, the **condition** is all set.", + "fr": "La **condition** est maintenant prête.", + "es": "¡La **condición** está lista!", + "pt": "A **condição** está pronta!", + "th": "เอาล่ะ เงื่อนไขถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط **الشرط** تمامًا." } }, "placement": "top" @@ -2173,7 +3661,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Right click on this newly created **condition** and select “Invert condition”." + "en": "Right click on this newly created **condition** and select “Invert condition”.", + "fr": "Faites un clic droit sur la nouvelle **condition** et sélectionnez “Inverser une condition”.", + "es": "Haz clic derecho en la nueva **condición** y selecciona “Invertir condición”.", + "pt": "Clique com o botão direito na nova **condição** e selecione “Inverter condição”.", + "th": "คลิกขวาที่ **เงื่อนไข** ที่เพิ่งสร้างขึ้นมาและเลือก “เงื่อนไขแบบตรงกันข้าม”", + "ar": "نقرة بزر الفأرة الأيمن على هذا **الشرط** الذي أنشأناه للتو وتحديد **عكس الشرط**." } }, "placement": "right" @@ -2187,7 +3680,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add an action" + "en": "Add an action.", + "fr": "Ajoutez une action.", + "es": "Agrega una acción.", + "pt": "Adicione uma ação.", + "th": "เพิ่มการกระทำ", + "ar": "إضافة إجراء." } } } @@ -2200,7 +3698,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(projectile)." + "en": "Select $(projectile).", + "fr": "Cliquez sur $(projectile).", + "es": "Selecciona $(projectile).", + "pt": "Selecione $(projectile).", + "th": "เลือก $(projectile)", + "ar": "تحديد $(projectile)." } } }, @@ -2214,7 +3717,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the **action** that releases the $(projectile) from the player drag." + "en": "Select the **action** that releases the $(projectile) from the player drag.", + "fr": "Sélectionnez **l'action** qui libère le $(projectile) de la souris du joueur ou de la joueuse.", + "es": "Selecciona la **acción** que libera el $(projectile) del arrastre del jugador.", + "pt": "Selecione a **ação** que libera o $(projectile) do arrasto do jogador.", + "th": "เลือก **การกระทำ** ที่ปล่อย $(projectile) จากการถูกผู้เล่นจับลาก", + "ar": "تحديد **الإجراء** الذي يحرر الـ $(projectile) من تحكم اللاعبين." } } }, @@ -2228,7 +3736,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're good." + "en": "We're good.", + "fr": "C'est bon.", + "es": "¡Está bien!", + "pt": "Está bom.", + "th": "มาถูกทางแล้ว", + "ar": "نحن على الطريق الصحيح." } }, "placement": "top" @@ -2242,7 +3755,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's get back to the **scene** to place the $(projectile)s correctly." + "en": "Let's get back to the **scene** to place the $(projectile)s correctly.", + "fr": "Revenons à la **scène** pour placer les $(projectile)s correctement.", + "es": "Volvamos a la **escena** para colocar los $(projectile)s correctamente.", + "pt": "Vamos voltar para a **cena** para colocar os $(projectile)s corretamente.", + "th": "กลับไปยัง **scene** เพื่อวาง $(projectile) ให้ถูกต้อง", + "ar": "هيّا نعود إلى **المشهد** لإدراج كل الـ $(projectile) بشكل صحيح." } } } @@ -2252,7 +3770,12 @@ "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "Ya terminé", + "pt": "Terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, @@ -2261,21 +3784,38 @@ "placement": "top", "title": { "messageByLocale": { - "en": "Rearrange $(projectile)s." + "en": "Rearrange the $(projectile)s.", + "fr": "Repositionnez les $(projectile)s.", + "es": "Reordena los $(projectile)s.", + "pt": "Reorganize os $(projectile)s.", + "th": "จัดระเบียบ $(projectile)", + "ar": "إعادة ترتيب كل الـ $(projectile)." } }, "description": { "messageByLocale": { - "en": "Drag all **instances** of $(projectile) within the boundaries of $(background)." + "en": "Drag all **instances** of $(projectile) within the boundaries of $(background).", + "fr": "Faites glisser les **instances** de $(projectile) à l'intérieur de $(background).", + "es": "Arrastra todas las **instancias** de $(projectile) dentro de los límites de $(background).", + "pt": "Arraste todas as **instâncias** de $(projectile) dentro dos limites de $(background).", + "th": "ลาก **instances** ของ $(projectile) ภายในขอบเขต $(background)", + "ar": "سحب كل **مثيلات** الـ $(projectile) داخل حدود الـ $(background)." } } - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "Ya terminé", + "pt": "Terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, @@ -2284,12 +3824,22 @@ "placement": "top", "title": { "messageByLocale": { - "en": "Set up $(target) protection." + "en": "Set up $(target) protection.", + "fr": "Créez une protection pour $(target).", + "es": "Configura la protección de $(target).", + "pt": "Configure a proteção de $(target).", + "th": "ตั้งที่ป้องกัน $(target)", + "ar": "إعداد حماية $(target)." } }, "description": { "messageByLocale": { - "en": "Arrange both $(block) and $(obstacle) in a way to protect $(target)." + "en": "Arrange both $(block) and $(obstacle) in a way to protect $(target).", + "fr": "Positionnez les instances de $(block) et de $(obstacle) de manière à protéger $(target).", + "es": "Coloca las instancias de $(block) y $(obstacle) de manera que protejan a $(target).", + "pt": "Coloque as instâncias de $(block) e $(obstacle) de forma a proteger $(target).", + "th": "จัดวาง $(block) และ $(obstacle) โดยมีเป้าหมายเพื่อปกป้อง $(target)", + "ar": "ترتيب كلًا من الـ $(block) والـ $(obstacle) بحيث تحمي $(target)." } } } @@ -2302,7 +3852,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "**Preview** the game and make sure it's winnable." + "en": "**Preview** the game and make sure it's winnable.", + "fr": "Lancez un **Aperçu** du jeu et assurez-vous qu'il est possible de toucher $(target).", + "es": "**Previsualiza** el juego y asegúrate de que es posible ganar.", + "pt": "**Pré-visualize** o jogo e certifique-se de que é possível ganhar.", + "th": "ลองเล่น **ดูตัวอย่าง** เพื่อให้มั่นใจว่าสามารถเล่นเกมชนะได้", + "ar": "**معاينة** اللعبة والتحقق أنها قابلة للفوز فيها." } }, "placement": "bottom" @@ -2316,12 +3871,73 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Once you're ready, we'll generate a link to share it." + "en": "Once you're ready, we'll generate a link to share your game.", + "fr": "Une fois que c'est bon, nous allons générer un lien pour partager votre jeu.", + "es": "Una vez que estés listo, generaremos un enlace para compartir tu juego.", + "pt": "Quando estiver pronto, criaremos um link para compartilhar o seu jogo.", + "th": "เมื่อพร้อมแล้ว เราจะสร้างลิงค์สำหรับแชร์เกม", + "ar": "بمجرد الاستعداد، سوف نقوم بإنشاء رابط لمشاركة لعبتك." } }, "placement": "bottom" } }, + { + "elementToHighlightId": "#publish-tab", + "nextStepTrigger": { + "presenceOfElement": "#publish-gd-games" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's head to the publish section.", + "fr": "Allons dans la section publier.", + "es": "Vamos a la sección de publicación.", + "pt": "Vamos para a seção de publicação.", + "th": "ไปที่ส่วนการเผยแพร่", + "ar": "هيّا نتوجه إلى قسم النشر." + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#publish-gd-games", + "nextStepTrigger": { + "presenceOfElement": "#export-dialog #create-account-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will publish this game to gd.games, GDevelop's gaming platform.", + "fr": "Nous allons publier ce jeu sur gd.games, la plateforme de jeux de GDevelop.", + "es": "Publicaremos este juego en gd.games, la plataforma de juegos de GDevelop.", + "pt": "Vamos publicar este jogo no gd.games, a plataforma de jogos do GDevelop.", + "th": "เราจะเผยแพร่เกมนี้ไปยัง gd.games แพลตฟอร์มเกมของ GDevelop", + "ar": "سوف نقوم بنشر هذه اللعبة على gd.games، منصة ألعاب GDevelop." + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true, + "shortcuts": [ + { + "stepId": "ClickOnGenerateLink", + "trigger": { + "presenceOfElement": "[id$=online-web-button][id^=launch-export]" + } + }, + { + "stepId": "Login", + "trigger": { + "presenceOfElement": "#login-dialog" + } + } + ] + }, { "elementToHighlightId": "#export-dialog #create-account-button", "nextStepTrigger": { @@ -2330,7 +3946,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "First, you need to create an account." + "en": "First, you need to create an account.", + "fr": "Tout d'abord, vous devez vous créer un compte.", + "es": "Primero, debes crear una cuenta.", + "pt": "Primeiro, você precisa criar uma conta.", + "th": "ก่อนอื่น คุณจะต้องมีบัญชี", + "ar": "أولًا، نحتاج إلى إنشاء حساب." } }, "placement": "bottom" @@ -2359,7 +3980,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Fill in the form and then click here." + "en": "Fill in the form and then click here.", + "fr": "Remplissez le formulaire et cliquez ici.", + "es": "Rellena el formulario y luego haz clic aquí.", + "pt": "Preencha o formulário e clique aqui.", + "th": "กรอกฟอร์มแล้วกดตรงนี้", + "ar": "ملء النموذج وثم النقر هنا." } }, "placement": "bottom" @@ -2375,7 +4001,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "After filling your info, click here." + "en": "After filling your info, click here.", + "fr": "Après avoir rempli le formulaire, cliquez ici.", + "es": "Después de rellenar el formulario, haz clic aquí.", + "pt": "Depois de preencher o formulário, clique aqui.", + "th": "หลังจากกรอกข้อมูลของคุณแล้ว กดตรงนี้", + "ar": "بعد كتابة معلوماتك، النقر هنا." } }, "placement": "bottom" @@ -2386,12 +4017,17 @@ "id": "ClickOnGenerateLink", "elementToHighlightId": "[id$=online-web-button][id^=launch-export]", "nextStepTrigger": { - "presenceOfElement": "[id$=online-web-button][id^=launch-export][disabled]" + "presenceOfElement": "#open-online-export-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Click here to **publish** your game." + "en": "Click here to **publish** your game.", + "fr": "Cliquez ici pour **publier** votre jeu.", + "es": "Haz clic aquí para **publicar** tu juego.", + "pt": "Clique aqui para **publicar** o seu jogo.", + "th": "กดที่นี่เพื่อ **เผยแพร่** เกมของคุณ", + "ar": "النقر هنا ل**نشر** لعبتك." } }, "placement": "bottom" @@ -2412,7 +4048,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Click here to open your game in your browser. Remember to share the link so that others can play your game!\n\nOnce you're done, close this dialog." + "en": "Click here to open your game in your browser. Remember to share the link so that others can play your game!\n\nOnce you're done, close this dialog.", + "fr": "Cliquez ici pour ouvrir votre jeu dans votre navigateur. Pensez à partager le lien pour que d'autres puissent y jouer!\n\nUne fois que vous avez terminé, fermez cette fenêtre.", + "es": "Haz clic aquí para abrir tu juego en tu navegador. ¡Recuerda compartir el enlace para que otros puedan jugar tu juego!\n\nUna vez que hayas terminado, cierra esta ventana.", + "pt": "Clique aqui para abrir o seu jogo no seu navegador. Lembre-se de compartilhar o link para que outros possam jogar o seu jogo!\n\nUma vez que você terminar, feche esta janela.", + "th": "คลิกที่นี่เพื่อเปิดเกมของคุณบนเบราวเซอร์ อย่าลืมแชร์ลิงค์เพื่อให้ผู้เล่นคนอื่นสามารถเล่นเกมของคุณได้!\n\nหลังจากเสร็จแล้ว ปิดหน้าต่างนี้", + "ar": "النقر هنا لفتح لعبتك على متصفحك، يمكنك مشاركة الرابط حتى يتنسى للآخرين إمكانية لعب لعبتك!\n\nيمكنك الإغلاق بمجرد الانتهاء." } }, "placement": "top" @@ -2425,41 +4066,92 @@ "content": [ { "messageByLocale": { - "en": "## Congratulations!" - } - }, - { - "messageByLocale": { - "en": "You have finished the second part of your Fling Game." + "en": "## Congratulations!", + "fr": "## Félicitations !", + "es": "## ¡Felicidades!", + "pt": "## Parabéns!", + "th": "## ยินดีด้วย!", + "ar": "## تهانينا!" } }, { "messageByLocale": { - "en": "Use your recent discoveries to tweak your game:\n- [Events](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [Text objects](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [Layers](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [Actions and Conditions](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)" + "en": "You have finished the second part of your Fling Game.", + "fr": "Vous avez terminé la seconde partie de votre jeu.", + "es": "Has terminado la segunda parte de tu juego.", + "pt": "Você terminou a segunda parte do seu jogo.", + "th": "ส่วนแรกของเกม Fling ของคุณเสร็จแล้ว", + "ar": "لقد انهيت الجزء الثاني من لعبة القذف." } }, { "messageByLocale": { - "en": "You can use the “Publish” button to update your game on Liluo.io once you're done!" + "en": "You've discovered other basics of GDevelop:\n- [Events](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [Text objects](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [Layers](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [Actions and Conditions](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)", + "fr": "Vous avez découvert de nouveaux concepts de GDevelop:\n- [les évènements](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [les objets texte](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [les calques](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [les actions et les conditions](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)", + "es": "Has descubierto otros conceptos básicos de GDevelop:\n- [Eventos](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [Objetos de texto](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [Capas](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [Acciones y condiciones](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)", + "pt": "Você descobriu outros conceitos básicos do GDevelop:\n- [Eventos](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [Objetos de texto](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [Camadas](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [Ações e Condições](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)", + "th": "คุณได้เรียนรู้พื้นฐานของ GDevelop:\n- [Events](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [Text objects](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [Layers](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [Actions and Conditions](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)", + "ar": "لقد اكتشفت المزيد من أساسيات GDevelop:\n- [أحداث](https://wiki.gdevelop.io/gdevelop5/events#:~:text=In%20GDevelop%2C%20events%20define%20the,events%20via%20the%20Events%20editor)\n- [كائنات نصية](https://wiki.gdevelop.io/gdevelop5/objects/text#:~:text=Text%20objects%20display%20text%20on,properties%20during%20gameplay%20using%20events)\n- [طبقات](https://wiki.gdevelop.io/gdevelop5/interface/scene-editor/layers-and-cameras#:~:text=A%20layer%20acts%20as%20a,scene%20can%20have%20multiple%20layers)\n- [شروط وإجراءات](https://wiki.gdevelop.io/gdevelop5/events#:~:text=If%20an%20event%20does%20not,the%20value%20of%20a%20variable)" } }, { "messageByLocale": { - "en": "Now take a break to work on your game, or add leaderboards on the next chapter." + "en": "Now you can take a break from the tutorial, or add a leaderboard on the next chapter.", + "fr": "Vous pouvez maintenant faire une pause avant de commencer le prochain chapitre pour ajouter un tableau de score.", + "es": "Ahora puedes hacer una pausa antes de comenzar el próximo capítulo para agregar una tabla de clasificación.", + "pt": "Agora você pode fazer uma pausa antes de começar o próximo capítulo para adicionar uma tabela de classificação.", + "th": "คุณสามารถหยุดพักบทเรียนตรงนี้ หรือเข้าสู่บทเรียนถัดไปเพื่อเพิ่มกระดานคะแนนเลยก็ได้", + "ar": "يمكنك الآن أخذ استراحة من البرنامج التعليمي، أو إضافة لوحة صدارة في الفصل التالي." } } ] } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:background", "nextStepTrigger": { - "presenceOfElement": "#objects-list [id^=object-item][data-global=true]" + "presenceOfElement": "#objects-list [data-global=true]" }, "tooltip": { "description": { "messageByLocale": { - "en": "Right click on your $(background), and click “set as **global object**”." + "en": "Right click on your $(background) and click “set as **global object**”.", + "fr": "Faites un clic droit sur $(background) et sélectionnez “Définir comme **objet global**”.", + "es": "Haga clic derecho en $(background) y seleccione “Definir como **objeto global**”.", + "pt": "Clique com o botão direito em $(background) e selecione “Definir como **objeto global**”.", + "th": "คลิกขวาที่ $(background) และเลือก “ตั้งเป็น **วัตถุโกลบอล**”", + "ar": "نقرة بزر الفأرة الأيمن على $(background) ونقر **تعيين ككائن عمومي**." } }, "placement": "left" @@ -2468,12 +4160,17 @@ { "elementToHighlightId": "#main-toolbar-project-manager-button", "nextStepTrigger": { - "presenceOfElement": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-game-settings" + "presenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-game-settings" }, "tooltip": { "title": { "messageByLocale": { - "en": "Now let's create a new **scene** for our start screen." + "en": "Now let's create a new **scene** for our start screen.", + "fr": "Créons une scène qui servira d'écran d'ouverture du jeu.", + "es": "Ahora creemos una nueva **escena** para nuestra pantalla de inicio.", + "pt": "Agora vamos criar uma nova **cena** para a nossa tela inicial.", + "th": "ทีนี้สร้าง **scene** ใหม่ สำหรับฉากเริ่มต้น", + "ar": "الآن هيّا نقوم بإنشاء **مشهد** جديد لشاشة البداية خاصتنا." } }, "placement": "right" @@ -2487,10 +4184,16 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Click here." + "en": "Click here.", + "fr": "Cliquez ici.", + "es": "Haga clic aquí.", + "pt": "Clique aqui.", + "th": "คลิกที่นี่", + "ar": "النقر هنا." } }, - "placement": "right" + "placement": "right", + "mobilePlacement": "bottom" }, "mapProjectData": { "startScene": "projectLastSceneName" @@ -2504,12 +4207,48 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Right click on the new scene and change its name to “**StartScreen**”.\n\nOnce you're done, click on the item to open the new scene." + "en": "Right click on the new scene and change its name to “**StartScreen**”.\n\nOnce you're done, click on the item to open the new scene.", + "fr": "Faites un clic droit sur la nouvelle scène et changez son nom pour “**EcranOuverture**”.\n\nUne fois terminé, cliquez sur l'élément pour ouvrir la scène.", + "es": "Haga clic derecho en la nueva escena y cambie su nombre a “**PantallaInicio**”.\n\nUna vez terminado, haga clic en el elemento para abrir la escena.", + "pt": "Clique com o botão direito na nova cena e altere o nome para “**TelaInicial**”.\n\nUma vez terminado, clique no item para abrir a nova cena.", + "th": "คลิกขวาที่ scene ใหม่และเปลี่ยนชื่อเป็น “**StartScreen**”\n\nเมื่อเสร็จแล้ว คลิกที่ไอเทมเพื่อเปิด scene ใหม่", + "ar": "نقرة بزر الفأرة الأيمن على المشهد الجديد وإعادة تسميته إلى **StartScreen**.\n\nبمجرد الانتهاء، النقر عليه لفتح المشهد الجديد." } }, "placement": "right" } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "CreateNewScene", "elementToHighlightId": "objectInObjectsList:background", @@ -2519,17 +4258,29 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(background) into the scene." + "en": "Drag $(background) into the scene.", + "fr": "Faites glisser $(background) du menu au canvas.", + "es": "Arrastre $(background) desde el menú al lienzo.", + "pt": "Arraste $(background) do menu para a cena.", + "th": "ลาก $(background) มาใส่ใน scene", + "ar": "سحب $(background) إلى المشهد." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "nextStepTrigger": { "clickOnTooltipButton": { "messageByLocale": { - "en": "I'm done" + "en": "I'm done", + "fr": "J'ai terminé", + "es": "He terminado", + "pt": "Terminei", + "th": "เสร็จแล้ว", + "ar": "انتهيت" } } }, @@ -2537,13 +4288,40 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Drag to expand the size $(background) until it stretches over your entire game area." + "en": "Drag to expand the size $(background) until it stretches over your entire game area.", + "fr": "Positionnez et redimensionnez $(background) de telle sorte qu'il recouvre l'écran de jeu.", + "es": "Arrastre para expandir el tamaño de $(background) hasta que se estire sobre toda la área del juego.", + "pt": "Arraste para expandir o tamanho de $(background) até que ele se estenda sobre toda a área do jogo.", + "th": "ลากเพื่อปรับขนาด $(background) จนมันครอบคลุมบริเวณทั้งหมดในเกมของคุณ", + "ar": "سحب وتوسيع حجم الـ $(background) حتى يتم تغطية اللعبة بأكملها." } }, "image": { "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Mi45MzEgMzAuMDE2IDE0MC4yNzkgOTUuMTY4IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjMuMDcxIiB5MT0iMzAuMDE2IiB4Mj0iMTIzLjA3MSIgeTI9IjEyNS4xODQiIGlkPSJncmFkaWVudC0wIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuOTYyNTc4LCAwLCAwLCAwLjk2MjU3OCwgNC42MDU1NTksIDEuMTIzMjU4KSIgc3ByZWFkTWV0aG9kPSJwYWQiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMCwgMjA4LCAyNTUpOyIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoMTY0LCAyMzcsIDI1NSk7Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB4PSI1Mi45MzEiIHk9IjMwLjAxNiIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAycHg7IGZpbGw6IHVybCgjZ3JhZGllbnQtMCk7IGZpbGwtb3BhY2l0eTogMTsgZmlsbC1ydWxlOiBub256ZXJvOyIvPgogIDxwYXRoIHN0eWxlPSJmaWxsOiByZ2IoMTY1LCAxNTgsIDg1KTsiIGQ9Ik0gNTIuNzY3IDEyNS4xNjkgTCA1Mi44MSAxMTIuNDMgTCAxMTQuNjM3IDExMC44NDggTCAxNDYuNDIgOTEuNDUgTCAxNTguOTU5IDgxLjkyNCBMIDE2Ny41MTUgNzEuMTg0IEwgMTc3Ljc4OCA2MS40MTEgTCAxODMuMzYgNTYuNjU4IEwgMTkzLjI3OSA2NS42OTcgTCAxOTMuMTg2IDEyNS4yOTMgTCA1Mi43NjcgMTI1LjE2OSBaIi8+CiAgPHBvbHlnb24gc3R5bGU9ImZpbGw6IHJnYig3LCAxMTUsIDMwKTsiIHBvaW50cz0iNzIuNjEgMTA5LjgwOCA4NS41NzYgMTAxLjgzIDc0LjE0MSAxMDEuMDE1IDg0Ljg1MiA5MC41MiA3Ny4yNSA4OS42NjcgODYuNjk0IDgxLjYzNyA4MS42MjkgODAuOTE4IDkwLjQzNyA2Ny45MjUgOTUuNzI2IDgxLjU3MiA5MS41MDYgODEuODUgOTcuMDMxIDkxLjkwOCA5Mi4xNjQgOTEuNjY4IDEwMC41NzggMTAxLjg1NCA5My4yMzYgMTAxLjU1NCAxMDUuNTE4IDExMy40OTYiLz4KICA8cG9seWdvbiBzdHlsZT0iZmlsbDogcmdiKDcsIDExNSwgMzApOyIgcG9pbnRzPSI5Ni4xNTMgNzUuNjA3IDEwNy4zMzkgODMuNzk3IDk3LjY2OSA4NC41IDEwNi44MjkgOTMuMTUzIDEwMC42MDEgOTMuMzY5IDEwNy4xODkgMTAwLjcwNyAxMDQuMDcgMTAwLjk3NSAxMTAuNTg3IDExMi43NjUgMTE3LjI4OCA5OS41NjQgMTEzLjYwMyAxMDAuMjYgMTE3LjUzNSA5MS4zOTcgMTEyLjkxMiA5My4xNzQgMTE5Ljc3MSA4NC43MTkgMTEzLjgxNyA4NC4wMzUgMTIxLjE3MSA3NC4zMTciIHRyYW5zZm9ybT0ibWF0cml4KC0xLCAwLCAwLCAtMSwgMjIwLjU3ODAwMywgMTg2Ljc3OCkiLz4KICA8cGF0aCBzdHlsZT0iZmlsbDogcmdiKDI1NSwgMjU1LCAyNTUpOyIgZD0iTSAxNzUuMjI2IDc5LjYxMyBMIDE2Mi44NDYgNzYuOTI4IEwgMTY3LjUxNSA3MS4xODQgTCAxNzcuNzg4IDYxLjQxMSBMIDE4My4zNiA1Ni42NTggTCAxOTMuMjc5IDY1LjY5NyBMIDE5My4xODYgNzYuMzM5IFoiLz4KICA8cmVjdCB4PSI1Mi45NSIgeT0iMjkuOTg0IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogbm9uZTsgc3Ryb2tlLXdpZHRoOiAycHg7Ii8+Cjwvc3ZnPg==" } - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true }, { "id": "ClickOnNewObjectButtonForStartScreenTitle", @@ -2553,9 +4331,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Now let's create a title!" + "en": "Now let's create a title!", + "fr": "Maintenant, créons un titre!", + "es": "¡Ahora creemos un título!", + "pt": "Agora, vamos criar um título!", + "th": "ทีนี้ได้เวลาสร้าง title!", + "ar": "الآن هيّا نقوم بإنشاء عنوان!" } } } @@ -2568,11 +4352,17 @@ "tooltip": { "description": { "messageByLocale": { - "en": "This time, we'll create a text from scratch." + "en": "Let's create a text from scratch.", + "fr": "Nous allons créer un objet texte de zéro.", + "es": "Vamos a crear un texto desde cero.", + "pt": "Vamos criar um texto do zero.", + "th": "สร้างข้อความเอง", + "ar": "الآن هيّا نقوم بإنشاء نص من الصفر." } }, "placement": "bottom" }, + "skippable": true, "isOnClosableDialog": true }, { @@ -2583,7 +4373,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select **Text** object" + "en": "Select **Text** object", + "fr": "Sélectionnez l'objet **Texte**", + "es": "Selecciona el objeto **Texto**", + "pt": "Selecione o objeto **Texto**", + "th": "เลือกวัตถุ **ข้อความ**", + "ar": "تحديد الكائن **نص**" } }, "placement": "bottom" @@ -2593,12 +4388,17 @@ { "elementToHighlightId": "#object-name", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Title" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the object name to “Title”." + "en": "Change the object name to “Title”.", + "fr": "Changez le nom de l'objet pour “Title”.", + "es": "Cambia el nombre del objeto a “Title”.", + "pt": "Mude o nome do objeto para “Title”.", + "th": "เปลี่ยนชื่อวัตถุเป็น “Title”", + "ar": "تغيير اسم الكائن إلى **Title**." } }, "placement": "bottom" @@ -2608,12 +4408,17 @@ { "elementToHighlightId": "#text-object-font-size", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "200" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the font size to **200**." + "en": "Change the font size to **200**.", + "fr": "Utilisez une taille de **200**.", + "es": "Utiliza un tamaño de **200**.", + "pt": "Use um tamanho de **200**.", + "th": "แก้ไขขนาดฟอนต์เป็น **200**", + "ar": "تغيير حجم الخط إلى **200**." } }, "placement": "bottom" @@ -2628,7 +4433,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Change the initial text to display whatever you want the title of your game to be." + "en": "Change the initial text to display whatever you want the title of your game to be.", + "fr": "Entrez le nom que vous avez choisi pour votre jeu.", + "es": "Escribe el nombre que has elegido para tu juego.", + "pt": "Digite o nome que você escolheu para o seu jogo.", + "th": "เปลี่ยนข้อความเริ่มต้นเป็นชื่อเกมของคุณ อะไรก็ได้", + "ar": "تغيير نص المثيل ليقوم بعرض **-أيًا كان-** عنوان اللعبة الذي يناسب ذوقك." } }, "placement": "bottom" @@ -2643,7 +4453,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "Hemos terminado.", + "pt": "Terminamos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } } }, @@ -2652,74 +4467,194 @@ } }, { - "elementToHighlightId": "objectInObjectsList:title", + "elementToHighlightId": "#toolbar-open-objects-panel-button", "nextStepTrigger": { - "instanceAddedOnScene": "title:startScene" + "presenceOfElement": "#add-new-object-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(title) into the **scene** where you'd like your title to be." + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" } }, - "placement": "left" - } + "placement": "bottom" + }, + "skippable": true }, { "elementToHighlightId": "objectInObjectsList:title", "nextStepTrigger": { - "presenceOfElement": "#scene-editor[data-active=true] #object-item-2" + "instanceAddedOnScene": "title:startScene" }, "tooltip": { "description": { "messageByLocale": { - "en": "Right-click on $(title) and select “Duplicate”." + "en": "Drag $(title) into the **scene** where you'd like your title to be.", + "fr": "Faites glisser $(title) du menu au canvas et placez le où vous voulez dans l'écran de jeu.", + "es": "Arrastra $(title) desde el menú al lienzo y colócalo donde quieras en la pantalla de juego.", + "pt": "Arraste $(title) do menu para o canvas e coloque-o onde quiser na tela do jogo.", + "th": "ลาก $(title) ไปยัง **scene** ที่คุณต้องการใส่ชื่อเกม", + "ar": "سحب $(title) إلى **المشهد** أينما كان المكان الذي يعجبك." } }, "placement": "left" }, - "mapProjectData": { - "startText": "sceneLastObjectName:startScene" - } + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { - "elementToHighlightId": "objectInObjectsList:startText", + "elementToHighlightId": "#toolbar-open-objects-panel-button", "nextStepTrigger": { - "presenceOfElement": "#object-editor-dialog" + "presenceOfElement": "#add-new-object-button" }, "tooltip": { "description": { "messageByLocale": { - "en": "Double click on $(startText)." + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" } }, - "placement": "left" - } + "placement": "bottom" + }, + "skippable": true }, { - "elementToHighlightId": "#object-name", + "elementToHighlightId": "objectInObjectsList:title", "nextStepTrigger": { - "valueHasChanged": true + "objectAddedInLayout": true }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the **object** name to “**Start**”." + "en": "Right-click on $(title) and select “Duplicate”.", + "fr": "Faites un clic droit sur $(title) et sélectionnez “Dupliquer”.", + "es": "Haz clic derecho en $(title) y selecciona “Duplicar”.", + "pt": "Clique com o botão direito em $(title) e selecione “Duplicar”.", + "th": "คลิกขวาที่ $(title) และเลือก “คัดลอกซ้ำ”", + "ar": "نقرة بزر الفأرة الأيمن على $(title) وتحديد **تكرار**." } }, - "placement": "bottom" + "placement": "left" }, - "isOnClosableDialog": true - }, - { + "mapProjectData": { + "startText": "sceneLastObjectName:startScene" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:startText", + "nextStepTrigger": { + "presenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Double click on $(startText).", + "fr": "Double-cliquez sur $(startText).", + "es": "Haz doble clic en $(startText).", + "pt": "Clique duas vezes em $(startText).", + "th": "ดับเบิ้ลคลิกที่ $(startText)", + "ar": "نقرة مزدوجة على $(startText)." + } + }, + "placement": "left" + } + }, + { + "elementToHighlightId": "#object-name", + "nextStepTrigger": { + "valueEquals": "Start" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Change the **object** name to “**Start**”.", + "fr": "Changez le nom de **l'objet** pour “**Start**”.", + "es": "Cambia el nombre del **objeto** a “**Start**”.", + "pt": "Mude o nome do **objeto** para “**Start**”.", + "th": "เปลี่ยนชื่อ **วัตถุ** เป็น “**Start**”", + "ar": "تغيير اسم **الكائن** إلى **Start**." + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { "elementToHighlightId": "#text-object-font-size", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "50" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the font size to **50**." + "en": "Change the font size to **50**.", + "fr": "Utilisez une taille de **50**.", + "es": "Utiliza un tamaño de **50**.", + "pt": "Use um tamanho de **50**.", + "th": "แก้ไขขนาดฟอนต์เป็น **50**", + "ar": "تغيير حجم الخط إلى **50**." } }, "placement": "bottom" @@ -2734,7 +4669,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Change the initial text to “Start Game”." + "en": "Change the initial text to “Start Game”.", + "fr": "Définissez le texte de l'objet à “Jouer”.", + "es": "Define el texto del objeto como “Jugar”.", + "pt": "Defina o texto do objeto como “Jogar”.", + "th": "เปลี่ยนข้อความเริ่มต้นเป็น “Start Game”", + "ar": "تغيير نص المثيل إلى أي شيء يدل على أن اللعبة ستبدأ بمجرد الضغط عليه.\n\n(على سبيل المثال: بدء اللعبة)" } }, "placement": "bottom" @@ -2749,7 +4689,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "Hemos terminado.", + "pt": "Terminamos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } } }, @@ -2757,6 +4702,37 @@ "startText": "sceneLastObjectName:startScene" } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:startText", "nextStepTrigger": { @@ -2765,11 +4741,18 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(startText) into the **scene** where you'd like the start button to be." + "en": "Drag $(startText) into the **scene** where you'd like the start button to be.", + "fr": "Faites glisser $(startText) du menu au canvas à l'endroit où vous voulez.", + "es": "Arrastra $(startText) desde el menú al lienzo en el lugar donde quieras.", + "pt": "Arraste $(startText) do menu para o canvas no lugar onde você deseja.", + "th": "ลาก $(startText) ไปยัง **scene** ที่คุณต้องการใส่ปุ่มเริ่มเกม", + "ar": "سحب $(startText) إلى **المشهد** أينما كان المكان الذي يعجبك." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "elementToHighlightId": "editorTab:startScene:EventsSheet", @@ -2779,7 +4762,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Now let's interact with those titles." + "en": "Now let's interact with those titles.", + "fr": "Maintenant, faisons en sorte de pouvoir cliquer sur le texte.", + "es": "Ahora, hagamos que se pueda hacer clic en el texto.", + "pt": "Agora, vamos fazer com que seja possível clicar no texto.", + "th": "โต้ตอบกับข้อความ", + "ar": "الآن هيّا نتفاعل مع تلك العنوانين." } } } @@ -2793,7 +4781,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's create a new **event**!" + "en": "Let's create a new **event**.", + "fr": "Créez un nouvel **évènement**.", + "es": "Crea un nuevo **evento**.", + "pt": "Crie um novo **evento**.", + "th": "สร้าง **event** ใหม่", + "ar": "هيّا نقوم بإنشاء **حدث** جديد." } } } @@ -2806,7 +4799,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add a **condition**." + "en": "Add a **condition**.", + "fr": "Ajoutez une **condition**.", + "es": "Agrega una **condición**.", + "pt": "Adicione uma **condição**.", + "th": "เพิ่ม **เงื่อนไข**", + "ar": "إضافة **شرط**." } } } @@ -2819,7 +4817,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select $(startText)." + "en": "Select $(startText).", + "fr": "Cliquez sur $(startText).", + "es": "Haz clic en $(startText).", + "pt": "Clique em $(startText).", + "th": "เลือก $(startText)", + "ar": "تحديد $(startText)." } } }, @@ -2833,7 +4836,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the cursor condition." + "en": "Select the cursor condition.", + "fr": "Cliquez sur cette condition de position du curseur.", + "es": "Haz clic en esta condición de posición del cursor.", + "pt": "Clique nesta condição de posição do cursor.", + "th": "เลือกเงื่อนไขเคอร์เซอร์", + "ar": "تحديد شرط المؤشر." } } }, @@ -2847,7 +4855,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **condition** is all set." + "en": "Alright, the **condition** is all set.", + "fr": "Rien de plus à configurer.", + "es": "Nada más que configurar.", + "pt": "Nada mais para configurar.", + "th": "เอาล่ะ เงื่อนไขถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط **الشرط** تمامًا." } }, "placement": "top" @@ -2861,7 +4874,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add another **condition**." + "en": "Add another **condition**.", + "fr": "Ajoutez une autre **condition**.", + "es": "Agrega otra **condición**.", + "pt": "Adicione outra **condição**.", + "th": "เพิ่ม **เงื่อนไข** อีก", + "ar": "إضافة **شرط** آخر." } } } @@ -2874,7 +4892,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Type “**Mouse**”." + "en": "Type “**Mouse**”.", + "fr": "Cherchez “**Souris**”", + "es": "Escribe “**Ratón**”.", + "pt": "Digite “**Mouse**”.", + "th": "พิมพ์ “**Mouse**”", + "ar": "كتابة **فأرة**." } } }, @@ -2888,7 +4911,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select “Mouse button released”." + "en": "Select “Mouse button released”.", + "fr": "Cliquez sur “Bouton de la souris relâché”.", + "es": "Haz clic en “Botón del ratón liberado”.", + "pt": "Clique em “Botão do mouse liberado”.", + "th": "เลือก “ปุ่มจากเมาส์ถูกปล่อย”", + "ar": "تحديد **تم تحرير زر الفأرة**." } } }, @@ -2897,12 +4925,17 @@ { "elementToHighlightId": "#instruction-parameters-container select", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Left" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select “left (primary)”." + "en": "Select “left (primary)”.", + "fr": "Sélectionnez “Gauche (principal)”.", + "es": "Selecciona “Izquierda (principal)”.", + "pt": "Selecione “Esquerda (principal)”.", + "th": "เลือก “ซ้าย (หลัก)”", + "ar": "تحديد **يسار (أساسي)**." } }, "placement": "top" @@ -2917,7 +4950,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **condition** is all set." + "en": "Alright, the **condition** is all set.", + "fr": "C'est bon pour cette condition.", + "es": "Está bien para esta condición.", + "pt": "Está tudo certo para esta condição.", + "th": "เอาล่ะ เงื่อนไขถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط **الشرط** تمامًا." } }, "placement": "top" @@ -2931,7 +4969,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's add an **action** now." + "en": "Let's add an **action** now.", + "fr": "Ajoutons une **action** maintenant.", + "es": "Agreguemos una **acción** ahora.", + "pt": "Vamos adicionar uma **ação** agora.", + "th": "เพิ่ม **การกระทำ**", + "ar": "هيّا نقوم بإضافة **إجراء** الآن." } } } @@ -2944,7 +4987,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Type “**Scene**”." + "en": "Type “**Scene**”.", + "fr": "Cherchez “**scène**”.", + "es": "Escribe “**Escena**”.", + "pt": "Digite “**Cena**”.", + "th": "พิมพ์ “**Scene**”", + "ar": "كتابة **مشهد**." } } }, @@ -2958,7 +5006,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select “**Change the scene**”." + "en": "Select “**Change the scene**”.", + "fr": "Cliquez sur “**Changer la scène**”.", + "es": "Haz clic en “**Cambiar la escena**”.", + "pt": "Clique em “**Alterar a cena**”.", + "th": "เลือก “**Change the scene**”", + "ar": "تحديد **تغيير المشهد**." } } }, @@ -2972,7 +5025,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select “$(playScene)”." + "en": "Select “$(playScene)”.", + "fr": "Sélectionnez “$(playScene)”.", + "es": "Selecciona “$(playScene)”.", + "pt": "Selecione “$(playScene)”.", + "th": "เลือก “$(playScene)”", + "ar": "تحديد $(playScene)." } }, "placement": "top" @@ -2987,7 +5045,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **action** is all set." + "en": "Alright, the **action** is all set.", + "fr": "L'action est bien configurée.", + "es": "La acción está bien configurada.", + "pt": "A ação está configurada corretamente.", + "th": "เอาล่ะ การกระทำถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط **الإجراء** تمامًا." } }, "placement": "top" @@ -3001,11 +5064,36 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's get back to the **scene** to add a score." + "en": "Let's get back to the **scene** to add a score.", + "fr": "Retournons à la **scène** pour afficher le score.", + "es": "Volvamos a la **escena** para mostrar el puntaje.", + "pt": "Vamos voltar para a **cena** para adicionar um score.", + "th": "กลับไปยัง **scene** เพื่อเพิ่มคะแนน", + "ar": "هيّا نعود إلى **المشهد** لإضافة النتيجة." } } } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "es": "Abre el panel de **objetos**.", + "pt": "Abra o painel de **objetos**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "ar": "فتح لوحة **الكائنات**." + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "id": "ClickOnNewObjectButtonForScore", "elementToHighlightId": "#scene-editor[data-active=true] #add-new-object-button", @@ -3014,9 +5102,15 @@ }, "tooltip": { "placement": "left", + "mobilePlacement": "top", "description": { "messageByLocale": { - "en": "Let's create a text that will display the player score." + "en": "Let's create a text that will display the player score.", + "fr": "Créez un object texte qui affichera le score du joueur ou de la joueuse.", + "es": "Crea un objeto de texto que muestre la puntuación del jugador o jugadora.", + "pt": "Vamos criar um texto que irá exibir o score do jogador.", + "th": "สร้างข้อความสำหรับแสดงคะแนนผู้เล่น", + "ar": "هيّا نقوم بإنشاء نص ليعرض النتيجة للاعبين." } } } @@ -3029,11 +5123,17 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's create a text from scratch." + "en": "Let's create a text from scratch.", + "fr": "Nous allons créer un objet texte de zéro.", + "es": "Vamos a crear un objeto de texto desde cero.", + "pt": "Vamos criar um texto do zero.", + "th": "สร้างข้อความเอง", + "ar": "هيّا نقوم بإنشاء نص من الصفر." } }, "placement": "bottom" }, + "skippable": true, "isOnClosableDialog": true }, { @@ -3044,7 +5144,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select **Text** object" + "en": "Select **Text** object", + "fr": "Sélectionnez l'objet **Texte**", + "es": "Selecciona el objeto **Texto**", + "pt": "Selecione o objeto **Texto**", + "th": "เลือกวัตถุ **ข้อความ**", + "ar": "تحديد الكائن **نص**." } }, "placement": "bottom" @@ -3054,12 +5159,17 @@ { "elementToHighlightId": "#object-name", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Score" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the object name to “**Score**”." + "en": "Change the object name to “**Score**”.", + "fr": "Changez le nom de l'objet pour “**Score**”.", + "es": "Cambia el nombre del objeto a “**Score**”.", + "pt": "Mude o nome do objeto para “**Score**”.", + "th": "เปลี่ยนชื่อวัตถุเป็น “**Score**”", + "ar": "تغيير اسم الكائن إلى **Score**." } }, "placement": "bottom" @@ -3069,12 +5179,17 @@ { "elementToHighlightId": "#text-object-font-size", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "50" }, "tooltip": { "description": { "messageByLocale": { - "en": "Change the font size to **50**." + "en": "Change the font size to **50**.", + "fr": "Utilisez une taille de **50**.", + "es": "Usa un tamaño de **50**.", + "pt": "Use um tamanho de **50**.", + "th": "แก้ไขขนาดฟอนต์เป็น **50**", + "ar": "تغيير حجم الخط إلى **50**." } }, "placement": "bottom" @@ -3089,7 +5204,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Change the initial text to display “Milliseconds: 0”." + "en": "Change the initial text to display “Time: 0”.", + "fr": "Utilisez comme texte initial “Temps : 0”.", + "es": "Usa como texto inicial “Tiempo: 0”.", + "pt": "Use como texto inicial “Tempo: 0”.", + "th": "เปลี่ยนข้อความเริ่มต้นเป็น “Time: 0”", + "ar": "تغيير نص المثيل إلى **الوقت: 0**." } }, "placement": "bottom" @@ -3104,7 +5224,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "Hemos terminado.", + "pt": "Estamos prontos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } } }, @@ -3112,6 +5237,37 @@ "scoreText": "sceneLastObjectName:playScene" } }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, { "elementToHighlightId": "objectInObjectsList:scoreText", "nextStepTrigger": { @@ -3120,11 +5276,18 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Drag $(scoreText) into the top left corner of the screen." + "en": "Drag $(scoreText) into the top left corner of the screen.", + "fr": "Faites glisser $(scoreText) du menu au canvas et mettez le en haut à droite de l'écran de jeu.", + "es": "Arrastra $(scoreText) desde el menú al lienzo y colócalo en la esquina superior izquierda de la pantalla de juego.", + "pt": "Arraste $(scoreText) do menu para o canvas e coloque-o no canto superior esquerdo da tela de jogo.", + "th": "ลาก $(scoreText) ไปยังมุมซ้ายบนของหน้าจอ", + "ar": "سحب $(scoreText) إلى الشاشة." } }, "placement": "left" - } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true }, { "elementToHighlightId": "editorTab:playScene:EventsSheet", @@ -3134,7 +5297,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's change the score dynamically." + "en": "Let's change the score dynamically.", + "fr": "Maintenant, changeons le score du joueur ou de la joueuse en fonction du temps écoulé.", + "es": "Ahora, cambiemos la puntuación del jugador o jugadora en función del tiempo transcurrido.", + "pt": "Agora, vamos mudar a pontuação do jogador ou jogadora de acordo com o tempo decorrido.", + "th": "เปลี่ยนแปลงคะแนนแบบไดนามิก", + "ar": "هيّا نقوم بتغيير النتيجة بفعالية." } } } @@ -3148,7 +5316,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We will create a timer that will start when the **scene** starts." + "en": "We will create a timer that will start when the **scene** starts.", + "fr": "Nous allons créer un chronomètre qui commencera au moment où la **scène** démarre.", + "es": "Vamos a crear un temporizador que comenzará cuando la **escena** comience.", + "pt": "Vamos criar um cronômetro que começará quando a **cena** começar.", + "th": "เราจะสร้างนาฬิกาจับเวลาโดยเริ่มจับเวลาเมื่อ **scene** เริ่มต้น", + "ar": "سوف نقوم بإنشاء مؤقت يبدأ مع **بداية** المشهد." } } }, @@ -3162,7 +5335,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Add a **condition**." + "en": "Add a **condition**.", + "fr": "Ajoutez une **condition**.", + "es": "Agrega una **condición**.", + "pt": "Adicione uma **condição**.", + "th": "เพิ่ม **เงื่อนไข**", + "ar": "إضافة **شرط**." } } } @@ -3175,7 +5353,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Search for “**Scene**”." + "en": "Search for “**Scene**”.", + "fr": "Cherchez “**Scène**”.", + "es": "Busca “**Escena**”.", + "pt": "Procure por “**Cena**”.", + "th": "ค้นหา “**Scene**”", + "ar": "البحث عن **مشهد**." } } }, @@ -3189,7 +5372,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the *At the beginning of the scene** condition.*" + "en": "Select the *At the beginning of the scene** condition.*", + "fr": "Cliquez sur la condition *Au lancement de la scène*.", + "es": "Haz clic en la condición *Al inicio de la escena*.", + "pt": "Clique na condição *No início da cena*.", + "th": "เลือก *เงื่อนไข** ขณะที่เริ่มฉาก*", + "ar": "تحديد الشرط *في بداية المشهد*." } } }, @@ -3203,7 +5391,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's create the timer now." + "en": "Let's create the timer now.", + "fr": "Nous allons maintenant créer le chronomètre.", + "es": "Ahora creemos el temporizador.", + "pt": "Agora, vamos criar o cronômetro.", + "th": "สร้างนาฬืกาจับเวลา", + "ar": "هيّا نقوم بإنشاء مؤقت الآن." } }, "placement": "top" @@ -3217,7 +5410,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Create an **action**." + "en": "Create an **action**.", + "fr": "Créez une **action**.", + "es": "Crea una **acción**.", + "pt": "Crie uma **ação**.", + "th": "สร้าง **การกระทำ**", + "ar": "إنشاء **إجراء**." } } } @@ -3230,7 +5428,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Search for “Scene timer”." + "en": "Search for “Scene timer”.", + "fr": "Cherchez “chrono”.", + "es": "Busca “temporizador”.", + "pt": "Procure por “cronômetro”.", + "th": "ค้นหา “ตัวจับเวลา Scene”", + "ar": "البحث عن **مؤقت**." } } }, @@ -3244,7 +5447,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the *Start (or reset) a scene timer* action." + "en": "Select the *Start (or reset) a scene timer* action.", + "fr": "Cliquez sur l'action *Démarrer (ou réinitialiser) un chronomètre de scène*.", + "es": "Haz clic en la acción *Iniciar (o reiniciar) un temporizador de escena*.", + "pt": "Clique na ação *Iniciar (ou reiniciar) um cronômetro de cena*.", + "th": "เลือกการกระทำ *เริ่มต้น (หรือรีเซ็ต) ตัวจับเวลา*", + "ar": "تحديد الإجراء *بدء (أو إعادة تعيين) مؤقت المشهد*." } } }, @@ -3253,17 +5461,22 @@ { "elementToHighlightId": "#instruction-parameters-container textarea", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "\"Score\"" }, "tooltip": { "description": { "messageByLocale": { - "en": "Type **\"Score\"** (in quotations)." + "en": "Type **\"Score\"** (in quotations).", + "fr": "Entrez **\"Score\"** (entre guillements).", + "es": "Escribe **\"Score\"** (entre comillas).", + "pt": "Digite **\"Score\"** (entre aspas).", + "th": "พิมพ์ **\"Score\"** (ใส่ quotations ด้วย)", + "ar": "كتابة **\"Score\"** (داخل علامتا تنصيص)." } - } + }, + "placement": "top" }, - "isOnClosableDialog": true, - "placement": "top" + "isOnClosableDialog": true }, { "elementToHighlightId": "#instruction-editor-dialog #ok-button", @@ -3273,7 +5486,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "Hemos terminado.", + "pt": "Terminamos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } }, "placement": "top" @@ -3287,7 +5505,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Now let's display the score." + "en": "Now let's display the score.", + "fr": "Maintenant, affichons le score.", + "es": "Ahora, muestremos el marcador.", + "pt": "Agora, vamos exibir a pontuação.", + "th": "แสดงคะแนน", + "ar": "الآن هيّا نقوم بعرض النتيجة." } } }, @@ -3301,7 +5524,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's make the score dynamic." + "en": "Let's make the score dynamic.", + "fr": "Nous allons rendre le score dynamique.", + "es": "Hagamos que el marcador sea dinámico.", + "pt": "Vamos tornar a pontuação dinâmica.", + "th": "เปลี่ยนแปลงคะแนนให้เป็นแบบไดนามิก", + "ar": "هيّا نقوم بجعل النتيجة متفاعلة." } } } @@ -3309,26 +5537,36 @@ { "elementToHighlightId": "objectInObjectOrResourceSelector:scoreText", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-TextObject--String" + "presenceOfElement": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select $(scoreText)." + "en": "Select $(scoreText).", + "fr": "Cliquez sur $(scoreText).", + "es": "Haz clic en $(scoreText).", + "pt": "Clique em $(scoreText).", + "th": "เลือก $(scoreText)", + "ar": "تحديد $(scoreText)." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-TextObject--String", + "elementToHighlightId": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue", "nextStepTrigger": { "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "We will change the text." + "en": "We will change the text.", + "fr": "Nous allons changer le contenu du texte.", + "es": "Cambiamos el texto.", + "pt": "Vamos alterar o texto.", + "th": "เราจะแก้ไขข้อความ", + "ar": "سوف نقوم بتعديل النص." } } }, @@ -3337,16 +5575,22 @@ { "elementToHighlightId": "#instruction-parameters-container select", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "=" }, + "skippable": true, "tooltip": { "description": { "messageByLocale": { - "en": "Select “= (set to)”." + "en": "Select “= (set to)”.", + "fr": "Cliquez sur “= (définir à)”.", + "es": "Selecciona “= (establecer en)”.", + "pt": "Selecione “= (definir como)”.", + "th": "เลือก “= (ตั้งเป็น)”", + "ar": "تحديد **= (تعيين إلى)**." } - } + }, + "placement": "left" }, - "placement": "left", "isOnClosableDialog": true }, { @@ -3357,11 +5601,16 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Copy this line and paste it here: `\"Milliseconds: \" + ToString(round(10*(TimerElapsedTime(\"Score\"))))`." + "en": "Double click to highlight this line, then copy and paste it here: `\"Time: \" + ToString(round( TimerElapsedTime(\"Score\")))`.", + "fr": "Double cliquez sur cette ligne pour la sélectionner et copiez-collez là ici : `\"Temps : \" + ToString(round( TimerElapsedTime(\"Score\")))`.", + "es": "Haz doble clic para resaltar esta línea, luego copia y pega aquí: `\"Tiempo: \" + ToString(round( TimerElapsedTime(\"Score\")))`.", + "pt": "Clique duas vezes para destacar esta linha, depois copie e cole aqui: `\"Tempo: \" + ToString(round( TimerElapsedTime(\"Score\")))`.", + "th": "ดับเบิ้ลคลิกเพื่อไฮไลต์ จากนั้นคัดลองและวางที่นี่: `\"Time: \" + ToString(round( TimerElapsedTime(\"Score\")))`", + "ar": "نقرة مزدوجة لتحديد هذا السطر، ثم نسخ ولصق هذا هنا:\n\n`\"الوقت: \" + ToString(round( TimerElapsedTime(\"Score\")))`." } - } + }, + "placement": "left" }, - "placement": "left", "isOnClosableDialog": true }, { @@ -3372,7 +5621,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're all set." + "en": "We're all set.", + "fr": "On est tout bon.", + "es": "Estamos listos.", + "pt": "Estamos prontos.", + "th": "เรียบร้อยแล้ว", + "ar": "ضبطنا كل شيء." } }, "placement": "top" @@ -3386,12 +5640,22 @@ "standalone": true, "title": { "messageByLocale": { - "en": "Now we will display the other players scores." + "en": "Now let's save the score of the player.", + "fr": "Maintenant, sauvegardons le score du joueur ou de la joueuse.", + "es": "Ahora, guardemos la puntuación del jugador o jugadora.", + "pt": "Agora, vamos salvar a pontuação do jogador ou jogadora.", + "th": "ทีนี้ เราจะบันทึกคะแนนของผู้เล่น", + "ar": "الآن هيّا نقوم بحفظ نتيجة اللاعبين." } }, "description": { "messageByLocale": { - "en": "In the **event** where $(target) gets deleted, click on “Add action”." + "en": "In the event where $(target) gets deleted, click on “Add action”.", + "fr": "Dans **l'évènement** où $(target) est supprimé, cliquez sur “Ajouter une action”.", + "es": "En el evento donde $(target) se elimina, haz clic en “Añadir acción”.", + "pt": "No evento onde $(target) é excluído, clique em “Adicionar ação”.", + "th": "ในอีเวนท์ที่ $(target) ถูกลบ กด “เพิ่มการกระทำ”", + "ar": "في الحدث الذي يتم حذف $(target) فيه، النقر على **إضافة إجراء**." } } } @@ -3399,26 +5663,36 @@ { "elementToHighlightId": "#instruction-editor-dialog #search-bar", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-Leaderboards--DisplayLeaderboard" + "presenceOfElement": "#instruction-item-Leaderboards--SaveConnectedPlayerScore" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “**leaderboard**”." + "en": "Search for “leaderboard”.", + "fr": "Cherchez “**classement**”.", + "es": "Busca “**clasificación**”.", + "pt": "Procure por “**classificação**”.", + "th": "ค้นหา “leaderboard”", + "ar": "البحث عن **حفظ**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-Leaderboards--DisplayLeaderboard", + "elementToHighlightId": "#instruction-item-Leaderboards--SaveConnectedPlayerScore", "nextStepTrigger": { "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select the *Display leaderboard* action." + "en": "Select the **Save connected player score** action.", + "fr": "Sélectionnez l'action **Enregistrer le score du joueur connecté**.", + "es": "Selecciona la acción **Guardar la puntuación del jugador conectado**.", + "pt": "Selecione a ação **Salvar pontuação do jogador conectado**.", + "th": "เลือกการกระทำ **บันทึกคะแนนผู้เล่นที่เชื่อมต่อ**", + "ar": "تحديد الإجراء **حفظ نتيجة اللاعب المتصل**." } } }, @@ -3432,7 +5706,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Leaderboard admin**." + "en": "Open the **Leaderboard admin**.", + "fr": "Ouvrez le panneau de gestion des classements.", + "es": "Abre el panel de administración de clasificaciones.", + "pt": "Abra o painel de administração de classificações.", + "th": "เปิด **Leaderboard admin**", + "ar": "فتح **مسؤول لوحات الصدارة**." } } }, @@ -3446,7 +5725,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Create a leaderboard." + "en": "Create a leaderboard.", + "fr": "Créez un nouveau classement.", + "es": "Crea una clasificación.", + "pt": "Crie uma classificação.", + "th": "สร้าง leaderboard", + "ar": "إنشاء لوحة صدارة." } } }, @@ -3460,7 +5744,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Let's change its name." + "en": "Let's change its name.", + "fr": "Changez son nom.", + "es": "Cambiamos su nombre.", + "pt": "Vamos mudar o nome.", + "th": "เปลี่ยนชื่อ", + "ar": "هيّا نقوم بتغيير اسمه." } } }, @@ -3469,12 +5758,17 @@ { "elementToHighlightId": "#leaderboard-administration-panel #edit-name-field", "nextStepTrigger": { - "valueHasChanged": true + "valueEquals": "Score" }, "tooltip": { "description": { "messageByLocale": { - "en": "Type “*Score*”." + "en": "Type “*Score*”.", + "fr": "Entrez “*Score*”.", + "es": "Escribe “*Score*”.", + "pt": "Digite “*Score*”.", + "th": "พิมพ์ “*Score*”", + "ar": "كتابة *Score*." } } }, @@ -3488,7 +5782,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Save changes when you're done." + "en": "Save changes when you're done.", + "fr": "Sauvegardez quand vous avez terminé.", + "es": "Guarda cuando hayas terminado.", + "pt": "Salve quando terminar.", + "th": "บันทึกการเปลี่ยนแปลงหลังจากเสร็จแล้ว", + "ar": "حفظ التغييرات عند الانتهاء." } } }, @@ -3502,7 +5801,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Our leaderboard is ready." + "en": "Our leaderboard is ready.", + "fr": "Notre classement est bien configuré, vous pouvez fermer.", + "es": "Nuestra clasificación está lista, puedes cerrar.", + "pt": "Nossa classificação está pronta, você pode fechar.", + "th": "leaderboard ของเราพร้อมแล้ว", + "ar": "لوحة الصدارة خاصتنا جاهزة." } } }, @@ -3516,7 +5820,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the option *Select the leaderboard from a list*." + "en": "Select the option *Select the leaderboard from a list*.", + "fr": "Sélectionnez l'option *Sélectionnez le classement dans une liste*.", + "es": "Selecciona la opción *Selecciona la clasificación de una lista*.", + "pt": "Selecione a opção *Selecione a classificação de uma lista*.", + "th": "เลือกตัวเลือก *เลือก leaderboard จากในลิสต์*", + "ar": "تحديد الخيار *تحديد لوحة الصدارة من قائمة*." } }, "placement": "top" @@ -3532,162 +5841,111 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select the leaderboard named “Score”." + "en": "Select the leaderboard named “Score”.", + "fr": "Sélectionnez le classement qui s'appelle “Score”.", + "es": "Selecciona la clasificación que se llama “Score”.", + "pt": "Selecione a classificação que se chama “Score”.", + "th": "เลือก leaderboard ที่ชื่อ “Score”", + "ar": "تحديد لوحة الصدارة المسماة *Score*." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-parameters-container #yes-button", - "nextStepTrigger": { - "presenceOfElement": "#instruction-parameters-container #yes-button[data-effective=\"true\"]" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "We'll use the built-in loader." - } - } - }, - "isOnClosableDialog": true, - "skippable": true - }, - { - "elementToHighlightId": "#instruction-editor-dialog #ok-button", - "nextStepTrigger": { - "absenceOfElement": "#instruction-editor-dialog" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Now the leaderboard should be displayed when $(projectile) reaches $(target)." - } - }, - "placement": "top" - } - }, - { - "elementToHighlightId": "editorTab:startScene:EventsSheet", + "elementToHighlightId": "#instruction-parameters-container #open-number-expression-popover-button", "nextStepTrigger": { - "editorIsActive": "startScene:EventsSheet" + "presenceOfElement": "#expression-selector" }, "tooltip": { "description": { "messageByLocale": { - "en": "Now we will ask the player to authenticate at game opening." + "en": "Open the **expression** builder.", + "fr": "Ouvrez le constructeur **d'expression**.", + "es": "Abre el constructor de **expresiones**.", + "pt": "Abra o construtor de **expressões**.", + "th": "เปิด เมนูสร้าง **expression**", + "ar": "فتح **بناء التعبيرات**." } } - } - }, - { - "id": "SwitchToEvents5", - "elementToHighlightId": "#toolbar-add-event-button", - "nextStepTrigger": { - "presenceOfElement": "[data-active=\"true\"] #add-condition-button-empty" }, - "isTriggerFlickering": true, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Let's create an **event**!" - } - } - } - }, - { - "elementToHighlightId": "[data-active=\"true\"] #add-condition-button-empty", - "nextStepTrigger": { - "presenceOfElement": "#instruction-editor-dialog" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Add a condition." - } - } - } + "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "elementToHighlightId": "#expression-selector input", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-DepartScene" + "presenceOfElement": "#instruction-or-expression-TimerElapsedTime" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “**Scene**”." + "en": "Search for “*Timer*”.", + "fr": "Cherchez “*chrono*”.", + "es": "Busca “*temporizador*”.", + "pt": "Procure por “*cronômetro*”.", + "th": "ค้นหา “*Timer*”", + "ar": "البحث عن **مؤقت**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-DepartScene", + "elementToHighlightId": "#instruction-or-expression-TimerElapsedTime", "nextStepTrigger": { - "presenceOfElement": "#instruction-parameters-container" + "presenceOfElement": "#expression-parameters-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select the **At the beginning of the scene** condition." + "en": "Select **Scene timer value**.", + "fr": "Cliquez sur **Valeur du chronomètre de scène**.", + "es": "Selecciona **Valor del temporizador de escena**.", + "pt": "Selecione **Valor do cronômetro da cena**.", + "th": "เลือก **ค่าจากตัวจับเวลา**", + "ar": "تحديد **قيمة مؤقت المشهد**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "elementToHighlightId": "#expression-parameters-editor-dialog textarea", "nextStepTrigger": { - "absenceOfElement": "#instruction-editor-dialog" + "valueEquals": "\"Score\"" }, "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "Select timer “Score”.", + "fr": "Sélectionnez le chronomètre “Score”.", + "es": "Selecciona el temporizador “Score”.", + "pt": "Selecione o cronômetro “Score”.", + "th": "เลือกตัวจับเวลา “Score”", + "ar": "تحديد المؤقت **Score**." } }, "placement": "top" - } - }, - { - "elementToHighlightId": "[data-active=\"true\"] #add-action-button-empty", - "nextStepTrigger": { - "presenceOfElement": "#instruction-editor-dialog" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Let's choose an **action**." - } - } - } - }, - { - "elementToHighlightId": "#instruction-editor-dialog #search-bar", - "nextStepTrigger": { - "presenceOfElement": "#instruction-item-PlayerAuthentication--DisplayAuthenticationBanner" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Search for “**Authentication**”." - } - } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-PlayerAuthentication--DisplayAuthenticationBanner", + "elementToHighlightId": "#expression-parameters-editor-dialog #apply-button", "nextStepTrigger": { - "presenceOfElement": "#instruction-parameters-container" + "absenceOfElement": "#expression-parameters-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select *Display authentication banner*." + "en": "This parameter is all set.", + "fr": "C'est terminé.", + "es": "Este parámetro está listo.", + "pt": "Este parâmetro está pronto.", + "th": "พารามิเตอร์ได้ถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "تم ضبط المعامل تمامًا." } - } + }, + "placement": "top" }, "isOnClosableDialog": true }, @@ -3699,121 +5957,97 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, now players will be asked to login." + "en": "The action is ready.", + "fr": "L'action est prête.", + "es": "La acción está lista.", + "pt": "A ação está pronta.", + "th": "การกระทำพร้อมแล้ว", + "ar": "الإجراء جاهز." } }, "placement": "top" } }, { - "elementToHighlightId": "#main-toolbar-project-manager-button", "nextStepTrigger": { - "presenceOfElement": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-game-settings" + "presenceOfElement": "#instruction-editor-dialog" }, "tooltip": { + "standalone": true, "title": { "messageByLocale": { - "en": "Now let's create a new **scene** that will be used to display the **leaderboard**." - } - }, - "placement": "right" - } - }, - { - "elementToHighlightId": "#project-manager #add-new-scene-button", - "nextStepTrigger": { - "presenceOfElement": "#scene-item-2" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Click here." + "en": "Now we will display the other players scores after a 2 seconds delay.", + "fr": "Maintenant, nous allons afficher le score des autres joueurs et joueuses après un délai de 2 secondes.", + "es": "Ahora mostraremos los puntajes de los otros jugadores después de un retraso de 2 segundos.", + "pt": "Agora, mostraremos os pontos dos outros jogadores após um atraso de 2 segundos.", + "th": "ทีนี้เราจะแสดงคะแนนผู้เล่นคนอื่นโดยดีเลย์ 2 วินาที", + "ar": "الآن سوف نقوم بعرض نتيجة اللاعبين الآخرين بعد ثانيتين (2)." } }, - "placement": "right" - }, - "mapProjectData": { - "leaderboardScene": "projectLastSceneName" - } - }, - { - "elementToHighlightId": "#project-manager #scene-item-2", - "nextStepTrigger": { - "presenceOfElement": "editorTab:leaderboardScene:EventsSheet" - }, - "tooltip": { "description": { "messageByLocale": { - "en": "Right click on the new **scene** and change its name to “Leaderboard”.\n\nOnce you're done, click on the item to open the new scene." - } - }, - "placement": "right" - } - }, - { - "id": "openLeaderboardScene", - "elementToHighlightId": "editorTab:leaderboardScene:EventsSheet", - "nextStepTrigger": { - "editorIsActive": "leaderboardScene:EventsSheet" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Go to the **events**." + "en": "In the **event** where $(target) gets deleted, click on “Add action”.", + "fr": "Dans **l'évènement** où $(target) est supprimé, cliquez sur “Ajouter une action”.", + "es": "En el **evento** donde $(target) se elimina, haz clic en “Agregar acción”.", + "pt": "No **evento** onde $(target) é excluído, clique em “Adicionar ação”.", + "th": "ใน **อีเวนท์** ที่ $(target) ถูกลบ กด “เพิ่มการกระทำ”", + "ar": "في الحدث الذي يتم حذف $(target) فيه، النقر على **إضافة إجراء**." } } } }, { - "id": "SwitchToEvents6", - "elementToHighlightId": "[data-active=\"true\"] #add-event-button", + "elementToHighlightId": "#instruction-editor-dialog #search-bar", "nextStepTrigger": { - "presenceOfElement": "[data-active=\"true\"] #add-condition-button-empty" + "presenceOfElement": "#instruction-item-Wait" }, "tooltip": { "description": { "messageByLocale": { - "en": "Let's add an **event** that makes sure the player comes back to the start screen after closing the **leaderboard**." + "en": "Search for “**Wait**”.", + "fr": "Cherchez “**Attendre**”.", + "es": "Busca “**Esperar**”.", + "pt": "Procure por “**Esperar**”.", + "th": "ค้นหา “**รอ**”", + "ar": "البحث عن **ثوان**." } } - } - }, - { - "elementToHighlightId": "[data-active=\"true\"] #add-condition-button-empty", - "nextStepTrigger": { - "presenceOfElement": "#instruction-editor-dialog" }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Click here." - } - } - } + "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "elementToHighlightId": "#instruction-item-Wait", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-Leaderboards--IsLeaderboardViewLoaded" + "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “**Leaderboard**”." + "en": "Select the *Wait X seconds* action.", + "fr": "Cliquez sur l'action *Attendre X secondes*.", + "es": "Haz clic en la acción *Esperar X segundos*.", + "pt": "Clique em *Esperar X segundos*.", + "th": "เลือกการกระทำ *รอ X วินาที*", + "ar": "تحديد الإجراء *الانتظار لثوان*." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-Leaderboards--IsLeaderboardViewLoaded", + "elementToHighlightId": "#instruction-parameters-container textarea", "nextStepTrigger": { - "presenceOfElement": "#instruction-parameters-container" + "valueEquals": "2" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select the *Leaderboard display has loaded* condition." + "en": "Type in **2**.", + "fr": "Tapez **2**.", + "es": "Escribe **2**.", + "pt": "Digite **2**.", + "th": "พิมพ์ **2**", + "ar": "كتابة **2**." } } }, @@ -3827,35 +6061,41 @@ "tooltip": { "description": { "messageByLocale": { - "en": "We're done." + "en": "Now the game will wait 2 seconds before going to next **action** in the **event**.", + "fr": "Maintenant, le jeu va attendre 2 secondes avant de passer à **l'action** suivante dans **l'évènement**.", + "es": "Ahora el juego esperará 2 segundos antes de pasar a la **acción** siguiente en el **evento**.", + "pt": "Agora, o jogo vai esperar 2 segundos antes de ir para a **ação** seguinte no **evento**.", + "th": "ทีนี้เกมจะรอ 2 วินาที ก่อนจะทำ **การกระทำ** ใน **อีเวนท์**", + "ar": "الآن ستنتظر اللعبة لمدة 2 من الثوان قبل تنفيذ **الإجراء** التالي في **الحدث**." } }, "placement": "top" } }, { - "elementToHighlightId": "span[data-instruction=\"Leaderboards::IsLeaderboardViewLoaded\"]", "nextStepTrigger": { - "presenceOfElement": "span[data-instruction=\"Leaderboards::IsLeaderboardViewLoaded\"][data-instruction-inverted=true]" + "presenceOfElement": "#instruction-editor-dialog" }, "tooltip": { - "description": { + "standalone": true, + "title": { "messageByLocale": { - "en": "Right-click on the condition and select *Invert Condition*." + "en": "Now we will display a leaderboard.", + "fr": "Maintenant, nous allons afficher un classement des scores.", + "es": "Ahora mostraremos una tabla de clasificación.", + "pt": "Agora, mostraremos uma classificação.", + "th": "แสดง leaderboard", + "ar": "الآن سوف نقوم بعرض لوحة صدارة." } }, - "placement": "bottom" - } - }, - { - "elementToHighlightId": "[data-active=\"true\"] #add-action-button-empty", - "nextStepTrigger": { - "presenceOfElement": "#instruction-editor-dialog" - }, - "tooltip": { "description": { "messageByLocale": { - "en": "Let's add the **action** to come back to the start screen." + "en": "In the **event** where $(target) gets deleted, click on “Add action”.", + "fr": "Dans **l'évènement** où $(target) est supprimé, cliquez sur “Ajouter une action”.", + "es": "En el **evento** donde $(target) se elimina, haz clic en “Agregar acción”.", + "pt": "No **evento** onde $(target) é excluído, clique em “Adicionar ação”.", + "th": "ใน **อีเวนท์** ที่ $(target) ถูกลบ กด “เพิ่มการกระทำ”", + "ar": "في الحدث الذي يتم حذف $(target) فيه، النقر على **إضافة إجراء**." } } } @@ -3863,259 +6103,315 @@ { "elementToHighlightId": "#instruction-editor-dialog #search-bar", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-Scene" + "presenceOfElement": "#instruction-item-Leaderboards--DisplayLeaderboard" }, "tooltip": { "description": { "messageByLocale": { - "en": "Type “*Scene*”." + "en": "Search for “**leaderboard**”.", + "fr": "Cherchez “**classement**”.", + "es": "Busca “**clasificación**”.", + "pt": "Procure por “**classificação**”.", + "th": "ค้นหา “**leaderboard**”", + "ar": "البحث عن **عرض**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-item-Scene", + "elementToHighlightId": "#instruction-item-Leaderboards--DisplayLeaderboard", "nextStepTrigger": { "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select “Change the scene”." + "en": "Select the *Display leaderboard* action.", + "fr": "Cliquez sur l'action *Afficher le classement*.", + "es": "Haz clic en la acción *Mostrar clasificación*.", + "pt": "Clique em *Mostrar classificação*.", + "th": "เลือกการกระทำ *แสดง leaderboard*", + "ar": "تحديد الإجراء *عرض لوحة الصدارة*." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-parameters-container #parameter-1-scene-field", + "elementToHighlightId": "#instruction-parameters-container select", "nextStepTrigger": { "valueHasChanged": true }, "tooltip": { "description": { "messageByLocale": { - "en": "Select “$(startScene)”." + "en": "Select the leaderboard named “Score”.", + "fr": "Sélectionnez le classement qui s'appelle “Score”.", + "es": "Selecciona la clasificación que se llama “Score”.", + "pt": "Selecione a classificação chamada “Score”.", + "th": "เลือก leaderboard ที่ชื่อ “Score”", + "ar": "تحديد لوحة الصدارة المسماة **Score**." } - }, - "placement": "top" - }, - "isOnClosableDialog": true, - "placement": "top" - }, - { - "elementToHighlightId": "#instruction-editor-dialog #ok-button", - "nextStepTrigger": { - "absenceOfElement": "#instruction-editor-dialog" + } }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Alright, the action is all set." - } - }, - "placement": "top" - } + "isOnClosableDialog": true }, { - "elementToHighlightId": "editorTab:playScene:EventsSheet", + "elementToHighlightId": "#instruction-parameters-container #yes-button", "nextStepTrigger": { - "editorIsActive": "playScene:EventsSheet" + "presenceOfElement": "#instruction-parameters-container #yes-button[data-effective=\"true\"]" }, "tooltip": { "description": { "messageByLocale": { - "en": "Now let's save the score of the player." + "en": "We'll use the built-in loader.", + "fr": "Nous allons utiliser l'écran de chargement intégré par défaut.", + "es": "Usaremos el cargador integrado.", + "pt": "Usaremos o carregador integrado.", + "th": "เราจะใช้โหลดเดอร์ built-in", + "ar": "سوف نقوم باستخدام شاشة التحميل المبنية مسبقًا." } } - } + }, + "isOnClosableDialog": true, + "skippable": true }, { - "id": "SwitchToEvents7", + "elementToHighlightId": "#instruction-editor-dialog #ok-button", "nextStepTrigger": { - "presenceOfElement": "#instruction-editor-dialog" + "absenceOfElement": "#instruction-editor-dialog" }, "tooltip": { - "standalone": true, "description": { "messageByLocale": { - "en": "In the event where $(target) gets deleted, click on “Add action”." + "en": "Now the leaderboard should be displayed when $(projectile) reaches $(target).", + "fr": "Maintenant, le classement devrait s'afficher quand les $(projectile)s atteignent $(target).", + "es": "Ahora, la tabla de clasificación debería mostrarse cuando $(projectile) llegue a $(target).", + "pt": "Agora, a classificação deve ser exibida quando $(projectile) atingir $(target).", + "th": "leaderboard ควรจะแสดง เมื่อ $(projectile) ไปถึง $(target)", + "ar": "الآن من المفترض أن يتم عرض لوحة الصدارة بعدما يصل $(projectile) إلى $(target)." } - } + }, + "placement": "top" } }, { - "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "elementToHighlightId": "editorTab:startScene:EventsSheet", "nextStepTrigger": { - "presenceOfElement": "#instruction-item-Leaderboards--SavePlayerScore" + "editorIsActive": "startScene:EventsSheet" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “leaderboard”." + "en": "Now we will ask the player to authenticate at game opening.", + "fr": "Maintenant, nous allons demander au joueur ou à la joueuse de s'identifier à l'ouverture du jeu.", + "es": "Ahora, pediremos al jugador que se autentique al abrir el juego.", + "pt": "Agora, pediremos ao jogador que se autentique ao abrir o jogo.", + "th": "ทีนี้เราจะถามผู้เล่นให้ยืนยันตอนที่เปิดเกม", + "ar": "الآن سوف نطالب اللاعبين بالمصادقة في بداية اللعبة." } } - }, - "isOnClosableDialog": true + } }, { - "elementToHighlightId": "#instruction-item-Leaderboards--SavePlayerScore", + "id": "SwitchToEvents5", + "elementToHighlightId": "#toolbar-add-event-button", "nextStepTrigger": { - "presenceOfElement": "#instruction-parameters-container" + "presenceOfElement": "[data-active=\"true\"] #add-condition-button-empty" }, + "isTriggerFlickering": true, "tooltip": { "description": { "messageByLocale": { - "en": "Select the **Save player score** action." + "en": "Let's create an **event**!", + "fr": "Créez un nouvel **évènement**.", + "es": "¡Vamos a crear un **evento**!", + "pt": "Vamos criar um **evento**!", + "th": "สร้าง **อีเวนท์** กันเถอะ!", + "ar": "سوف نقوم بإنشاء **حدث**!" } } - }, - "isOnClosableDialog": true + } }, { - "elementToHighlightId": "#instruction-parameters-container select", + "elementToHighlightId": "[data-active=\"true\"] #add-condition-button-empty", "nextStepTrigger": { - "valueHasChanged": true + "presenceOfElement": "#instruction-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select the leaderboard named “Score”." + "en": "Add a condition.", + "fr": "Ajoutez une condition.", + "es": "Agrega una condición.", + "pt": "Adicione uma condição.", + "th": "เพิ่มเงื่อนไข", + "ar": "إضافة شرط." } } }, - "isOnClosableDialog": true - }, - { - "elementToHighlightId": "#instruction-parameters-container #open-number-expression-popover-button", - "nextStepTrigger": { - "presenceOfElement": "#expression-selector" - }, - "tooltip": { - "description": { - "messageByLocale": { - "en": "Click on the **expression** builder." + "shortcuts": [ + { + "stepId": "SwitchToEvents5", + "trigger": { + "absenceOfElement": "[data-active=\"true\"] #add-condition-button-empty" } } - }, - "isOnClosableDialog": true + ] }, { - "elementToHighlightId": "#expression-selector input", + "elementToHighlightId": "#instruction-editor-dialog #search-bar", "nextStepTrigger": { - "presenceOfElement": "#instruction-or-expression-TimerElapsedTime" + "presenceOfElement": "#instruction-item-DepartScene" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “*Timer*”." + "en": "Search for “**Scene**”.", + "fr": "Cherchez “**Scène**”.", + "es": "Busca “**Escena**”.", + "pt": "Procure por “**Cena**”.", + "th": "ค้นหา “**Scene**”", + "ar": "البحث عن **مشهد**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-or-expression-TimerElapsedTime", + "elementToHighlightId": "#instruction-item-DepartScene", "nextStepTrigger": { - "presenceOfElement": "#expression-parameters-editor-dialog" + "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select **Scene timer value**." + "en": "Select the **At the beginning of the scene** condition.", + "fr": "Cliquez sur la condition *Au lancement de la scène*.", + "es": "Selecciona la condición **Al inicio de la escena**.", + "pt": "Selecione a condição **No início da cena**.", + "th": "เลือกเงื่อนไข **ขณะที่เริ่มฉาก**", + "ar": "تحديد الشرط **في بداية المشهد**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#expression-parameters-editor-dialog textarea", + "elementToHighlightId": "#instruction-editor-dialog #ok-button", "nextStepTrigger": { - "valueHasChanged": true + "absenceOfElement": "#instruction-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select timer “Score”." + "en": "We're done.", + "fr": "Nous avons terminé.", + "es": "Ya terminamos.", + "pt": "Já terminamos.", + "th": "เสร็จแล้ว", + "ar": "انتهينا." } }, "placement": "top" - }, - "isOnClosableDialog": true + } }, { - "elementToHighlightId": "#expression-parameters-editor-dialog #apply-button", + "elementToHighlightId": "[data-active=\"true\"] #add-action-button-empty", "nextStepTrigger": { - "absenceOfElement": "#expression-parameters-editor-dialog" + "presenceOfElement": "#instruction-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "This parameter is all set." + "en": "Let's choose an **action**.", + "fr": "Choisissons une **action**.", + "es": "Vamos a elegir una **acción**.", + "pt": "Vamos escolher uma **ação**.", + "th": "เลือก **การกระทำ**", + "ar": "هيّا نقوم باختيار **إجراء**." } - }, - "placement": "top" - }, - "isOnClosableDialog": true + } + } }, { - "elementToHighlightId": "#instruction-parameters-container #open-string-expression-popover-button", + "elementToHighlightId": "#instruction-editor-dialog #search-bar", "nextStepTrigger": { - "presenceOfElement": "#expression-selector" + "presenceOfElement": "#instruction-item-PlayerAuthentication--DisplayAuthenticationBanner" }, "tooltip": { "description": { "messageByLocale": { - "en": "Click on the **expression** builder." + "en": "Search for “**Authentication**”.", + "fr": "Cherchez “**Authentification**”.", + "es": "Busca “**Autenticación**”.", + "pt": "Procure por “**Autenticação**”.", + "th": "ค้นหา “**Authentication**”", + "ar": "البحث عن **مصادقة**." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#expression-selector input", + "elementToHighlightId": "#instruction-item-PlayerAuthentication--DisplayAuthenticationBanner", "nextStepTrigger": { - "presenceOfElement": "#instruction-or-expression-PlayerAuthentication--Username" + "presenceOfElement": "#instruction-parameters-container" }, "tooltip": { "description": { "messageByLocale": { - "en": "Search for “**Username**”." + "en": "Select *Display authentication banner*.", + "fr": "Cliquez sur *Afficher la bannière d'authentification*.", + "es": "Selecciona *Mostrar banner de autenticación*.", + "pt": "Selecione *Mostrar banner de autenticação*.", + "th": "เลือก *แสดงแบนเนอร์ authentication*", + "ar": "تحديد *عرض لافتة المصادقة*." } } }, "isOnClosableDialog": true }, { - "elementToHighlightId": "#instruction-or-expression-PlayerAuthentication--Username", + "elementToHighlightId": "#instruction-editor-dialog #ok-button", "nextStepTrigger": { - "absenceOfElement": "#expression-selector" + "absenceOfElement": "#instruction-editor-dialog" }, "tooltip": { "description": { "messageByLocale": { - "en": "Select **Username**." + "en": "Alright, now players will be asked to login.", + "fr": "Maintenant, les joueurs et les joueuses pourront s'identifier.", + "es": "Ahora, los jugadores podrán iniciar sesión.", + "pt": "Agora, os jogadores poderão fazer login.", + "th": "เอาล่ะ ทีนี้ผู้เล่นจะถูกขอให้ล็อกอิน", + "ar": "حسنًا، الآن سوف يتم مطالبة اللاعبين بتسجيل الدخول." } - } - }, - "isOnClosableDialog": true + }, + "placement": "top" + } }, { - "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "elementToHighlightId": "editorTab:playScene:EventsSheet", "nextStepTrigger": { - "absenceOfElement": "#instruction-editor-dialog" + "editorIsActive": "playScene:EventsSheet" }, "tooltip": { "description": { "messageByLocale": { - "en": "The action is ready." + "en": "Let's make sure the player comes back to the start screen after closing the **leaderboard**.", + "fr": "Faisons en sorte que le joueur ou la joueuse revienne à l'écran d'ouverture après avoir fermé le **classement**.", + "es": "Vamos a asegurarnos de que el jugador vuelva a la pantalla de inicio después de cerrar el **tablero de clasificación**.", + "pt": "Vamos garantir que o jogador volte para a tela inicial depois de fechar o **quadro de classificação**.", + "th": "ทำให้มั่นใจว่าผู้เล่นจะกลับมาที่หน้าเริ่มต้นหลังกดปิด **leaderboard**", + "ar": "هيّا نتحقق أن اللاعبين سيعودون إلى شاشة البداية بعد إغلاق **لوحة الصدارة**." } - }, - "placement": "top" + } } }, { + "id": "SwitchToEvents7", "nextStepTrigger": { "presenceOfElement": "#instruction-editor-dialog" }, @@ -4123,7 +6419,12 @@ "standalone": true, "description": { "messageByLocale": { - "en": "Let's change the **scene** to the **leaderboard** one (so that the play scene is closed).\n\nIn the **event** where $(target) gets deleted, click on “Add action”." + "en": "In the event where $(target) gets deleted, click on “Add action”.", + "fr": "Dans **l'évènement** où $(target) est supprimé, cliquez sur “Ajouter une action”.", + "es": "En el **evento** donde $(target) se elimina, haz clic en “Agregar acción”.", + "pt": "No **evento** onde $(target) é excluído, clique em “Adicionar ação”.", + "th": "ในอีเวนท์ที่ $(target) ถูกลบ กด “เพิ่มการกระทำ”", + "ar": "في الحدث الذي يتم حذف $(target) فيه، النقر على **إضافة إجراء**." } } } @@ -4136,7 +6437,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Type “**Scene**”." + "en": "Type “*Scene*”.", + "fr": "Cherchez “**Scène**”.", + "es": "Escribe “**Escena**”.", + "pt": "Digite “**Cena**”.", + "th": "พิมพ์ “*Scene*”", + "ar": "كتابة *مشهد*." } } }, @@ -4150,7 +6456,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select “Change the scene”." + "en": "Select “Change the scene”.", + "fr": "Cliquez sur “**Changer la scène**”.", + "es": "Selecciona “**Cambiar la escena**”.", + "pt": "Selecione “**Alterar a cena**”.", + "th": "เลือก “เปลี่ยน scene”", + "ar": "تحديد **تغيير المشهد**." } } }, @@ -4164,7 +6475,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Select “$(leaderboardScene)”." + "en": "Select “$(startScene)”.", + "fr": "Sélectionnez “$(startScene)”.", + "es": "Selecciona “$(startScene)”.", + "pt": "Selecione “$(startScene)”.", + "th": "เลือก “$(startScene)”", + "ar": "تحديد $(startScene)." } }, "placement": "top" @@ -4179,7 +6495,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Alright, the **action** is all set." + "en": "Alright, the action is all set.", + "fr": "L'action est bien configurée.", + "es": "La acción está configurada.", + "pt": "A ação está configurada.", + "th": "เอาล่ะ การกระทำถูกกำหนดเอาไว้เรียบร้อยแล้ว", + "ar": "حسنًا، تم ضبط الإجراء تمامًا." } }, "placement": "top" @@ -4188,12 +6509,17 @@ { "elementToHighlightId": "#main-toolbar-project-manager-button", "nextStepTrigger": { - "presenceOfElement": "div[role=\"presentation\"]:not([aria-hidden=true]) #project-manager-tab-game-settings" + "presenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-game-settings" }, "tooltip": { "description": { "messageByLocale": { - "en": "Open the **Project Manager**." + "en": "Open the **Project Manager**.", + "fr": "Ouvrez le **Gestionnaire de projet**.", + "es": "Abre el **Administrador de proyectos**.", + "pt": "Abra o **Gerenciador de projetos**.", + "th": "เปิด **โปรเจกต์เมเนเจอร์**", + "ar": "فتح **مدير المشروع**." } }, "placement": "right" @@ -4207,7 +6533,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Right-click on the start **scene** and select **Set as start scene**." + "en": "Right-click on $(startScene) and select **Set as start scene**.", + "fr": "Faites un clic droit sur $(startScene) et sélectionnez **Définir comme scène de départ**.", + "es": "Haz clic derecho en $(startScene) y selecciona **Establecer como escena de inicio**.", + "pt": "Clique com o botão direito em $(startScene) e selecione **Definir como cena inicial**.", + "th": "คลิกขวาที่ $(startScene) และเลือก **ตั้งเป็น scene เริ่มต้น**", + "ar": "نقرة بزر الفأرة الأيمن على $(startScene) وتحديد **تعيين كمشهد بداية**." } }, "placement": "right" @@ -4215,6 +6546,27 @@ "isOnClosableDialog": true }, { + "elementToHighlightId": "editorTab:startScene:Scene", + "nextStepTrigger": { + "editorIsActive": "startScene:Scene" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Come back to the start scene *$(startScene)*.", + "fr": "Retournons à la scène d'ouverture *$(startScene)*.", + "es": "Vuelve a la escena de inicio *$(startScene)*.", + "pt": "Volte para a cena inicial *$(startScene)*.", + "th": "กลับไปยัง scene เริ่มต้น *$(startScene)*", + "ar": "العودة إلى مشهد البداية *$(startScene)*." + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "id": "SwitchToStartScene", "elementToHighlightId": "#toolbar-preview-button", "nextStepTrigger": { "previewLaunched": true @@ -4222,7 +6574,12 @@ "tooltip": { "description": { "messageByLocale": { - "en": "Click on the **Preview** button." + "en": "Click on the **Preview** button.", + "fr": "Lancez un **Aperçu** de votre jeu.", + "es": "Haz clic en el botón **Vista previa**.", + "pt": "Clique no botão **Pré-visualizar**.", + "th": "คลิกปุ่ม **ดูตัวอย่าง**", + "ar": "وأخيرًا.. النقر على الزر **معاينة**." } }, "placement": "bottom" diff --git a/tutorials/in-app/healthBar.json b/tutorials/in-app/healthBar.json new file mode 100644 index 0000000..c009794 --- /dev/null +++ b/tutorials/in-app/healthBar.json @@ -0,0 +1,1086 @@ +{ + "id": "healthBar", + "titleByLocale": { + "en": "Let's communicate to the player the remaining health points", + "fr": "Communiquons au joueur les points de vie restants", + "ar": "لنخبر اللاعب بنقاط الصحة المتبقية", + "de": "Teilen wir dem Spieler die verbleibenden Gesundheitspunkte mit", + "es": "Comuniquemos al jugador los puntos de salud restantes", + "fi": "Kerrotaan pelaajalle jäljellä olevat terveyspisteet", + "it": "Comunichiamo al giocatore i punti salute rimanenti", + "tr": "Oyuncuya kalan sağlık puanlarını iletelim", + "ja": "プレイヤーに残りの体力ポイントを伝えましょう", + "ko": "플레이어에게 남은 체력 포인트를 알려줍시다", + "pl": "Przekażmy graczowi pozostałe punkty zdrowia", + "pt": "Vamos comunicar ao jogador os pontos de saúde restantes", + "th": "สื่อสารกับผู้เล่นเกี่ยวกับแต้มสุขภาพที่เหลืออยู่", + "ru": "Сообщим игроку оставшиеся очки здоровья", + "sl": "Sporočimo igralcu preostale točke zdravja", + "sq": "Le të komunikojmë me lojtarin pikët e mbetura të shëndetit", + "uk": "Повідомимо гравцеві про залишок очок здоров'я", + "zh": "让我们告诉玩家剩余的健康点数" + }, + "bulletPointsByLocale": [ + { + "en": "Use a prefab for a health bar", + "fr": "Utilisez un préfabriqué pour une barre de santé", + "ar": "استخدم نموذجاً جاهزاً لشريط الصحة", + "de": "Verwende ein vorgefertigtes Modell für eine Gesundheitsleiste", + "es": "Usa un prefab para una barra de salud", + "fi": "Käytä valmista mallia terveyspalkkiota varten", + "it": "Usa un prefab per una barra della salute", + "tr": "Sağlık çubuğu için bir prefabrika kullan", + "ja": "ヘルスバーのプレハブを使用する", + "ko": "체력 바를 위한 프리팹 사용", + "pl": "Użyj prefabrykatu dla paska zdrowia", + "pt": "Use um prefab para uma barra de saúde", + "th": "ใช้พรีแฟบสำหรับแถบสุขภาพ", + "ru": "Используйте префаб для индикатора здоровья", + "sl": "Uporabite predlogo za zdravstveno vrstico", + "sq": "Përdorni një prefab për një shirit shëndeti", + "uk": "Використовуйте префаб для індикатора здоров'я", + "zh": "使用预制件作为健康条" + }, + { + "en": "Update the health bar based on the player's health", + "fr": "Mettre à jour la barre de santé en fonction de la santé du joueur", + "ar": "تحديث شريط الصحة بناءً على صحة اللاعب", + "de": "Aktualisiere die Gesundheitsleiste basierend auf der Gesundheit des Spielers", + "es": "Actualizar la barra de salud según la salud del jugador", + "fi": "Päivitä terveyspalkkia pelaajan terveyden perusteella", + "it": "Aggiorna la barra della salute in base alla salute del giocatore", + "tr": "Oyuncunun sağlığına göre sağlık çubuğunu güncelle", + "ja": "プレイヤーの健康に基づいてヘルスバーを更新する", + "ko": "플레이어의 체력에 따라 체력 바를 업데이트하세요", + "pl": "Aktualizuj pasek zdrowia w oparciu o zdrowie gracza", + "pt": "Atualize a barra de saúde com base na saúde do jogador", + "th": "อัปเดตแถบสุขภาพตามสุขภาพของผู้เล่น", + "ru": "Обновите индикатор здоровья в зависимости от здоровья игрока", + "sl": "Posodobite zdravstveno vrstico glede na zdravje igralca", + "sq": "Përditësoni shiritin e shëndetit bazuar në shëndetin e lojtarit", + "uk": "Оновіть індикатор здоров'я відповідно до здоров'я гравця", + "zh": "根据玩家的健康状况更新健康条" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "level" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "level" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/healthBar/game.json", + "initialProjectData": { + "level": "Level", + "player": "Player" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Ju keni perfunduar kete mesim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, voici ce que vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du geler:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa opit miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu dersi tamamladınız ve şunları öğrendiniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다.", + "pl": "Dobrze, w tym samouczku nauczyłeś się, jak:", + "pt": "Bom trabalho, neste tutorial você aprendeu como:", + "ru": "Хорошо, в этом уроке вы узнали, как:", + "sl": "Bravo, v tem vadnem programu ste se naučili, kako:", + "sq": "Bravo, ne kete mesim ju keni mesuar si te:", + "th": "ทำได้ดีเยี่ยม, ในบทเรียนนี้คุณได้เรียนรู้วิธี:", + "uk": "Добре, в цьому уроці ви дізналися, як:", + "zh": "做得好,在本教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- Use a prefab for a health bar\n\n- Update the health bar based on the player's health", + "fr": "- Ajouter et utiliser un objet préfabriqué\n\n- Mettre à jour la barre de vie en fonction de la vie du joueur", + "ar": "- استخدام كائن جاهز للاستخدام لشريط الصحة\n\n- تحديث شريط الصحة استنادًا إلى صحة اللاعب", + "de": "- Verwenden Sie ein Prefab für eine Gesundheitsleiste\n\n- Aktualisieren Sie die Gesundheitsleiste basierend auf der Gesundheit des Spielers", + "es": "- Usar un objeto prefab para una barra de salud\n\n- Actualizar la barra de salud en función de la salud del jugador", + "fi": "- Käytä valmista mallia terveyspalkkiota varten\n\n- Päivitä terveyspalkkia pelaajan terveyden perusteella", + "it": "- Utilizzare un prefab per una barra della salute\n\n- Aggiornare la barra della salute in base alla salute del giocatore", + "tr": "- Sağlık çubuğu için bir prefabrika kullan\n\n- Oyuncunun sağlığına göre sağlık çubuğunu güncelle", + "ja": "- プレハブを使用してヘルスバーを作成する\n\n- プレイヤーのヘルスに基づいてヘルスバーを更新する", + "ko": "- 건강 막대에 프리팹 사용\n\n- 플레이어의 건강에 따라 건강 막대 업데이트", + "pl": "- Użyj prefabrykatu do paska zdrowia\n\n- Zaktualizuj pasek zdrowia na podstawie zdrowia gracza", + "pt": "- Usar um prefab para uma barra de saúde\n\n- Atualizar a barra de saúde com base na saúde do jogador", + "ru": "- Использовать префаб для полосы здоровья\n\n- Обновлять полосу здоровья на основе здоровья игрока", + "sl": "- Uporabite predlogo za zdravstveno vrstico\n\n- Posodobite zdravstveno vrstico na podlagi zdravja igralca", + "sq": "- Përdor një prefab për një shirit të shëndetit\n\n- Përditëso shiritin e shëndetit bazuar në shëndetin e lojtarit", + "th": "- ใช้ prefab สำหรับ health bar\n\n- อัพเดท health bar ตามค่าเลือดของผู้เล่น", + "uk": "- Використовуйте префаб для смуги здоров'я\n\n- Оновлюйте смугу здоров'я на основі здоров'я гравця", + "zh": "- 使用预制件制作健康条\n\n- 根据玩家的健康状况更新健康条" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des choses à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir agregando cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaisemista!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye devam edebilir veya yayınlayabilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、公開することができます!", + "ko": "이 게임에 더 많은 것을 추가하거나 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Ju mund te vazhdoni te shtoni gjera te kete loje, ose publikoje!", + "th": "คุณสามารถพัฒนาเกมนี้ต่อไปหรือจะเผยแพร่เลยก็ได้!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续为这个游戏添加东西,或者发布它!" + } + } + ] + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a platformer where the player has only 3 lives, but there is no interface to display them yet. Let's check the current state of the game.\n\nClick on the **Preview** button to play.\n\nYou can move the player with the arrow keys and jump with the spacebar.", + "fr": "Ce jeu est un jeu de plateforme où le joueur n'a que 3 vies, mais il n'y a pas encore d'interface pour les afficher. Voyons l'état actuel du jeu.\n\nCliquez sur le bouton **Aperçu** pour jouer.\n\nVous pouvez déplacer le joueur avec les flèches directionnelles et sauter avec la barre d'espace.", + "ar": "هذه اللعبة هي لعبة منصات حيث يملك اللاعب 3 أرواح فقط، ولكن لا توجد واجهة لعرضها بعد. دعونا نتحقق من حالة اللعبة الحالية.\n\nانقر على زر **المعاينة** للعب.\n\nيمكنك تحريك اللاعب باستخدام مفاتيح الأسهم والقفز باستخدام مفتاح المسافة.", + "de": "Dieses Spiel ist ein Platformer, bei dem der Spieler nur 3 Leben hat, aber es gibt noch keine Anzeige dafür. Lassen Sie uns den aktuellen Spielstand überprüfen.\n\nKlicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.\n\nSie können die Figur mit den Pfeiltasten bewegen und mit der Leertaste springen.", + "es": "Este juego es un plataformas donde el jugador solo tiene 3 vidas, pero aún no hay una interfaz para mostrarlas. Veamos el estado actual del juego.\n\nHaz clic en el botón **Vista previa** para jugar.\n\nPuedes mover al jugador con las teclas de flecha y saltar con la barra espaciadora.", + "fi": "Tämä peli on tasohyppely, jossa pelaajalla on vain 3 elämää, mutta niiden näyttämiseen ei ole vielä käyttöliittymää. Katsotaan pelin nykytilaa.\n\nNapsauta **Esikatselu**-painiketta pelataksesi.\n\nVoit liikuttaa hahmoa nuolinäppäimillä ja hypätä välilyönnillä.", + "it": "Questo gioco è un platformer in cui il giocatore ha solo 3 vite, ma non c'è ancora un'interfaccia per mostrarle. Vediamo lo stato attuale del gioco.\n\nClicca sul pulsante **Anteprima** per giocare.\n\nPuoi muovere il personaggio con le frecce direzionali e saltare con la barra spaziatrice.", + "tr": "Bu oyun, oyuncunun yalnızca 3 cana sahip olduğu, ancak bunları gösterecek bir arayüzün henüz olmadığı bir platform oyunudur. Mevcut oyun durumunu kontrol edelim.\n\nOynamak için **Önizleme** düğmesine tıklayın.\n\nKarakteri ok tuşlarıyla hareket ettirebilir ve boşluk tuşuyla zıplatabilirsiniz.", + "ja": "このゲームは、プレイヤーが3つのライフしか持っていませんが、それを表示するインターフェースはまだありません。現在のゲームの状態を確認しましょう。\n\n**プレビュー**ボタンをクリックしてプレイしてください。\n\n矢印キーでキャラクターを移動し、スペースバーでジャンプできます。", + "ko": "이 게임은 플레이어가 3개의 목숨만 가지고 있지만, 이를 표시할 인터페이스가 아직 없는 플랫폼 게임입니다. 현재 게임 상태를 확인해 보겠습니다.\n\n플레이하려면 **미리보기** 버튼을 클릭하세요.\n\n화살표 키로 캐릭터를 이동하고 스페이스바로 점프할 수 있습니다.", + "pl": "Ta gra to platformówka, w której gracz ma tylko 3 życia, ale nie ma jeszcze interfejsu do ich wyświetlania. Sprawdźmy aktualny stan gry.\n\nKliknij przycisk **Podgląd**, aby zagrać.\n\nMożesz poruszać się strzałkami i skakać spacją.", + "pt": "Este jogo é um jogo de plataforma onde o jogador tem apenas 3 vidas, mas ainda não há uma interface para exibi-las. Vamos verificar o estado atual do jogo.\n\nClique no botão **Pré-visualização** para jogar.\n\nVocê pode mover o personagem com as setas do teclado e pular com a barra de espaço.", + "th": "เกมนี้เป็นเกมแพลตฟอร์มที่ผู้เล่นมีเพียง 3 ชีวิต แต่ยังไม่มีอินเทอร์เฟซสำหรับแสดงผล มาดูสถานะปัจจุบันของเกมกัน\n\nคลิกปุ่ม **ดูตัวอย่าง** เพื่อเล่น\n\nคุณสามารถเคลื่อนที่ด้วยปุ่มลูกศรและกระโดดด้วยแป้นเว้นวรรค", + "ru": "Эта игра — платформер, в котором у игрока всего 3 жизни, но пока нет интерфейса для их отображения. Давайте проверим текущее состояние игры.\n\nНажмите кнопку **Предварительный просмотр**, чтобы играть.\n\nВы можете двигаться с помощью стрелок и прыгать пробелом.", + "sl": "Ta igra je platformer, kjer ima igralec samo 3 življenja, vendar še ni vmesnika za njihovo prikazovanje. Preverimo trenutno stanje igre.\n\nKliknite gumb **Predogled**, da igrate.\n\nIgralca lahko premikate s puščičnimi tipkami in skačete s preslednico.", + "sq": "Kjo lojë është një platformë ku lojtari ka vetëm 3 jetë, por ende nuk ka një ndërfaqe për t'i shfaqur ato. Le të shohim gjendjen aktuale të lojës.\n\nKlikoni butonin **Parashikim** për të luajtur.\n\nMund të lëvizni lojtarin me shigjetat dhe të kërceheni me hapësirën.", + "uk": "Ця гра — платформер, у якій гравець має лише 3 життя, але поки що немає інтерфейсу для їх відображення. Давайте перевіримо поточний стан гри.\n\nНатисніть кнопку **Попередній перегляд**, щоб грати.\n\nПереміщайте гравця за допомогою стрілок і стрибайте пробілом.", + "zh": "这个游戏是一款平台游戏,玩家只有3条生命,但目前还没有界面显示它们。让我们检查当前的游戏状态。\n\n点击 **预览** 按钮开始游戏。\n\n你可以用方向键移动角色,并使用空格键跳跃。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "The character loses a life when hitting a chainsaw. The game restarts after the player loses 3 lives, but there's no visible life bar yet. We're going to add one! Let's fix it! Close this window and return to the editor.", + "fr": "Le personnage perd une vie lorsqu'il touche une tronçonneuse. Le jeu redémarre après la perte de 3 vies, mais la barre de vie n'est pas encore visible. Nous allons en ajouter une ! Corrigeons cela ! Fermez cette fenêtre et retournez à l'éditeur.", + "ar": "تفقد الشخصية حياة عند الاصطدام بالمنشار. تُعاد اللعبة بعد فقدان اللاعب 3 أرواح، لكن شريط الحياة غير مرئي بعد. سنقوم بإضافته! لنصلح ذلك! أغلق هذه النافذة وارجع إلى المحرر.", + "de": "Die Figur verliert ein Leben, wenn sie eine Kettensäge berührt. Das Spiel startet neu, nachdem der Spieler 3 Leben verloren hat, aber die Lebensleiste ist noch nicht sichtbar. Wir werden eine hinzufügen! Lassen Sie es uns beheben! Schließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "El personaje pierde una vida al tocar una motosierra. El juego se reinicia después de perder 3 vidas, pero la barra de vida aún no es visible. ¡Vamos a añadir una! ¡Arreglémoslo! Cierra esta ventana y vuelve al editor.", + "fi": "Hahmo menettää elämän osuessaan moottorisahaan. Peli käynnistyy uudelleen, kun pelaaja menettää 3 elämää, mutta elämänpalkkia ei vielä näy. Lisätään se! Korjataan tämä! Sulje tämä ikkuna ja palaa editoriin.", + "it": "Il personaggio perde una vita quando tocca una motosega. Il gioco si riavvia dopo che il giocatore perde 3 vite, ma la barra della vita non è ancora visibile. La aggiungeremo! Sistemiamolo! Chiudi questa finestra e torna all'editor.", + "tr": "Karakter, bir testereye çarptığında bir can kaybeder. Oyuncu 3 can kaybettikten sonra oyun yeniden başlar, ancak henüz görünür bir can çubuğu yok. Bir tane ekleyeceğiz! Hadi düzeltelim! Bu pencereyi kapat ve editöre geri dön.", + "ja": "キャラクターはチェーンソーに当たるとライフを失います。プレイヤーが3回ライフを失うとゲームが再スタートしますが、ライフバーはまだ表示されていません。ライフバーを追加しましょう!修正しましょう!このウィンドウを閉じてエディターに戻ってください。", + "ko": "캐릭터는 전기톱에 닿으면 생명을 잃습니다. 플레이어가 3개의 생명을 모두 잃으면 게임이 다시 시작되지만, 아직 생명 막대가 보이지 않습니다. 추가하겠습니다! 수정해 봅시다! 이 창을 닫고 편집기로 돌아가세요.", + "pl": "Postać traci życie, gdy dotknie piły łańcuchowej. Gra restartuje się po utracie 3 żyć, ale pasek życia nie jest jeszcze widoczny. Dodamy go! Naprawmy to! Zamknij to okno i wróć do edytora.", + "pt": "O personagem perde uma vida ao tocar em uma serra elétrica. O jogo reinicia após o jogador perder 3 vidas, mas a barra de vida ainda não está visível. Vamos adicionar uma! Vamos corrigir isso! Feche esta janela e volte para o editor.", + "th": "ตัวละครสูญเสียพลังชีวิตเมื่อโดนเลื่อยไฟฟ้า เกมจะเริ่มใหม่หลังจากผู้เล่นเสียพลังชีวิต 3 ครั้ง แต่ยังไม่มีแถบพลังชีวิตให้เห็น เราจะเพิ่มมันเข้าไป! มาแก้ไขกันเถอะ! ปิดหน้าต่างนี้แล้วกลับไปที่ตัวแก้ไข", + "ru": "Персонаж теряет жизнь при столкновении с бензопилой. Игра перезапускается после потери 3 жизней, но шкала жизни пока не отображается. Мы её добавим! Давайте исправим это! Закройте это окно и вернитесь в редактор.", + "sl": "Lik izgubi življenje, ko zadene motorno žago. Igra se ponovno zažene po izgubi 3 življenj, vendar vrstica življenj še ni vidna. Dodali jo bomo! Popravimo to! Zaprite to okno in se vrnite v urejevalnik.", + "sq": "Karakteri humb një jetë kur prek një sharrë elektrike. Loja riniset pasi lojtari humbet 3 jetë, por shiritit i jetës nuk është ende i dukshëm. Do ta shtojmë! Ta rregullojmë këtë! Mbylle këtë dritare dhe kthehu te redaktori.", + "uk": "Персонаж втрачає життя при зіткненні з бензопилою. Гра перезапускається після втрати 3 життів, але шкала життя поки не відображається. Ми її додамо! Давайте це виправимо! Закрийте це вікно і поверніться до редактора.", + "zh": "角色碰到电锯时会失去一条生命。玩家失去3条生命后游戏会重新开始,但生命条尚未显示。我们将添加一个!让我们来修复它!关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-layers-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-layer-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "First, let's open the **Layers** panel.", + "fr": "Premièrement, ouvrons le panneau des **calques**.", + "ar": "أولًا، هيّا نفتح لوحة **الطبقات**.", + "de": "Zuerst öffnen wir das **Ebenen**-Panel.", + "es": "Primero, abramos el panel de **Capas**.", + "fi": "Ensinnäkin, avataan **Tasot**-paneeli.", + "it": "Prima di tutto, apriamo il pannello **Livelli**.", + "tr": "Öncelikle **Katmanlar** panelini açalım.", + "ja": "まず、**レイヤー** パネルを開きましょう。", + "ko": "먼저 **레이어** 패널을 엽니다.", + "pl": "Najpierw otwórzmy panel **Warstwy**.", + "pt": "Primeiro, vamos abrir o painel de **Camadas**.", + "ru": "Сначала давайте откроем панель **Слои**.", + "sl": "Najprej odprite ploščo **Plasti**.", + "sq": "Se fillimi, e hapim **Layers** panel.", + "th": "เปิดแผงควบคุม **เลเยอร์**", + "uk": "Спочатку давайте відкриємо панель **Шари**.", + "zh": "首先,让我们打开 **图层** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#layer-2 #layer-selected-unchecked", + "nextStepTrigger": { + "presenceOfElement": "#layer-2 #layer-selected-checked" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Interface** layer so we can place our health bar inside of it.", + "fr": "Sélectionnons le calque **Interface** pour y placer notre barre de vie.", + "ar": "حدد طبقة **الواجهة** حتى نتمكن من وضع شريط الصحة بداخلها.", + "de": "Wählen Sie die **Interface**-Ebene aus, damit wir unsere Gesundheitsleiste darin platzieren können.", + "es": "Selecciona la capa **Interface** para que podamos colocar nuestra barra de salud dentro de ella.", + "fi": "Valitse **Liitä**-kerros, jotta voimme sijoittaa terveyspalkkimme sen sisälle.", + "it": "Seleziona il livello **Interface** in modo da poter posizionare la nostra barra della salute al suo interno.", + "tr": "Sağlık çubuğumuzu içine yerleştirebilmemiz için **Arayüz** katmanını seçin.", + "ja": "**Interface** レイヤーを選択して、ヘルスバーをその中に配置しましょう。", + "ko": "**Interface** 레이어를 선택하여 건강 막대를 그 안에 배치할 수 있도록 합니다.", + "pl": "Wybierz warstwę **Interface**, abyśmy mogli umieścić nasz pasek zdrowia wewnątrz niej.", + "pt": "Selecione a camada **Interface** para que possamos colocar nossa barra de saúde dentro dela.", + "ru": "Выберите слой **Interface**, чтобы мы могли поместить нашу полосу здоровья внутри него.", + "sl": "Izberite **Interface** plast, da lahko vanjo postavimo našo zdravstveno vrstico.", + "sq": "Zgjidh **Interface** layer që të vendosim shiritin e shëndetit brenda tij.", + "th": "เลือก **Interface** เพื่อที่เราจะสามารถวาง health bar ไว้ในนั้น", + "uk": "Виберіть **Interface** шар, щоб ми могли розмістити нашу смугу здоров'я всередині нього.", + "zh": "选择 **Interface** 图层,这样我们就可以把健康条放在里面。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト** パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **obiektów**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **объектов**.", + "sl": "Odpri ploščo **objektov**.", + "sq": "Hape panelin **Objekte**", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **об'єктів**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#add-new-object-button", + "nextStepTrigger": { + "presenceOfElement": "#new-object-dialog" + }, + "tooltip": { + "placement": "top", + "description": { + "messageByLocale": { + "en": "Let's show players how much health they have left with a health bar.", + "fr": "Ajoutons une barre de vie pour que le joueur ou la joueuse puisse voir combien de vie il lui reste.", + "ar": "هيّا نظهر للاعبين كم تبقى من الصحة لديهم بواسطة شريط الصحة.", + "de": "Zeigen wir den Spielern, wie viel Gesundheit sie noch haben, mit einer Gesundheitsleiste.", + "es": "Agreguemos una barra de salud para que el jugador pueda ver cuánta salud le queda.", + "fi": "Näytetään pelaajille, kuinka paljon terveyttä heillä on jäljellä terveyspalkin avulla.", + "it": "Mostriamo ai giocatori quanta salute gli rimane con una barra della salute.", + "tr": "Oyunculara ne kadar sağlık kaldığını bir sağlık çubuğu ile gösterelim.", + "ja": "プレイヤーがどれだけの体力を残しているかをヘルスバーで表示しましょう。", + "ko": "건강 막대로 플레이어에게 얼마나 많은 체력이 남았는지 보여줍시다.", + "pl": "Pokażmy graczom, ile zdrowia im zostało, za pomocą paska zdrowia.", + "pt": "Vamos mostrar aos jogadores quanto de saúde eles têm com uma barra de saúde.", + "ru": "Давайте покажем игрокам, сколько у них осталось здоровья, с помощью полосы здоровья.", + "sl": "Pokažimo igralcem, koliko zdravja jim je ostalo, s pomočjo zdravstvene vrstice.", + "sq": "Të tregojmë lojtarëve sa shëndet u ka mbetur me një shirit të shëndetit.", + "th": "เพิ่ม health bar ให้กับผู้เล่น เพื่อให้สามารถดูได้ว่าเหลือเลือดอยู่เท่าไร", + "uk": "Давайте покажемо гравцям, скільки у них залишилося здоров'я, за допомогою смуги здоров'я.", + "zh": "让我们用健康条来显示玩家还剩下多少生命值。" + } + } + } + }, + { + "elementToHighlightId": "#asset-store-tab", + "nextStepTrigger": { + "presenceOfElement": "#asset-store" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's choose a **prefab object** from the asset store", + "fr": "Nous allons choisir un **objet préfabriqué** dans le magasin de ressources.", + "ar": "هيّا نختار **كائن جاهز للاستخدام** من متجر العناصر", + "de": "Wählen wir ein **Prefab-Objekt** aus dem Asset-Store aus.", + "es": "Vamos a elegir un **objeto prefab** de la tienda de recursos.", + "fi": "Valitaan **valmis objekti** resurssikaupasta.", + "it": "Scegliamo un **oggetto prefabbricato** dal negozio di risorse.", + "tr": "Varlık mağazasından bir **prefabrika nesne** seçelim.", + "ja": "アセットストアから**プレハブオブジェクト**を選びましょう", + "ko": "자산 상점에서 **프리팹 오브젝트**를 선택해봅시다.", + "pl": "Wybierzmy **obiekt prefabrykowany** ze sklepu zasobów.", + "pt": "Vamos escolher um **objeto prefab** da loja de recursos.", + "ru": "Давайте выберем **префаб-объект** из магазина ресурсов.", + "sl": "Izberimo **predlogo** iz trgovine z viri.", + "sq": "Të zgjedhim një **objekt prefab** nga dyqani i burimeve.", + "th": "เลือก **วัตถุ prefab** จากร้านค้า asset", + "uk": "Оберемо **префаб-об'єкт** з магазину ресурсів.", + "zh": "让我们从资源商店中选择一个**预制对象**。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-store #home-button", + "nextStepTrigger": { + "presenceOfElement": "#asset-store-home[data-is-filtered=\"false\"]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's go back to the store home page.", + "fr": "Retournons à la page d'accueil du magasin.", + "ar": "هيّا نعود إلى صفحة المتجر الرئيسية.", + "de": "Gehen wir zurück zur Startseite des Stores.", + "es": "Volvamos a la página de inicio de la tienda.", + "fi": "Palataan kaupan etusivulle.", + "it": "Torniamo alla pagina iniziale del negozio.", + "tr": "Mağaza ana sayfasına geri dönelim.", + "ja": "ストアのホームページに戻りましょう。", + "ko": "상점 홈페이지로 돌아가봅시다.", + "pl": "Wróćmy do strony głównej sklepu.", + "pt": "Vamos voltar para a página inicial da loja.", + "ru": "Вернемся на главную страницу магазина.", + "sl": "Pojdimo nazaj na domačo stran trgovine.", + "sq": "Të kthehemi në faqen kryesore të dyqanit.", + "th": "กลับไปยังหน้าโฮมเพจของร้านค้า", + "uk": "Повернемося на головну сторінку магазину.", + "zh": "让我们回到商店的主页。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-pack-category-prefab", + "nextStepTrigger": { + "presenceOfElement": "#asset-store-home[data-is-filtered=\"true\"] #asset-pack-resource-bars" + }, + "tooltip": { + "placement": "bottom", + "description": { + "messageByLocale": { + "en": "We will use an object that comes with pre-made actions and conditions. We call this a **Ready to use object**.", + "fr": "Nous allons utiliser un objet préfabriqué. C'est un objet qui vient avec ses propres actions et conditions, ce qui simplifie son utilisation.", + "ar": "سوف نستخدم كائن يأتي مع إجراءات وشروط معدّة مسبقًا. نحن نسميه **كائن جاهز للاستخدام**.", + "de": "Wir werden ein Objekt verwenden, das mit vorgefertigten Aktionen und Bedingungen geliefert wird. Wir nennen dies ein **Fertig zum Verwenden-Objekt**.", + "es": "Vamos a usar un objeto prefab. Es un objeto que viene con sus propias acciones y condiciones, lo que simplifica su uso.", + "fi": "Käytämme valmista objektia, joka sisältää valmiiksi tehtyjä toimintoja ja ehtoja. Kutsumme tätä **Valmiiksi käytettäväksi objektiksi**.", + "it": "Useremo un oggetto che viene fornito con azioni e condizioni predefinite. Lo chiamiamo **Oggetto pronto all'uso**.", + "tr": "Hazır aksiyonlar ve koşullarla birlikte gelen bir nesne kullanacağız. Buna **Kullanıma Hazır Nesne** diyoruz.", + "ja": "事前に作成されたアクションと条件が付属しているオブジェクトを使用します。これを**使用準備完了オブジェクト**と呼びます。", + "ko": "미리 만들어진 액션과 조건이 포함된 객체를 사용할 것입니다. 이것을 **사용 준비된 객체**라고 부릅니다.", + "pl": "Będziemy używać obiektu, który jest dostarczany z gotowymi akcjami i warunkami. Nazywamy to **Gotowy do użycia obiekt**.", + "pt": "Vamos usar um objeto prefab. É um objeto que vem com suas próprias ações e condições, o que simplifica seu uso.", + "ru": "Мы будем использовать объект, который поставляется с готовыми действиями и условиями. Мы называем это **Готовый к использованию объект**.", + "sl": "Uporabili bomo predmet, ki prihaja s predhodno pripravljenimi dejanji in pogoji. Imenujemo ga **Pripravljen za uporabo predmet**.", + "sq": "Do të përdorim një objekt që vjen me veprime dhe kushte të parapërgatitura. Ne e quajmë këtë **Objekt gati për përdorim**.", + "th": "เราจะใช้วัตถุ prefab มันเป็นวัตถุที่มีการกระทำและเงื่อนไขแบบพิเศษ", + "uk": "Ми будемо використовувати об'єкт, який постачається з готовими діями та умовами. Ми називаємо це **Готовий до використання об'єкт**.", + "zh": "我们将使用一个带有预先制作的动作和条件的对象。我们称之为**准备好使用的对象**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-store-home[data-is-filtered=\"true\"] #asset-pack-resource-bars", + "nextStepTrigger": { + "presenceOfElement": "#asset-card-Flat-Heart-Bar" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will use a resource bar that can be filled or emptied.", + "fr": "Nous allons utiliser une barre de ressource. Elle peut être remplie ou vidée.", + "ar": "سوف نستخدم شريط موارد يمكن ملؤه أو إفراغه.", + "de": "Wir werden eine Ressourcenleiste verwenden, die gefüllt oder geleert werden kann.", + "es": "Vamos a usar una barra de recursos que se puede llenar o vaciar.", + "fi": "Käytämme resurssipalkkia, joka voidaan täyttää tai tyhjentää.", + "it": "Useremo una barra delle risorse che può essere riempita o svuotata.", + "tr": "Doldurulabilir veya boşaltılabilir bir kaynak çubuğu kullanacağız.", + "ja": "満たすことも空にすることもできるリソースバーを使用します。", + "ko": "채울 수도 비울 수도 있는 자원 막대를 사용할 것입니다.", + "pl": "Będziemy używać paska zasobów, który można wypełnić lub opróżnić.", + "pt": "Vamos usar uma barra de recursos que pode ser preenchida ou esvaziada.", + "ru": "Мы будем использовать полосу ресурсов, которую можно заполнить или опустошить.", + "sl": "Uporabili bomo vrstico virov, ki jo je mogoče napolniti ali izprazniti.", + "sq": "Do të përdorim një shirit burimesh që mund të mbushet ose zbrazet.", + "th": "เราจะใช้ resource bar ที่สามารถเติมให้เต็มหรือล้างให้เกลี้ยงได้", + "uk": "Ми будемо використовувати смугу ресурсів, яку можна заповнити або опорожнити.", + "zh": "我们将使用一个可以填充或清空的资源条。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-card-Flat-Heart-Bar", + "nextStepTrigger": { + "presenceOfElement": "#add-asset-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's choose the hearts bar.", + "fr": "Choisissons la barre de coeurs.", + "ar": "هيّا نختار شريط القلوب.", + "de": "Wählen wir die Herzleiste.", + "es": "Elegimos la barra de corazones.", + "fi": "Valitaan sydänpalkki.", + "it": "Scegliamo la barra dei cuori.", + "tr": "Kalp çubuğunu seçelim.", + "ja": "ハートバーを選びましょう。", + "ko": "하트 바를 선택해봅시다.", + "pl": "Wybierzmy pasek serc.", + "pt": "Vamos escolher a barra de corações.", + "ru": "Давайте выберем полосу сердец.", + "sl": "Izberimo vrstico src.", + "sq": "Të zgjedhim shiritin e zemrave.", + "th": "มาเลือก hearts bar กัน", + "uk": "Оберемо смугу сердець.", + "zh": "让我们选择心形条。" + } + } + } + }, + { + "elementToHighlightId": "#add-asset-button", + "nextStepTrigger": { + "objectAddedInLayout": true + }, + "mapProjectData": { + "resourceBar": "sceneLastObjectName:level" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's add it to the scene.", + "fr": "Ajoutons la à la scène.", + "ar": "هيّا نقوم بإضافته إلى المشهد.", + "de": "Fügen wir es zur Szene hinzu.", + "es": "Agreguemosla a la escena.", + "fi": "Lisätään se kohtaukseen.", + "it": "Aggiungiamola alla scena.", + "tr": "Onu sahneye ekleyelim.", + "ja": "シーンに追加しましょう。", + "ko": "씬에 추가해봅시다.", + "pl": "Dodajmy to do sceny.", + "pt": "Vamos adicioná-la à cena.", + "ru": "Добавим его в сцену.", + "sl": "Dodajmo ga v sceno.", + "sq": "Të shtojmë në skenë.", + "th": "เพิ่มลงไปใน scene", + "uk": "Додамо його до сцени.", + "zh": "让我们把它添加到场景中。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#close-button", + "nextStepTrigger": { + "absenceOfElement": "#new-object-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's close the asset store.", + "fr": "Fermons le magasin de ressources", + "ar": "هيّا نغلق متجر العناصر.", + "de": "Schließen wir den Asset-Store.", + "es": "Cerramos la tienda de recursos.", + "fi": "Suljetaan resurssikauppa.", + "it": "Chiudiamo il negozio di risorse.", + "tr": "Varlık mağazasını kapatalım.", + "ja": "アセットストアを閉じましょう。", + "ko": "자산 상점을 닫아봅시다.", + "pl": "Zamknijmy sklep zasobów.", + "pt": "Vamos fechar a loja de recursos.", + "ru": "Давайте закроем магазин ресурсов.", + "sl": "Zaprimo trgovino z viri.", + "sq": "Të mbyjmë dyqanin e burimeve.", + "th": "ปิดร้านค้า asset", + "uk": "Давайте закриємо магазин ресурсів.", + "zh": "让我们关闭资源商店。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト** パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **obiektów**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **объектов**.", + "sl": "Odpri ploščo **objektov**.", + "sq": "Hape panelin **Objekte**", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **об'єктів**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:resourceBar", + "nextStepTrigger": { + "instanceAddedOnScene": "resourceBar" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag the **$(resourceBar)** to the scene.", + "fr": "Faites glisser **$(resourceBar)** du menu à la scène.", + "ar": "سحب الـ **$(resourceBar)** إلى المشهد.", + "de": "Ziehen Sie **$(resourceBar)** in die Szene.", + "es": "Arrastra **$(resourceBar)** desde el menú a la escena.", + "fi": "Vedä **$(resourceBar)** kohtaukseen.", + "it": "Trascina **$(resourceBar)** nella scena.", + "tr": "**$(resourceBar)**'ı sahneye sürükleyin.", + "ja": "**$(resourceBar)** をシーンにドラッグしてください。", + "ko": "**$(resourceBar)**를 씬으로 끌어다 놓습니다.", + "pl": "Przeciągnij **$(resourceBar)** na scenę.", + "pt": "Arraste **$(resourceBar)** do menu para a cena.", + "ru": "Перетащите **$(resourceBar)** на сцену.", + "sl": "Povlecite **$(resourceBar)** v sceno.", + "sq": "Tërhiqni **$(resourceBar)** në skenë.", + "th": "ลาก **$(resourceBar)** ใส่ลงใน scene", + "uk": "Перетягніть **$(resourceBar)** на сцену.", + "zh": "将 **$(resourceBar)** 拖到场景中。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Select the **$(resourceBar)**, then drag it to the scene.", + "fr": "Sélectionnez **$(resourceBar)**, puis faites-le glisser à la scène.", + "ar": "تحديد الـ **$(resourceBar)** ثم سحبه إلى المشهد.", + "de": "Wählen Sie **$(resourceBar)** aus und ziehen Sie es dann in die Szene.", + "es": "Selecciona **$(resourceBar)**, luego arrástralo a la escena.", + "fi": "Valitse **$(resourceBar)** ja vedä se kohtaukseen.", + "it": "Seleziona **$(resourceBar)**, quindi trascinalo nella scena.", + "tr": "**$(resourceBar)**'ı seçin, ardından sahneye sürükleyin.", + "ja": "**$(resourceBar)** を選択し、シーンにドラッグしてください。", + "ko": "**$(resourceBar)**를 선택한 다음 씬으로 끌어다 놓습니다.", + "pl": "Wybierz **$(resourceBar)**, a następnie przeciągnij go na scenę.", + "pt": "Selecione **$(resourceBar)**, em seguida, arraste-o para a cena.", + "ru": "Выберите **$(resourceBar)**, затем перетащите его на сцену.", + "sl": "Izberite **$(resourceBar)**, nato ga povlecite v sceno.", + "sq": "Zgjidh **$(resourceBar)**, pastaj tërhiqeni në skenë.", + "th": "เลือก **$(resourceBar)** แล้วลากมันเข้า scene", + "uk": "Виберіть **$(resourceBar)**, а потім перетягніть його на сцену.", + "zh": "选择 **$(resourceBar)**,然后将其拖到场景中。" + } + } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Ich bin fertig", + "es": "He terminado", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Zakończono", + "pt": "Terminei", + "ru": "Я закончил", + "sl": "Končano", + "sq": "Une mbarova", + "th": "เสร็จแล้ว", + "uk": "Закінчено", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "See the **black rectangular frame** in the middle of the scene? That is the **camera view**. It frames the part of the game that the player will see.\n\nPlace the $(resourceBar) on the top left corner of the **camera view**.", + "fr": "Vous voyez le **rectangle noir** au milieu de la scène ? C'est la **vue de la caméra**. C'est le point de vue à partir duquel le joueur verra le jeu.\n\nPlacez $(resourceBar) dans le coin en haut à gauche du rectangle.", + "ar": "هل يمكنك رؤية **الإطار المستطيلي الأسود** في منتصف المشهد؟ ها هو **رؤية الكاميرا**. إنه يحيط بالجزء الذي يمكن للاعبين رؤيته من اللعبة.\n\nإدراج الـ $(resourceBar) في أعلى يسار زاوية **رؤية الكاميرا**.", + "de": "Siehst du den **schwarzen rechteckigen Rahmen** in der Mitte der Szene? Das ist die **Kameraperspektive**. Sie umrahmt den Teil des Spiels, den der Spieler sehen wird.\n\nPlatziere $(resourceBar) in der oberen linken Ecke der **Kameraperspektive**.", + "es": "¿Ves el **rectángulo negro** en el centro de la escena? Esta es la **vista de la cámara**. Es el punto de vista desde el que el jugador verá el juego.\n\nColoca $(resourceBar) en la esquina superior izquierda del rectángulo.", + "fi": "Näetkö **mustan suorakulmion** kohtauksen keskellä? Se on **kameran näkymä**. Se rajaa pelin osan, jonka pelaaja näkee.\n\nAseta $(resourceBar) **kameran näkymän** vasempaan yläkulmaan.", + "it": "Vedi il cornice rettangolare nero al centro della scena? Questa è la visuale della telecamera. Incornicia la parte del gioco che il giocatore vedrà.\n\nPosiziona $(resourceBar) nell'angolo in alto a sinistra della visuale della telecamera.", + "tr": "Ortadaki **siyah dikdörtgen çerçeveyi** görebiliyor musunuz? Bu **kamera görüşü**. Oyuncunun göreceği oyunun bir kısmını çerçeveler.\n\n$(resourceBar)'ı **kamera görüşü**nün sol üst köşesine yerleştirin.", + "ja": "シーンの中央にある黒い長方形の枠を見てください。それがカメラビューです。プレイヤーが見るゲームの一部をフレーム内に収めます。\n\n$(resourceBar)をカメラビューの左上隅に配置してください。", + "ko": "장면 중앙에 있는 검은 직사각형 프레임을(를) 보세요? 이것이 카메라 뷰입니다. 플레이어가 볼 게임의 일부를 프레임 안에 포함시킵니다.\n\n$(resourceBar)을(를) 카메라 뷰의 왼쪽 상단 모서리에 배치하세요.", + "pl": "Zauważ czarną prostokątną ramkę pośrodku sceny? To widok kamery. Ogranicza on część gry, którą gracz będzie widział.\n\nUmieść $(resourceBar) w lewym górnym rogu widoku kamery.", + "pt": "Você vê o **retângulo preto** no meio da cena? Esta é a **visão da câmera**. É o ponto de vista a partir do qual o jogador verá o jogo.\n\nColoque $(resourceBar) no canto superior esquerdo do retângulo.", + "ru": "Заметьте **черный прямоугольный кадр** посередине сцены? Это **вид камеры**. Он ограничивает часть игры, которую увидит игрок.\n\nРазместите $(resourceBar) в левом верхнем углу **вида камеры**.", + "sl": "Vidite **črni pravokotni okvir** v sredini prizora? To je **pogled kamere**. Okvirja del igre, ki ga bo igralec videl.\n\nPostavite $(resourceBar) v zgornji levi kot **pogleda kamere**.", + "sq": "Shihni **kornizën e zezë drejtkëndëshe** në mes të skenës? Kjo është **pamja e kamerës**. Ajo përcakton pjesën e lojës që lojtari do të shohë.\n\nVendos $(resourceBar) në cepin e sipërm majtë të **pamjes së kamerës**.", + "th": "เห็น **สี่เหลี่ยมสีดำ** ตรงกลางของ scene ไหม? นั่นคือ**มุมมองกล้อง** เป็นมุมมองที่ผู้เล่นจะมองเห็นเกม\n\nจัดวาง $(resourceBar) ให้อยู่ในมุมซ้ายบนของสี่เหลี่ยม\n\nเมื่อเสร็จแล้ว คลิกด้านล่าง", + "uk": "Бачите **чорний прямокутний кадр** посередині сцени? Це **вид камери**. Він обмежує частину гри, яку побачить гравець.\n\nРозмістіть $(resourceBar) в лівому верхньому куті **виду камери**.", + "zh": "看到场景中间的**黑色矩形框**了吗?那是**相机视图**。它框住了玩家将看到的游戏部分。\n\n将 $(resourceBar) 放在**相机视图**的左上角。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSI1Mi45MzEgMzAuMDE2IDE0MC4yNzkgOTUuMTY4IiB3aWR0aD0iMTQwLjI3OSIgaGVpZ2h0PSI5NS4xNjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3QgeD0iNTIuOTUiIHk9IjI5Ljk4NCIgd2lkdGg9IjE0MC4yNzkiIGhlaWdodD0iOTUuMTY4IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IG5vbmU7IHN0cm9rZS13aWR0aDogMnB4OyIvPgogIDxnIHN0eWxlPSJzdHJva2U6IG5vbmU7IHN0cm9rZS13aWR0aDogMDsgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHQ7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1taXRlcmxpbWl0OiAxMDsgZmlsbDogbm9uZTsgZmlsbC1ydWxlOiBub256ZXJvOyBvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJtYXRyaXgoMC4xMzk5MzEsIDAsIDAsIDAuMTM5OTMxLCA1OC42MDk0MTcsIDM0LjE2ODMyNykiPgogICAgPHBhdGggZD0iTSA0NSA4NC4zMzQgTCA2LjgwMiA0Ni4xMzYgQyAyLjQxNiA0MS43NSAwIDM1LjkxOCAwIDI5LjcxNiBjIDAgLTYuMjAzIDIuNDE2IC0xMi4wMzQgNi44MDIgLTE2LjQyIGMgNC4zODYgLTQuMzg2IDEwLjIxNyAtNi44MDIgMTYuNDIgLTYuODAyIGMgNi4yMDMgMCAxMi4wMzQgMi40MTYgMTYuNDIgNi44MDIgTCA0NSAxOC42NTQgbCA1LjM1OCAtNS4zNTggYyA0LjM4NiAtNC4zODYgMTAuMjE4IC02LjgwMiAxNi40MiAtNi44MDIgYyA2LjIwMyAwIDEyLjAzNCAyLjQxNiAxNi40MiA2LjgwMiBsIDAgMCBsIDAgMCBDIDg3LjU4NSAxNy42ODIgOTAgMjMuNTEzIDkwIDI5LjcxNiBjIDAgNi4yMDMgLTIuNDE1IDEyLjAzNCAtNi44MDIgMTYuNDIgTCA0NSA4NC4zMzQgeiBNIDIzLjIyMiAxMC40OTQgYyAtNS4xMzQgMCAtOS45NjEgMiAtMTMuNTkyIDUuNjMgUyA0IDI0LjU4MiA0IDI5LjcxNiBzIDIgOS45NjEgNS42MyAxMy41OTIgTCA0NSA3OC42NzggbCAzNS4zNyAtMzUuMzcgQyA4NC4wMDEgMzkuNjc3IDg2IDM0Ljg1IDg2IDI5LjcxNiBzIC0xLjk5OSAtOS45NjEgLTUuNjMgLTEzLjU5MiBsIDAgMCBjIC0zLjYzMSAtMy42MyAtOC40NTcgLTUuNjMgLTEzLjU5MiAtNS42MyBjIC01LjEzNCAwIC05Ljk2MSAyIC0xMy41OTIgNS42MyBMIDQ1IDI0LjMxMSBsIC04LjE4NyAtOC4xODcgQyAzMy4xODMgMTIuNDk0IDI4LjM1NiAxMC40OTQgMjMuMjIyIDEwLjQ5NCB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsgZmlsbDogcmdiKDIyMSwgMjAsIDE1NCk7IiB0cmFuc2Zvcm09IiBtYXRyaXgoMSAwIDAgMSAwIDApICIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPC9nPgogIDxnIHN0eWxlPSJzdHJva2U6IG5vbmU7IHN0cm9rZS13aWR0aDogMDsgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHQ7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1taXRlcmxpbWl0OiAxMDsgZmlsbDogbm9uZTsgZmlsbC1ydWxlOiBub256ZXJvOyBvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJtYXRyaXgoMC4xMzk5MzEsIDAsIDAsIDAuMTM5OTMxLCA3My42MDk0MjEsIDM0LjE2ODMyNykiPgogICAgPHBhdGggZD0iTSA0NSA4NC4zMzQgTCA2LjgwMiA0Ni4xMzYgQyAyLjQxNiA0MS43NSAwIDM1LjkxOCAwIDI5LjcxNiBjIDAgLTYuMjAzIDIuNDE2IC0xMi4wMzQgNi44MDIgLTE2LjQyIGMgNC4zODYgLTQuMzg2IDEwLjIxNyAtNi44MDIgMTYuNDIgLTYuODAyIGMgNi4yMDMgMCAxMi4wMzQgMi40MTYgMTYuNDIgNi44MDIgTCA0NSAxOC42NTQgbCA1LjM1OCAtNS4zNTggYyA0LjM4NiAtNC4zODYgMTAuMjE4IC02LjgwMiAxNi40MiAtNi44MDIgYyA2LjIwMyAwIDEyLjAzNCAyLjQxNiAxNi40MiA2LjgwMiBsIDAgMCBsIDAgMCBDIDg3LjU4NSAxNy42ODIgOTAgMjMuNTEzIDkwIDI5LjcxNiBjIDAgNi4yMDMgLTIuNDE1IDEyLjAzNCAtNi44MDIgMTYuNDIgTCA0NSA4NC4zMzQgeiBNIDIzLjIyMiAxMC40OTQgYyAtNS4xMzQgMCAtOS45NjEgMiAtMTMuNTkyIDUuNjMgUyA0IDI0LjU4MiA0IDI5LjcxNiBzIDIgOS45NjEgNS42MyAxMy41OTIgTCA0NSA3OC42NzggbCAzNS4zNyAtMzUuMzcgQyA4NC4wMDEgMzkuNjc3IDg2IDM0Ljg1IDg2IDI5LjcxNiBzIC0xLjk5OSAtOS45NjEgLTUuNjMgLTEzLjU5MiBsIDAgMCBjIC0zLjYzMSAtMy42MyAtOC40NTcgLTUuNjMgLTEzLjU5MiAtNS42MyBjIC01LjEzNCAwIC05Ljk2MSAyIC0xMy41OTIgNS42MyBMIDQ1IDI0LjMxMSBsIC04LjE4NyAtOC4xODcgQyAzMy4xODMgMTIuNDk0IDI4LjM1NiAxMC40OTQgMjMuMjIyIDEwLjQ5NCB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsgZmlsbDogcmdiKDIyMSwgMjAsIDE1NCk7IiB0cmFuc2Zvcm09IiBtYXRyaXgoMSAwIDAgMSAwIDApICIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPC9nPgogIDxnIHN0eWxlPSJzdHJva2U6IG5vbmU7IHN0cm9rZS13aWR0aDogMDsgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsgc3Ryb2tlLWxpbmVjYXA6IGJ1dHQ7IHN0cm9rZS1saW5lam9pbjogbWl0ZXI7IHN0cm9rZS1taXRlcmxpbWl0OiAxMDsgZmlsbDogbm9uZTsgZmlsbC1ydWxlOiBub256ZXJvOyBvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJtYXRyaXgoMC4xMzk5MzEsIDAsIDAsIDAuMTM5OTMxLCA4OC42MDk0MjEsIDM0LjE2ODMyNykiPgogICAgPHBhdGggZD0iTSA0NSA4NC4zMzQgTCA2LjgwMiA0Ni4xMzYgQyAyLjQxNiA0MS43NSAwIDM1LjkxOCAwIDI5LjcxNiBjIDAgLTYuMjAzIDIuNDE2IC0xMi4wMzQgNi44MDIgLTE2LjQyIGMgNC4zODYgLTQuMzg2IDEwLjIxNyAtNi44MDIgMTYuNDIgLTYuODAyIGMgNi4yMDMgMCAxMi4wMzQgMi40MTYgMTYuNDIgNi44MDIgTCA0NSAxOC42NTQgbCA1LjM1OCAtNS4zNTggYyA0LjM4NiAtNC4zODYgMTAuMjE4IC02LjgwMiAxNi40MiAtNi44MDIgYyA2LjIwMyAwIDEyLjAzNCAyLjQxNiAxNi40MiA2LjgwMiBsIDAgMCBsIDAgMCBDIDg3LjU4NSAxNy42ODIgOTAgMjMuNTEzIDkwIDI5LjcxNiBjIDAgNi4yMDMgLTIuNDE1IDEyLjAzNCAtNi44MDIgMTYuNDIgTCA0NSA4NC4zMzQgeiBNIDIzLjIyMiAxMC40OTQgYyAtNS4xMzQgMCAtOS45NjEgMiAtMTMuNTkyIDUuNjMgUyA0IDI0LjU4MiA0IDI5LjcxNiBzIDIgOS45NjEgNS42MyAxMy41OTIgTCA0NSA3OC42NzggbCAzNS4zNyAtMzUuMzcgQyA4NC4wMDEgMzkuNjc3IDg2IDM0Ljg1IDg2IDI5LjcxNiBzIC0xLjk5OSAtOS45NjEgLTUuNjMgLTEzLjU5MiBsIDAgMCBjIC0zLjYzMSAtMy42MyAtOC40NTcgLTUuNjMgLTEzLjU5MiAtNS42MyBjIC01LjEzNCAwIC05Ljk2MSAyIC0xMy41OTIgNS42MyBMIDQ1IDI0LjMxMSBsIC04LjE4NyAtOC4xODcgQyAzMy4xODMgMTIuNDk0IDI4LjM1NiAxMC40OTQgMjMuMjIyIDEwLjQ5NCB6IiBzdHlsZT0ic3Ryb2tlOiBub25lOyBzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7IHN0cm9rZS1saW5lY2FwOiBidXR0OyBzdHJva2UtbGluZWpvaW46IG1pdGVyOyBzdHJva2UtbWl0ZXJsaW1pdDogMTA7IGZpbGwtcnVsZTogbm9uemVybzsgb3BhY2l0eTogMTsgZmlsbDogcmdiKDIyMSwgMjAsIDE1NCk7IiB0cmFuc2Zvcm09IiBtYXRyaXgoMSAwIDAgMSAwIDApICIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPC9nPgogIDxyZWN0IHg9IjEwOC43MjMiIHk9IjUxLjI4IiB3aWR0aD0iMzAuNzExIiBoZWlnaHQ9IjMzLjA5MSIgc3R5bGU9ImZpbGw6IHJnYigyMTMsIDE3NywgMTQ5KTsiLz4KICA8cmVjdCB4PSIxMzkuMjI5IiB5PSI1MS44MjgiIHdpZHRoPSIxOC45NDciIGhlaWdodD0iMzIuNTQ0IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMTQyLCAxNDIsIDE0Mik7Ii8+CiAgPHJlY3QgeD0iODkuOTg3IiB5PSI1MS44MjgiIHdpZHRoPSIxOC45NDciIGhlaWdodD0iMzIuNTQ0IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMTQyLCAxNDIsIDE0Mik7Ii8+CiAgPHJlY3QgeD0iODkuOTgxIiB5PSI4NC4zMzIiIHdpZHRoPSI2OC4xODYiIGhlaWdodD0iMTYuMzciIHN0eWxlPSJzdHJva2U6IHJnYigxNDIsIDE0MiwgMTQyKTsiLz4KPC9zdmc+" + } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "editorTab:level:EventsSheet", + "nextStepTrigger": { + "presenceOfElement": "#events-editor[data-active]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now we'll link the health of the **$(player)** to **$(resourceBar)**! Click on the tab Events to go to the **Events Sheet** of your $(level) scene.", + "fr": "Maintenant, branchons la vie du **$(player)** avec **$(resourceBar)** ! Cliquez sur l'onglet Évènements de la scène $(level) pour accéder à la **feuille d'événements**.", + "ar": "الآن سوف نربط صحة الـ **$(player)** بالـ **$(resourceBar)**! الضغط على نافذة الأحداث للذهاب إلى **صفحة الأحداث** الخاصة بالمشهد $(level).", + "de": "Jetzt verknüpfen wir die Gesundheit des **$(player)** mit **$(resourceBar)**! Klicken Sie auf die Registerkarte Ereignisse, um zum **Ereignisblatt** Ihrer Szene $(level) zu gelangen.", + "es": "Ahora, conectemos la vida del **$(player)** con **$(resourceBar)**! Abramos la **hoja de eventos** de la escena $(level).", + "fi": "Nyt yhdistämme **$(player)**'n terveyden **$(resourceBar)**iin! Avaa $(level)-kohtauksen **Tapahtumataulu**.", + "it": "Ora collegheremo la vita del **$(player)** a **$(resourceBar)**! Clicca sulla scheda Eventi per andare alla **scheda Eventi** della tua scena $(level).", + "tr": "Şimdi **$(player)**'ın sağlığını **$(resourceBar)** ile bağlayacağız! $(level) sahnenizin **Olay Sayfası**'na gitmek için Olaylar sekmesine tıklayın.", + "ja": "今度は **$(player)** の体力を **$(resourceBar)** にリンクしましょう! イベントタブをクリックして、$(level) シーンの **イベントシート** に移動します。", + "ko": "이제 **$(player)**의 체력을 **$(resourceBar)**에 연결해 보겠습니다! **이벤트** 탭을 클릭하여 $(level) 씬의 **이벤트 시트**로 이동합니다.", + "pl": "Teraz połączymy zdrowie **$(player)** z **$(resourceBar)**! Kliknij kartę Wydarzenia, aby przejść do **arkusza wydarzeń** sceny $(level).", + "pt": "Agora, vamos conectar a vida do **$(player)** com **$(resourceBar)**! Vamos **abrir a Folha de Eventos** da cena $(level).", + "ru": "Теперь мы свяжем здоровье **$(player)** с **$(resourceBar)**! Нажмите на вкладку События, чтобы перейти к **таблице событий** вашей сцены $(level).", + "sl": "Zdaj bomo povezali zdravje **$(player)** z **$(resourceBar)**! Kliknite na zavihek Dogodki, da odprete **preglednico dogodkov** vaše scene $(level).", + "sq": "Tani do të lidhim shëndetin e **$(player)** me **$(resourceBar)**! Kliko në skedën Ngjarje për të shkuar te **Fletë e Ngjarjeve** të skenës $(level).", + "th": "ทีนี้ มาเชื่อมเลือดของ **$(player)** กับ **$(resourceBar)**กันเถอะ! ให้ **เปิดชี้ทอีเวนต์** จาก scene $(level)", + "uk": "Тепер ми зв'яжемо здоров'я **$(player)** з **$(resourceBar)**! Натисніть на вкладку Події, щоб перейти до **таблиці подій** вашої сцени $(level).", + "zh": "现在我们将把 **$(player)** 的生命值与 **$(resourceBar)** 连接起来!点击事件标签,进入你的 $(level) 场景的 **事件表**。" + } + }, + "placement": "bottom" + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "#events-editor[data-active] #event-1-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's **add an action** to define the number of lifes that will be displayed on $(resourceBar).", + "fr": "**Ajoutons une action** pour changer le nombre de vies affichées par $(resourceBar).", + "ar": "هيّا نقوم ب**إضافة إجراء** لتعريف عدد المحاولات التي سيتم عرضها على $(resourceBar).", + "de": "**Fügen wir eine Aktion hinzu**, um die Anzahl der Leben zu definieren, die auf $(resourceBar) angezeigt werden.", + "es": "**Agreguemos una acción** para cambiar el valor de relleno de $(resourceBar).", + "fi": "Lisätään **toiminto**, joka määrittää elämien määrän, joka näytetään $(resourceBar)-palkissa.", + "it": "**Aggiungiamo un'azione** per definire il numero di vite che verrà visualizzato su $(resourceBar).", + "tr": "$(resourceBar) üzerinde görüntülenecek can sayısını tanımlamak için bir **eylem ekleyelim**.", + "ja": "$(resourceBar) に表示されるライフの数を定義するために **アクションを追加** しましょう。", + "ko": "$(resourceBar)에 표시될 라이프의 수를 정의하기 위해 **액션을 추가**해 보겠습니다.", + "pl": "Dodajmy **akcję**, aby zdefiniować liczbę żyć, która będzie wyświetlana na $(resourceBar).", + "pt": "**Adicionemos uma ação** para alterar o valor de preenchimento de $(resourceBar).", + "ru": "Добавим **действие**, чтобы определить количество жизней, которое будет отображаться на $(resourceBar).", + "sl": "Dodajmo **dejanje**, da določimo število življenj, ki se bodo prikazala na $(resourceBar).", + "sq": "Le të **shtojmë një veprim** për të përcaktuar numrin e jetëve që do të shfaqen në $(resourceBar).", + "th": "ให้ **เพิ่มการกระทำ** เพื่อเปลี่ยนค่าที่จะเพิ่มขึ้นของ $(resourceBar)", + "uk": "Додаймо **дію**, щоб визначити кількість життів, які будуть відображатися на $(resourceBar).", + "zh": "让我们**添加一个动作**来定义在 $(resourceBar) 上显示的生命值的数量。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:resourceBar", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TiledUnitsBar--TiledUnitsBar--SetValue" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(resourceBar)**.", + "fr": "Sélectionnez **$(resourceBar)**.", + "ar": "تحديد **$(resourceBar)**.", + "de": "Wähle **$(resourceBar)**.", + "es": "Seleccione **$(resourceBar)**.", + "fi": "Valitse **$(resourceBar)**.", + "it": "Seleziona **$(resourceBar)**.", + "tr": "**$(resourceBar)**'ı seçin.", + "ja": "**$(resourceBar)** を選択します。", + "ko": "**$(resourceBar)**를 선택합니다.", + "pl": "Wybierz **$(resourceBar)**.", + "pt": "Selecione **$(resourceBar)**.", + "ru": "Выберите **$(resourceBar)**.", + "sl": "Izberi **$(resourceBar)**.", + "sq": "Zgjidh **$(resourceBar)**.", + "th": "เลือก **$(resourceBar)**", + "uk": "Виберіть **$(resourceBar)**.", + "zh": "选择 **$(resourceBar)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TiledUnitsBar--TiledUnitsBar--SetValue", + "nextStepTrigger": { + "presenceOfElement": "#parameter-1-operator-field" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the action **Value**.", + "fr": "Sélectionnez l'action **Value**.", + "ar": "تحديد الإجراء **Value**.", + "de": "Wähle die Aktion **Value**.", + "es": "Seleccione la acción **Value**.", + "fi": "Valitse toiminto **Value**.", + "it": "Seleziona l'azione **Value**.", + "tr": "Eylemi **Value** olarak seçin.", + "ja": "アクション **Value** を選択します。", + "ko": "액션 **Value**를 선택합니다.", + "pl": "Wybierz akcję **Value**.", + "pt": "Selecione a ação **Value**.", + "ru": "Выберите действие **Value**.", + "sl": "Izberi dejanje **Value**.", + "sq": "Zgjidh veprimin **Value**.", + "th": "เลือกการกระทำ **Value**", + "uk": "Виберіть дію **Value**.", + "zh": "选择动作 **Value**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#open-number-expression-popover-button", + "nextStepTrigger": { + "presenceOfElement": "#expression-selector" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now, let's use the value where the health of $(player) is saved.", + "fr": "Trouvons où est stockée la santé de $(player).", + "ar": "والآن، هيّا نستخدم القيمة التي تكون فيها صحة الـ $(player) محفوظة.", + "de": "Lassen Sie uns jetzt den Wert verwenden, in dem die Gesundheit von $(player) gespeichert ist.", + "es": "Encontremos dónde está almacenada la salud de $(player).", + "fi": "Nyt käytetään $(player) terveyden tallennuspaikkaa.", + "it": "Ora, usiamo il valore in cui è salvata la vita di $(player).", + "tr": "Şimdi, $(player) sağlığının saklandığı değeri kullanalım.", + "ja": "$(player) の体力が保存されている値を使いましょう。", + "ko": "$(player)의 체력이 저장된 곳의 값을 사용해 보겠습니다.", + "pl": "Teraz użyjmy wartości, w której jest zapisane zdrowie $(player).", + "pt": "Vamos encontrar onde está armazenada a saúde de $(player).", + "ru": "Теперь давайте используем значение, в котором сохранено здоровье $(player).", + "sl": "Zdaj uporabimo vrednost, kjer je shranjeno zdravje $(player).", + "sq": "Tani, le të përdorim vlerën ku është ruajtur shëndeti i $(player).", + "th": "มาดูกันว่าค่าเลือดของผู้เล่นเก็บไว้ที่ไหน", + "uk": "Тепер давайте використаємо значення, де зберігається здоров'я $(player).", + "zh": "现在,让我们使用保存 $(player) 生命值的值。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-selector input", + "nextStepTrigger": { + "presenceOfElement": "#instruction-or-expression-Health" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "A **Health extension** has been applied to $(player) to store its lives. Search **Health** to use that value.", + "fr": "L'**extension Santé** a été appliquée à $(player) pour stocker son nombre de vies. Cherchez **Santé** pour utiliser cette valeur.", + "ar": "تم تطبيق **ملحق الصحة** على الـ $(player) لتخزين عدد المحاولات. ابحث عن **الصحة** لاستخدام هذه القيمة.", + "de": "Eine **Gesundheitserweiterung** wurde auf $(player) angewendet, um seine Leben zu speichern. Suchen Sie nach **Gesundheit**, um diesen Wert zu verwenden.", + "es": "Se ha aplicado una **extensión de salud** a $(player) para almacenar sus vidas. Busca **Salud** para usar ese valor.", + "fi": "**Terveyslaajennus** on lisätty $(player):lle elämien tallentamiseksi. Etsi **Terveys** käyttääksesi tätä arvoa.", + "it": "Un'**estensione Salute** è stata applicata a $(player) per memorizzare le sue vite. Cerca **Salute** per utilizzare quel valore.", + "tr": "$(player) üzerinde hayatlarını saklamak için bir **Sağlık uzantısı** uygulandı. O değeri kullanmak için **Sağlık**'ı arayın.", + "ja": "$(player) にライフを保存するために **Health extension** が適用されています。その値を使用するには **Health** を検索してください。", + "ko": "$(player)의 생명을 저장하기 위해 **Health extension**이 적용되었습니다. 해당 값을 사용하려면 **Health**를 검색하세요.", + "pl": "Na $(player) zastosowano **rozszerzenie zdrowia**, aby przechować jego życia. Wyszukaj **zdrowie**, aby użyć tej wartości.", + "pt": "Uma **extensão de saúde** foi aplicada a $(player) para armazenar suas vidas. Pesquise **Saúde** para usar esse valor.", + "ru": "На $(player) было применено **расширение здоровья**, чтобы сохранить его жизни. Найдите **здоровье**, чтобы использовать это значение.", + "sl": "Na $(player) je bila uporabljena **razširitev zdravja**, da se shranijo njegova življenja. Poiščite **zdravje**, da uporabite to vrednost.", + "sq": "Një **zgjerim shëndeti** është aplikuar në $(player) për të ruajtur jetët e tij. Kërko **Shëndet** për të përdorur atë vlerë.", + "th": "ได้มีการใช้ **Health extension** กับผู้เล่นเพื่อเก็บค่าชีวิตของเขาไว้ ค้นหา **Health** เพื่อใช้ค่านี้", + "uk": "На $(player) було застосовано **розширення здоров'я**, щоб зберегти його життя. Знайдіть **здоров'я**, щоб використовувати це значення.", + "zh": "已在 $(player) 上应用了 **Health extension** 以存储其生命值。搜索 **Health** 以使用该值。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-or-expression-Health", + "nextStepTrigger": { + "presenceOfElement": "#expression-parameters-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **Health points**.", + "fr": "Sélectionnez **Points de santé**.", + "ar": "تحديد **Health points**.", + "de": "Wählen Sie **Gesundheitspunkte**.", + "es": "Seleccione **Puntos de salud**.", + "fi": "Valitse **Terveys**.", + "it": "Seleziona **Punti salute**.", + "tr": "**Sağlık puanları**'nı seçin.", + "ja": "**Health points** を選択します。", + "ko": "**Health points**를 선택합니다.", + "pl": "Wybierz **Punkty zdrowia**.", + "pt": "Selecione **Pontos de saúde**.", + "ru": "Выберите **Очки здоровья**.", + "sl": "Izberite **Zdravstvene točke**.", + "sq": "Zgjidh **Pikat e shëndetit**.", + "th": "เลือก **Health points**", + "uk": "Виберіть **Очки здоров'я**.", + "zh": "选择 **Health points**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-parameters-editor-dialog #parameter-0-object-selector", + "nextStepTrigger": { + "valueHasChanged": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(player)**.", + "fr": "Sélectionnez **$(player)**.", + "ar": "تحديد **$(player)**.", + "de": "Wählen Sie **$(player)**.", + "es": "Seleccione **$(player)**.", + "fi": "Valitse **$(player)**.", + "it": "Seleziona **$(player)**.", + "tr": "**$(player)**'ı seçin.", + "ja": "**$(player)** を選択します。", + "ko": "**$(player)**를 선택합니다.", + "pl": "Wybierz **$(player)**.", + "pt": "Selecione **$(player)**.", + "ru": "Выберите **$(player)**.", + "sl": "Izberi **$(player)**.", + "sq": "Zgjidh **$(player)**.", + "th": "เลือก **$(player)**", + "uk": "Виберіть **$(player)**.", + "zh": "选择 **$(player)**。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-parameters-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#expression-parameters-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're good.", + "fr": "On est bon.", + "ar": "نحن على الطريق الصحيح.", + "de": "Wir sind fertig.", + "es": "Estamos bien.", + "fi": "Olemme valmiita.", + "it": "Siamo a posto.", + "tr": "Her şey yolunda.", + "ja": "完了です。", + "ko": "준비 완료!", + "pl": "Jesteśmy gotowi.", + "pt": "Estamos bem.", + "ru": "Мы готовы.", + "sl": "V redu smo.", + "sq": "Jemi mirë.", + "th": "เรียบร้อยแล้ว", + "uk": "Ми готові.", + "zh": "我们好了。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Everything is all set.", + "fr": "Tout est bien configuré.", + "ar": "تم ضبط كل شيء.", + "de": "Alles ist bereit.", + "es": "Todo está bien configurado.", + "fi": "Kaikki on valmiina.", + "it": "Tutto è pronto.", + "tr": "Her şey hazır.", + "ja": "すべてが設定されました。", + "ko": "모든 것이 준비되었습니다.", + "pl": "Wszystko jest gotowe.", + "pt": "Tudo está configurado.", + "ru": "Все готово.", + "sl": "Vse je pripravljeno.", + "sq": "Gjithçka është e përgatitur.", + "th": "ทุกอย่างเรียบร้อยแล้ว", + "uk": "Все готово.", + "zh": "一切都准备好了。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + "fr": "Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.", + "ar": "حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.", + "de": "Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.", + "fi": "Olemme valmiita! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.", + "it": "abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.", + "tr": "Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.", + "ja": "完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。", + "ko": "우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.", + "pl": "Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.", + "pt": "Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.", + "ru": "Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.", + "sl": "Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。" + } + }, + "placement": "bottom" + } + } + ] +} diff --git a/tutorials/in-app/joystick.json b/tutorials/in-app/joystick.json new file mode 100644 index 0000000..3b92c43 --- /dev/null +++ b/tutorials/in-app/joystick.json @@ -0,0 +1,833 @@ +{ + "id": "joystick", + "titleByLocale": { + "en": "Let's add mobile controls to our game", + "fr": "Ajoutons des contrôles mobiles à notre jeu", + "ar": "لنضيف عناصر التحكم بالهاتف المحمول إلى لعبتنا", + "de": "Fügen wir unserem Spiel mobile Steuerungen hinzu", + "es": "Agreguemos controles móviles a nuestro juego", + "fi": "Lisätään mobiiliohjaimet peliimme", + "it": "Aggiungiamo i controlli mobili al nostro gioco", + "tr": "Oyunumuza mobil kontroller ekleyelim", + "ja": "ゲームにモバイルコントロールを追加しましょう", + "ko": "게임에 모바일 컨트롤을 추가합시다", + "pl": "Dodajmy sterowanie mobilne do naszej gry", + "pt": "Vamos adicionar controles móveis ao nosso jogo", + "th": "มาเพิ่มการควบคุมมือถือในเกมของเรากันเถอะ", + "ru": "Добавим мобильное управление в нашу игру", + "sl": "Dodajmo mobilne kontrole naši igri", + "sq": "Le të shtojmë kontrollin e telefonit në lojën tonë", + "uk": "Додамо мобільні елементи керування до нашої гри", + "zh": "让我们为游戏添加移动控制" + }, + "bulletPointsByLocale": [ + { + "en": "Add a joystick prefab", + "fr": "Ajoutez un préfabriqué de joystick", + "ar": "أضف نموذج عصا التحكم الجاهز", + "de": "Füge ein Joystick-Prefab hinzu", + "es": "Agrega un prefab de joystick", + "fi": "Lisää joystick prefab", + "it": "Aggiungi un prefab di joystick", + "tr": "Joystick prefabrikasını ekleyin", + "ja": "ジョイスティックのプレハブを追加する", + "ko": "조이스틱 프리팹 추가", + "pl": "Dodaj prefabrykowany joystick", + "pt": "Adicione um prefab de joystick", + "th": "เพิ่มจอยสติ๊กพรีแฟบ", + "ru": "Добавить префаб джойстика", + "sl": "Dodajte predlogo za krmilno palico", + "sq": "Shto një prefab joystick", + "uk": "Додайте префаб джойстика", + "zh": "添加一个操纵杆预制件" + }, + { + "en": "Add a behavior", + "fr": "Ajoutez un comportement", + "ar": "أضف سلوكًا", + "de": "Füge ein Verhalten hinzu", + "es": "Agrega un comportamiento", + "fi": "Lisää käyttäytyminen", + "it": "Aggiungi un comportamento", + "tr": "Davranış ekle", + "ja": "動作を追加する", + "ko": "행동 추가", + "pl": "Dodaj zachowanie", + "pt": "Adicione um comportamento", + "th": "เพิ่มพฤติกรรม", + "ru": "Добавить поведение", + "sl": "Dodajte vedenje", + "sq": "Shto një sjellje", + "uk": "Додайте поведінку", + "zh": "添加行为" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "gameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/joystick/game.json", + "initialProjectData": { + "gameScene": "GameScene", + "ship": "OrangePlayerShip3" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Ju keni perfunduar kete mesim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, voici ce que vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du geler:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa opit miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu dersde şunları öğrendiniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다.", + "pl": "Dobrze, w tym samouczku nauczyłeś się, jak:", + "pt": "Bom trabalho, neste tutorial você aprendeu como:", + "ru": "Хорошо, в этом уроке вы узнали, как:", + "sl": "Bravo, v tem vadnem programu ste se naučili, kako:", + "sq": "Bravo, ne kete mesim ju keni mesuar si te:", + "th": "ทำได้ดีเยี่ยม, ในบทเรียนนี้คุณได้เรียนรู้วิธี:", + "uk": "Добре, в цьому уроці ви дізналися, як:", + "zh": "做得好,在本教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- Add and use a prefab object\n\n- Use a behavior", + "fr": "- Comment ajouter et utiliser un objet préfabriqué\n\n- Comment utiliser un comportement", + "ar": "- إضافة واستخدام عناصر كائنات جاهزة للاستخدام\n\n- استخدام سلوك", + "de": "- Ein Prefab-Objekt hinzufügen und verwenden\n\n- Ein Verhalten verwenden", + "es": "- Cómo agregar y usar un objeto prefab\n\n- Cómo usar un comportamiento", + "fi": "- Lisää ja käytä prefab-objektia\n\n- Käytä käyttäytymistä", + "it": "- Aggiungere e utilizzare un oggetto prefab\n\n- Utilizzare un comportamento", + "tr": "- Bir prefab nesne eklemek ve kullanmak\n\n- Bir davranış kullanmak", + "ja": "- プレハブオブジェクトを追加して使用する\n\n- ビヘイビアを使用する", + "ko": "- 프리팹 오브젝트를 추가하고 사용하는 방법\n\n- 행동 사용하기", + "pl": "- Dodawanie i używanie obiektu prefab\n\n- Używanie zachowania", + "pt": "- Como adicionar e usar um objeto prefab\n\n- Como usar um comportamento", + "ru": "- Добавить и использовать объект prefab\n\n- Использовать поведение", + "sl": "- Dodajanje in uporaba predloge objekta\n\n- Uporaba vedenja", + "sq": "- Shto dhe perdor nje objekt prefab\n\n- Perdor nje veprim", + "th": "- วิธีเพิ่มและวิธีใช้วัตถุ prefab\n\n- วิธีใช้งานพฤติกรรม", + "uk": "- Додавання та використання об'єкта prefab\n\n- Використання поведінки", + "zh": "- 添加和使用预制对象\n\n- 使用行为" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des choses à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir agregando cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye devam edebilir veya yayınlayabilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、公開することができます!", + "ko": "이 게임에 더 많은 것을 추가하거나 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Ju mund te vazhdoni te shtoni gjera te kete loje, ose publikoje!", + "th": "คุณสามารถพัฒนาเกมนี้ต่อไปหรือจะเผยแพร่เลยก็ได้!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续为这个游戏添加东西,或者发布它!" + } + } + ] + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a top-down space shooter! Click the **Preview** button to play.\nOn PC, you can move the spaceship with the arrow keys, but on mobile, this is not possible. We will add this feature step by step. Play for a bit and come back to the editor when you're ready.", + "fr": "Ce jeu est un jeu de tir dans l'espace en vue du dessus ! Clique sur le bouton **Aperçu** pour jouer.\nSur PC, tu peux déplacer le vaisseau avec les flèches du clavier, sur mobile ce n'est pas possible, nous allons ajouter cette possibilité étape par étape. Joue un peu et reviens à l'éditeur quand tu es prêt.", + "ar": "هذه اللعبة هي لعبة إطلاق نار في الفضاء بمنظور علوي! انقر على زر **المعاينة** للعب.\nعلى الكمبيوتر، يمكنك تحريك السفينة باستخدام أسهم لوحة المفاتيح، لكن على الهاتف المحمول، هذا غير ممكن. سنضيف هذه الميزة خطوة بخطوة. العب قليلاً ثم عد إلى المحرر عندما تكون مستعدًا.", + "de": "Dieses Spiel ist ein Top-Down-Weltraum-Shooter! Klicke auf die Schaltfläche **Vorschau**, um zu spielen.\nAuf dem PC kannst du das Raumschiff mit den Pfeiltasten bewegen, aber auf dem Handy ist das nicht möglich. Wir werden diese Funktion Schritt für Schritt hinzufügen. Spiele eine Weile und kehre zum Editor zurück, wenn du bereit bist.", + "es": "¡Este juego es un shooter espacial en vista cenital! Haz clic en el botón **Vista previa** para jugar.\nEn PC, puedes mover la nave con las flechas del teclado, pero en móvil esto no es posible. Vamos a añadir esta función paso a paso. Juega un poco y vuelve al editor cuando estés listo.", + "fi": "Tämä peli on ylhäältä kuvattu avaruusräiskintäpeli! Klikkaa **Esikatselu**-painiketta pelataksesi.\nTietokoneella voit liikuttaa avaruusalusta nuolinäppäimillä, mutta mobiililaitteella se ei ole mahdollista. Lisäämme tämän ominaisuuden askel askeleelta. Pelaa hetki ja palaa editoriin, kun olet valmis.", + "it": "Questo gioco è uno sparatutto spaziale con vista dall'alto! Clicca sul pulsante **Anteprima** per giocare.\nSu PC, puoi spostare l'astronave con i tasti freccia, ma su mobile non è possibile. Aggiungeremo questa funzione passo dopo passo. Gioca un po' e torna all'editor quando sei pronto.", + "tr": "Bu oyun, yukarıdan görünümlü bir uzay nişancı oyunudur! Oynamak için **Önizleme** düğmesine tıkla.\nBilgisayarda, uzay gemisini ok tuşlarıyla hareket ettirebilirsin, ancak mobilde bu mümkün değil. Bu özelliği adım adım ekleyeceğiz. Biraz oyna ve hazır olduğunda editöre geri dön.", + "ja": "このゲームはトップダウン型のスペースシューティングゲームです!プレイするには **プレビュー** ボタンをクリックしてください。\nPCでは矢印キーで宇宙船を動かせますが、モバイルでは動きません。この機能を段階的に追加していきます。少し遊んで、準備ができたらエディターに戻りましょう。", + "ko": "이 게임은 탑다운 방식의 우주 슈팅 게임입니다! **미리보기** 버튼을 클릭하여 플레이하세요.\nPC에서는 화살표 키로 우주선을 이동할 수 있지만, 모바일에서는 불가능합니다. 이 기능을 단계별로 추가할 것입니다. 잠시 플레이한 후 준비가 되면 편집기로 돌아오세요.", + "pl": "Ta gra to strzelanka kosmiczna z widokiem z góry! Kliknij przycisk **Podgląd**, aby zagrać.\nNa komputerze możesz poruszać statkiem kosmicznym za pomocą strzałek, ale na urządzeniach mobilnych nie jest to możliwe. Dodamy tę funkcję krok po kroku. Zagraj chwilę i wróć do edytora, gdy będziesz gotowy.", + "pt": "Este jogo é um shooter espacial visto de cima! Clique no botão **Pré-visualização** para jogar.\nNo PC, você pode mover a nave com as setas do teclado, mas no celular isso não é possível. Vamos adicionar essa funcionalidade passo a passo. Jogue um pouco e volte ao editor quando estiver pronto.", + "th": "เกมนี้เป็นเกมยิงในอวกาศมุมมองจากด้านบน! คลิกปุ่ม **ดูตัวอย่าง** เพื่อเล่น\nบนพีซี คุณสามารถควบคุมยานอวกาศได้ด้วยปุ่มลูกศร แต่บนมือถือยังไม่สามารถทำได้ เราจะเพิ่มฟีเจอร์นี้ทีละขั้นตอน ลองเล่นสักครู่แล้วกลับไปที่ตัวแก้ไขเมื่อคุณพร้อม", + "ru": "Эта игра — космический шутер с видом сверху! Нажмите кнопку **Предпросмотр**, чтобы сыграть.\nНа ПК вы можете управлять кораблём с помощью стрелок, но на мобильных устройствах это невозможно. Мы добавим эту возможность поэтапно. Поиграйте немного и вернитесь в редактор, когда будете готовы.", + "sl": "Ta igra je vesoljska strelska igra s pogledom od zgoraj! Kliknite gumb **Predogled**, da igrate.\nNa računalniku lahko premikate vesoljsko ladjo s puščičnimi tipkami, vendar na mobilnih napravah to ni mogoče. To možnost bomo dodali korak za korakom. Igrajte malo in se vrnite v urejevalnik, ko boste pripravljeni.", + "sq": "Kjo lojë është një lojë e qëlluar në hapësirë me pamje nga lart! Kliko butonin **Paraqitje** për të luajtur.\nNë kompjuter, mund të lëvizësh anijen me shigjetat e tastierës, por në celular kjo nuk është e mundur. Do ta shtojmë këtë funksion hap pas hapi. Luaj pak dhe kthehu te redaktori kur të jesh gati.", + "uk": "Ця гра — це космічний шутер з видом зверху! Натисніть кнопку **Попередній перегляд**, щоб грати.\nНа ПК ви можете рухати космічний корабель за допомогою стрілок, але на мобільних пристроях це неможливо. Ми додамо цю можливість поступово. Пограйте трохи і поверніться до редактора, коли будете готові.", + "zh": "这是一款俯视视角的太空射击游戏!点击 **预览** 按钮进行游戏。\n在电脑上,你可以使用方向键移动飞船,但在手机上无法做到。我们将逐步添加这个功能。先玩一会儿,准备好后返回编辑器。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "Using the left and right keyboard keys on a computer, the spaceship can move, but not on mobile. Let's add a joystick to control the spaceship with fingers on mobile!\nClose this window and go back to the editor.", + "fr": "A l'aide des touches gauche et droite du clavier sur ordinateur le vaisseau peut bouger, mais pas sur mobile, ajoutons un joystick pour pouvoir controler le vaisseau avec les doigts sur mobile!\nFerme cette fenêtre et retourne à l'éditeur.", + "ar": "باستخدام مفاتيح السهم اليسار واليمين على لوحة المفاتيح في الكمبيوتر، يمكن للمركبة التحرك، ولكن ليس على الهاتف المحمول. لنضف عصا تحكم لقيادة المركبة بالأصابع على الهاتف المحمول!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Mit den linken und rechten Tasten auf der Tastatur kann sich das Raumschiff auf dem Computer bewegen, aber nicht auf Mobilgeräten. Fügen wir einen Joystick hinzu, um das Raumschiff mit den Fingern auf dem Handy zu steuern!\nSchließe dieses Fenster und kehre zum Editor zurück.", + "es": "Usando las teclas izquierda y derecha del teclado en la computadora, la nave puede moverse, pero no en el móvil. ¡Agreguemos un joystick para controlar la nave con los dedos en el móvil!\nCierra esta ventana y vuelve al editor.", + "fi": "Tietokoneella avaruusalus voi liikkua vasemmalla ja oikealla nuolinäppäimellä, mutta ei mobiilissa. Lisätään ohjain, jotta sitä voi ohjata sormilla mobiililaitteella!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Usando i tasti sinistra e destra della tastiera su computer, l'astronave può muoversi, ma non su mobile. Aggiungiamo un joystick per controllare l'astronave con le dita su mobile!\nChiudi questa finestra e torna all'editor.", + "tr": "Bilgisayarda sol ve sağ ok tuşlarını kullanarak uzay gemisi hareket edebilir, ancak mobilde değil. Uzay gemisini mobilde parmaklarla kontrol etmek için bir joystick ekleyelim!\nBu pencereyi kapat ve editöre geri dön.", + "ja": "コンピューターではキーボードの左右キーを使って宇宙船を動かせますが、モバイルでは動きません。モバイルで指を使って操作できるようにジョイスティックを追加しましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "컴퓨터에서는 왼쪽 및 오른쪽 키보드를 사용하여 우주선을 움직일 수 있지만, 모바일에서는 불가능합니다. 모바일에서 손가락으로 조작할 수 있도록 조이스틱을 추가해 봅시다!\n이 창을 닫고 편집기로 돌아가세요.", + "pl": "Na komputerze statek kosmiczny może się poruszać za pomocą klawiszy strzałek w lewo i w prawo, ale nie na urządzeniach mobilnych. Dodajmy joystick, aby można było sterować statkiem palcami na telefonie!\nZamknij to okno i wróć do edytora.", + "pt": "No computador, a nave pode se mover com as teclas esquerda e direita do teclado, mas não no celular. Vamos adicionar um joystick para controlar a nave com os dedos no celular!\nFeche esta janela e volte para o editor.", + "th": "บนคอมพิวเตอร์สามารถใช้ปุ่มลูกศรซ้ายและขวาเพื่อควบคุมยานอวกาศได้ แต่บนมือถือทำไม่ได้ มาเพิ่มจอยสติ๊กเพื่อควบคุมยานด้วยนิ้วบนมือถือกันเถอะ!\nปิดหน้าต่างนี้แล้วกลับไปที่ตัวแก้ไข", + "ru": "На компьютере космический корабль можно перемещать с помощью клавиш влево и вправо, но на мобильном устройстве это невозможно. Давайте добавим джойстик, чтобы управлять кораблём пальцами на мобильном!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Na računalniku se vesoljska ladja lahko premika s tipkama levo in desno, na mobilnih napravah pa ne. Dodajmo igralno palico, da bomo lahko ladjo nadzorovali s prsti na mobilniku!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Në kompjuter, anija mund të lëvizë me tastet majtas dhe djathtas të tastierës, por jo në celular. Le të shtojmë një levë për të kontrolluar anijen me gishtat në celular!\nMbylle këtë dritare dhe kthehu te redaktori.", + "uk": "На комп'ютері космічний корабель можна рухати клавішами вліво та вправо, але на мобільному це неможливо. Додамо джойстик, щоб керувати кораблем пальцями на мобільному!\nЗакрийте це вікно і поверніться до редактора.", + "zh": "在电脑上,可以使用键盘的左右箭头移动飞船,但在手机上无法移动。让我们添加一个摇杆,使其可以在手机上用手指控制!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-layers-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-layer-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "First, let's open the **Layers** panel.", + "fr": "Premièrement, ouvrons le panneau des **calques**.", + "ar": "أولًا، هيّا نفتح لوحة **الطبقات**.", + "de": "Zuerst öffnen wir das **Ebenen**-Panel.", + "es": "Primero, abramos el panel de **Capas**.", + "fi": "Ensinnäkin, avataan **Kerrokset**-paneeli.", + "it": "Prima di tutto, apriamo il pannello **Livelli**.", + "tr": "Öncelikle **Katmanlar** panelini açalım.", + "ja": "まず、**レイヤー** パネルを開きましょう。", + "ko": "먼저 **레이어** 패널을 엽니다.", + "pl": "Najpierw otwórzmy panel **Warstwy**.", + "pt": "Primeiro, vamos abrir o painel de **Camadas**.", + "ru": "Сначала давайте откроем панель **Слои**.", + "sl": "Najprej odprite ploščo **Plasti**.", + "sq": "Se fillimi, e hapim **Layers** panel.", + "th": "เปิดแผงควบคุม **เลเยอร์**", + "uk": "Спочатку давайте відкриємо панель **Шари**.", + "zh": "首先,让我们打开 **图层** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#layer-1 #layer-selected-unchecked", + "nextStepTrigger": { + "presenceOfElement": "#layer-1 #layer-selected-checked" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Interface** layer so we can place our joystick inside of it.", + "fr": "Sélectionnons le calque **Interface** pour y placer notre joystick.", + "ar": "حدد الطبقة **الواجهة** حتى نتمكن من وضع عصا التحكم بداخلها.", + "de": "Wählen Sie die **Interface**-Ebene aus, damit wir unseren Joystick darin platzieren können.", + "es": "Selecciona la capa **Interface** para que podamos colocar nuestro joystick dentro de ella.", + "fi": "Valitse **Käyttöliittymä**-kerros, jotta voimme sijoittaa joystickimme sen sisälle.", + "it": "Seleziona il livello **Interface** in modo da poter posizionare il nostro joystick al suo interno.", + "tr": "Joystick'i içine yerleştirebilmemiz için **Arayüz** katmanını seçin.", + "ja": "**インターフェース** レイヤーを選択して、その中にジョイスティックを配置しましょう。", + "ko": "**인터페이스** 레이어를 선택하여 그 안에 조이스틱을 배치할 수 있도록 합시다.", + "pl": "Wybierz warstwę **Interface** tak, abyśmy mogli umieścić w niej naszego joysticka.", + "pt": "Selecione a camada **Interface** para que possamos colocar nosso joystick dentro dela.", + "ru": "Выберите слой **Interface**, чтобы мы могли поместить в него наш джойстик.", + "sl": "Izberite plast **Interface**, da lahko vanj postavimo naš joystick.", + "sq": "Zgjidh **Interface** layer qe te vendosim joystickun brenda tij.", + "th": "เลือก **Interface** เลเยอร์ เพื่อที่เราจะวาง joystick ในนั้น", + "uk": "Виберіть шар **Interface**, щоб ми могли помістити наш джойстик всередину.", + "zh": "选择 **界面** 层,这样我们就可以把手柄放在里面。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト** パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **obiektów**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **объектов**.", + "sl": "Odpri ploščo **objektov**.", + "sq": "Hape panelin **Objekte**", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **об'єктів**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#add-new-object-button", + "nextStepTrigger": { + "presenceOfElement": "#new-object-dialog" + }, + "tooltip": { + "placement": "top", + "description": { + "messageByLocale": { + "en": "This game can only be played with a keyboard, so let's add **joystick controllers**, so that we can play on **mobile**!\n\nLet's go to the asset store to find a joystick prefab!", + "fr": "Ce jeu ne peut être joué qu'avec un clavier, alors ajoutons un **joystick** pour pouvoir y jouer sur **mobile** !\n\nAllons dans le magasin de ressources pour trouver un joystick préfabriqué !", + "ar": "يمكن لعب هذه اللعبة بواسطة لوحة المفاتيح فقط، لذلك هيّا نقوم بإضافة **عصا التحكم**، حتى نتمكن من لعبها على **الأجهزة المحمولة**!\n\nهيّا نذهب إلى متجر العناصر للعثور على عصا تحكم جاهزة للاستخدام!", + "de": "Dieses Spiel kann nur mit einer Tastatur gespielt werden, also fügen wir **Joystick-Controller** hinzu, damit wir es auf **Mobilgeräten** spielen können!\n\nLass uns zum Asset-Store gehen, um ein Joystick-Prefab zu finden!", + "es": "Este juego solo se puede jugar con un teclado, así que añadamos un **joystick** para poder jugar en **móvil**!\n\n¡Vamos al almacén de recursos para encontrar un joystick prefab!", + "fi": "Tätä peliä voi pelata vain näppäimistöllä, joten lisätään **joystick-ohjaimet**, jotta voimme pelata **mobiililaitteilla**!\n\nMennään resurssikauppaan etsimään joystick-prefab!", + "it": "Questo gioco può essere giocato solo con una tastiera, quindi aggiungiamo un **joystick** per poterlo giocare su **mobile**!\n\nAndiamo al negozio di risorse per trovare un joystick prefab!", + "tr": "Bu oyun sadece bir klavye ile oynanabilir, bu yüzden **joystick kontrolcüler** ekleyelim, böylece **mobil** cihazlarda oynayabiliriz!\n\nJoystick prefabını bulmak için kaynak mağazasına gidelim!", + "ja": "このゲームはキーボードでしかプレイできません。**ジョイスティックコントローラ**を追加して、**モバイル**でプレイできるようにしましょう!\n\nジョイスティックのプレハブを見つけるためにアセットストアに行きましょう!", + "ko": "이 게임은 키보드로만 플레이할 수 있습니다. **조이스틱 컨트롤러**를 추가하여 **모바일**에서 플레이할 수 있도록 합시다!\n\n조이스틱 프리팹을 찾기 위해 에셋 스토어로 가봅시다!", + "pl": "Ta gra może być grana tylko za pomocą klawiatury, więc dodajmy **kontrolery joysticka**, abyśmy mogli grać na **urządzeniach mobilnych**!\n\nChodźmy do sklepu z zasobami, aby znaleźć prefabrykat joysticka!", + "pt": "Este jogo só pode ser jogado com um teclado, então vamos adicionar **joysticks** para poder jogar no **móvel**!\n\nVamos à loja de recursos para encontrar um joystick prefab!", + "ru": "Эту игру можно играть только с клавиатуры, поэтому давайте добавим **джойстик-контроллеры**, чтобы мы могли играть на **мобильных устройствах**!\n\nПойдем в магазин ресурсов, чтобы найти джойстик-префаб!", + "sl": "To igro lahko igrate samo s tipkovnico, zato dodajmo **joystick kontrolerje**, da jo lahko igramo na **mobilnih napravah**!\n\nPojdimo v trgovino z viri, da najdemo joystick prefab!", + "sq": "Kjo loje mund the luhet vetem me nje tastjer, le te shtojme nje**kontroller joystiki**, qe te mund te luajme ne **mobil**!\n\n Hajde shkojme ne dyqan per asseta qe te gjejme nje joystik prefab!", + "th": "เกมนี้สามารถเล่นได้เฉพาะด้วยคีย์บอร์ด เราจึงจะเพิ่ม **joystick controllers** เพื่อให้เล่นได้บน **mobile**!\n\nเราจะไปหา joystick prefab ใน asset store", + "uk": "Цю гру можна грати тільки з клавіатури, тому давайте додамо **джойстик-контролери**, щоб ми могли грати на **мобільних пристроях**!\n\nПідемо в магазин ресурсів, щоб знайти джойстик-префаб!", + "zh": "这个游戏只能用键盘玩,所以让我们添加 **手柄控制器**,这样我们就可以在 **移动设备** 上玩!\n\n让我们去资源商店找一个手柄预制对象!" + } + } + } + }, + { + "elementToHighlightId": "#asset-store-tab", + "nextStepTrigger": { + "presenceOfElement": "#asset-store" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's choose a **prefab object** from the asset store", + "fr": "Nous allons choisir un **objet préfabriqué** dans le magasin de ressources.", + "ar": "هيّا نختار **كائن جاهز للاستخدام** من متجر العناصر", + "de": "Wählen wir ein **Prefab-Objekt** aus dem Asset-Store aus", + "es": "Vamos a elegir un **objeto prefab** de la tienda de recursos.", + "fi": "Valitaan **prefab-objekti** resurssikaupasta", + "it": "Scegliamo un **oggetto prefab** dal negozio di risorse", + "tr": "Asset Store'dan bir **prefabrik nesne** seçelim", + "ja": "アセットストアから **プレハブオブジェクト** を選びましょう", + "ko": "에셋 스토어에서 **프리팹 오브젝트**를 선택해 봅시다", + "pl": "Wybierzmy **obiekt prefab** ze sklepu z zasobami", + "pt": "Vamos escolher um **objeto prefab** da loja de recursos.", + "ru": "Давайте выберем **объект prefab** из магазина ресурсов", + "sl": "Izberimo **predlogo objekta** iz trgovine z viri", + "sq": "Hajde te zgjedhim nje **prefab objekt** prej asset storit", + "th": "เลือก **วัตถุ prefab** จากร้านค้า asset", + "uk": "Давайте виберемо **об'єкт prefab** з магазину ресурсів", + "zh": "让我们从资源商店中选择一个 **预制对象**" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-store #home-button", + "nextStepTrigger": { + "presenceOfElement": "#asset-store-home[data-is-filtered=\"false\"]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's go back to the store home page.", + "fr": "Retournons à la page d'accueil du magasin.", + "ar": "هيّا نعود إلى صفحة المتجر الرئيسية.", + "de": "Gehen wir zurück zur Startseite des Stores.", + "es": "Volvamos a la página de inicio de la tienda.", + "fi": "Palataan takaisin kaupan etusivulle.", + "it": "Torniamo alla pagina iniziale del negozio.", + "tr": "Mağaza ana sayfasına geri dönelim.", + "ja": "ストアのホームページに戻りましょう。", + "ko": "스토어 홈페이지로 돌아가 봅시다.", + "pl": "Wróćmy do strony głównej sklepu.", + "pt": "Vamos voltar para a página inicial da loja.", + "ru": "Вернемся на домашнюю страницу магазина.", + "sl": "Pojdimo nazaj na domačo stran trgovine.", + "sq": "Hajde shkojme prap te homi e faqes.", + "th": "กลับไปยังหน้าโฮมเพจของร้านค้า", + "uk": "Повернемося на домашню сторінку магазину.", + "zh": "让我们回到商店首页。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-pack-category-prefab", + "nextStepTrigger": { + "presenceOfElement": "#asset-store-home[data-is-filtered=\"true\"] #asset-pack-multitouch-joysticks" + }, + "tooltip": { + "placement": "bottom", + "description": { + "messageByLocale": { + "en": "We will use an object that comes with pre-made actions and conditions. We call this a **Ready to use object**.", + "fr": "Nous allons utiliser un objet préfabriqué. C'est un objet qui vient avec ses propres actions et conditions, ce qui simplifie son utilisation.", + "ar": "سوف نستخدم كائن يأتي مع إجراءات وشروط معدّة مسبقًا. نحن نسميه **كائن جاهز للاستخدام**.", + "de": "Wir werden ein Objekt verwenden, das mit vorgefertigten Aktionen und Bedingungen geliefert wird. Wir nennen dies ein **Fertiges Objekt**.", + "es": "Vamos a usar un objeto prefab. Es un objeto que viene con sus propias acciones y condiciones, lo que simplifica su uso.", + "fi": "Käytämme objektia, joka sisältää valmiiksi tehtyjä toimintoja ja ehtoja. Kutsumme tätä **Valmiiksi tehty objekti**.", + "it": "Useremo un oggetto prefab. È un oggetto che viene con le sue azioni e condizioni predefinite, semplificandone l'uso.", + "tr": "Önceden yapılmış eylem ve koşullarla birlikte gelen bir nesne kullanacağız. Buna **Kullanıma hazır nesne** diyoruz.", + "ja": "事前に作成されたアクションと条件が付属しているオブジェクトを使用します。これを **使用可能なオブジェクト** と呼びます。", + "ko": "미리 만들어진 액션과 조건이 포함된 오브젝트를 사용할 것입니다. 이것을 **사용 가능한 오브젝트**라고 부릅니다.", + "pl": "Będziemy używać obiektu, który jest dostarczany z gotowymi akcjami i warunkami. Nazywamy to **Gotowy do użycia obiekt**.", + "pt": "Vamos usar um objeto prefab. É um objeto que vem com suas próprias ações e condições, o que simplifica seu uso.", + "ru": "Мы будем использовать объект, который поставляется с готовыми действиями и условиями. Мы называем это **Готовый к использованию объект**.", + "sl": "Uporabili bomo objekt, ki prihaja z že pripravljenimi dejanji in pogoji. Imenujemo ga **Pripravljen za uporabo objekt**.", + "sq": "Do te perdorim nje objekt e cila vjen me aktion dhe konditione te bere gati. Ne e thirrim kete nje **Gati per perdorim objekt**.", + "th": "เราจะใช้วัตถุ prefab มันเป็นวัตถุที่มีการกระทำและเงื่อนไขแบบพิเศษ", + "uk": "Ми будемо використовувати об'єкт, який постачається з готовими діями та умовами. Ми називаємо це **Готовий до використання об'єкт**.", + "zh": "我们将使用一个带有预先制作的动作和条件的对象。我们称之为 **准备好使用的对象**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-store-home[data-is-filtered=\"true\"] #asset-pack-multitouch-joysticks", + "nextStepTrigger": { + "presenceOfElement": "#asset-card-Flat-light-joystick" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will use a joystick.", + "fr": "Nous allons utiliser un joystick.", + "ar": "سوف نستخدم عصا تحكم.", + "de": "Wir werden einen Joystick verwenden.", + "es": "Vamos a usar un joystick.", + "fi": "Käytämme joystickiä.", + "it": "Useremo un joystick.", + "tr": "Joystick kullanacağız.", + "ja": "ジョイスティックを使用します。", + "ko": "조이스틱을 사용할 것입니다.", + "pl": "Będziemy używać joysticka.", + "pt": "Vamos usar um joystick.", + "ru": "Мы будем использовать джойстик.", + "sl": "Uporabili bomo joystick.", + "sq": "Do te perdorim nje joystik.", + "th": "เราจะใช้ joystick", + "uk": "Ми будемо використовувати джойстик.", + "zh": "我们将使用一个手柄。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#asset-card-Flat-light-joystick", + "nextStepTrigger": { + "presenceOfElement": "#add-asset-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's choose this white joystick, it will match well with our background.", + "fr": "Choisissons ce joystick blanc, il s'accordera bien avec notre fond.", + "ar": "هيّا نختار هذه البيضاء، سوف تتناسب جيدًا مع خلفيتنا.", + "de": "Wählen wir diesen weißen Joystick, er passt gut zu unserem Hintergrund.", + "es": "Elegimos este joystick blanco, se ajustará bien con nuestro fondo.", + "fi": "Valitaan tämä valkoinen joystick, se sopii hyvin taustamme kanssa.", + "it": "Scegliamo questo joystick bianco, si abbina bene con il nostro sfondo.", + "tr": "Bu beyaz joystick'i seçelim, arka planımızla iyi uyum sağlayacak.", + "ja": "この白いジョイスティックを選びましょう。背景によく合います。", + "ko": "이 흰색 조이스틱을 선택해 봅시다. 배경과 잘 어울릴 것입니다.", + "pl": "Wybierzmy ten biały joystick, będzie pasował do naszego tła.", + "pt": "Escolhamos este joystick branco, ele se ajustará bem com nosso fundo.", + "ru": "Давайте выберем этот белый джойстик, он хорошо подойдет к нашему фону.", + "sl": "Izberimo ta bel joystick, dobro se bo ujemal z našim ozadjem.", + "sq": "Hajde te zgjedhim kete joystik te bardhe, ajo do te ngjaje me backgroundin tone.", + "th": "เลือก joystick สีขาว มันจะเหมาะกับพื้นหลัง", + "uk": "Оберемо цей білий джойстик, він підійде до нашого фону.", + "zh": "让我们选择这个白色手柄,它会很好地搭配我们的背景。" + } + } + } + }, + { + "elementToHighlightId": "#add-asset-button", + "nextStepTrigger": { + "objectAddedInLayout": true + }, + "mapProjectData": { + "joystick": "sceneLastObjectName:level" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's add it to the scene.", + "fr": "Ajoutons le à la scène.", + "ar": "هيّا نقوم بإضافتها إلى المشهد.", + "de": "Fügen wir es der Szene hinzu.", + "es": "Agreguemoslo a la escena.", + "fi": "Lisätään se kohtaukseen.", + "it": "Aggiungiamolo alla scena.", + "tr": "Onu sahneye ekleyelim.", + "ja": "シーンに追加しましょう。", + "ko": "씬에 추가해 봅시다.", + "pl": "Dodajmy to do sceny.", + "pt": "Adicionemos-o à cena.", + "ru": "Добавим его в сцену.", + "sl": "Dodajmo ga v sceno.", + "sq": "Hajde te shtojme ate te skena.", + "th": "เพิ่มวัตถุในฉาก", + "uk": "Додаймо його до сцени.", + "zh": "让我们把它添加到场景中。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#close-button", + "nextStepTrigger": { + "absenceOfElement": "#new-object-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's close the asset store.", + "fr": "Fermons le magasin de ressources", + "ar": "هيّا نغلق متجر العناصر.", + "de": "Schließen wir den Asset-Store.", + "es": "Cerramos la tienda de recursos.", + "fi": "Suljetaan resurssikauppa.", + "it": "Chiudiamo il negozio di risorse.", + "tr": "Asset Store'u kapatalım.", + "ja": "アセットストアを閉じましょう。", + "ko": "에셋 스토어를 닫아 봅시다.", + "pl": "Zamknijmy sklep z zasobami.", + "pt": "Vamos fechar a loja de recursos.", + "ru": "Давайте закроем магазин ресурсов.", + "sl": "Zaprimo trgovino z viri.", + "sq": "Hajde ta mbyllim asset storin.", + "th": "ปิดร้านค้า asset", + "uk": "Давайте закриємо магазин ресурсів.", + "zh": "让我们关闭资源商店。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit** paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:joystick", + "nextStepTrigger": { + "instanceAddedOnScene": "joystick" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag the **$(joystick)** to the scene.", + "fr": "Faites glisser **$(joystick)** du menu à la scène.", + "ar": "سحب الـ **$(joystick)** إلى المشهد.", + "de": "Ziehen Sie **$(joystick)** in die Szene.", + "es": "Arrastra **$(joystick)** desde el menú a la escena.", + "fi": "Vedä **$(joystick)** kohtaukseen.", + "it": "Trascina **$(joystick)** nella scena.", + "tr": "**$(joystick)**'i sahneye sürükleyin.", + "ja": " **$(joystick)** をシーンにドラッグしてください。", + "ko": " **$(joystick)**를 씬으로 드래그하세요.", + "pl": "Przeciągnij **$(joystick)** do sceny.", + "pt": "Arraste **$(joystick)** do menu para a cena.", + "ru": "Перетащите **$(joystick)** на сцену.", + "sl": "Povlecite **$(joystick)** v sceno.", + "sq": "Vendose ate **$(joystick)** te skena", + "th": "ลาก **$(joystick)** ใส่ลงใน scene", + "uk": "Перетягніть **$(joystick)** на сцену.", + "zh": "将 **$(joystick)** 拖到场景中。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Select the **$(joystick)**, then drag it to the scene.", + "fr": "Sélectionnez **$(joystick)**, puis faites-le glisser à la scène.", + "ar": "تحديد الـ **$(joystick)** ثم سحبه إلى المشهد.", + "de": "Wählen Sie **$(joystick)** aus und ziehen Sie es dann in die Szene.", + "es": "Selecciona **$(joystick)**, luego arrástralo a la escena.", + "fi": "Valitse **$(joystick)** ja vedä se kohtaukseen.", + "it": "Seleziona **$(joystick)**, quindi trascinalo nella scena.", + "tr": "**$(joystick)**'i seçin, ardından sahneye sürükleyin.", + "ja": "**$(joystick)** を選択し、シーンにドラッグしてください。", + "ko": "**$(joystick)**를 선택한 다음 씬으로 드래그하세요.", + "pl": "Wybierz **$(joystick)**, a następnie przeciągnij go do sceny.", + "pt": "Selecione **$(joystick)**, em seguida, arraste-o para a cena.", + "ru": "Выберите **$(joystick)**, затем перетащите его на сцену.", + "sl": "Izberite **$(joystick)**, nato ga povlecite v sceno.", + "sq": "Selektoje ate **$(joystick)**, pastaj vendose ne skene.", + "th": "เลือก **$(joystick)** แล้วลากมันเข้า scene", + "uk": "Виберіть **$(joystick)**, а потім перетягніть його на сцену.", + "zh": "选择 **$(joystick)**,然后将它拖到场景中。" + } + } + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Ich bin fertig", + "es": "He terminado", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Zakończono", + "pt": "Terminei", + "ru": "Я закончил", + "sl": "Končano", + "sq": "Une mbarova", + "th": "เสร็จแล้ว", + "uk": "Закінчено", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "Place the $(joystick) below the ship on the screen, so that the player can use their thumb to control it easily.", + "fr": "Placez le $(joystick) en dessous du vaisseau à l'écran, de façon à ce que le joueur puisse utiliser son pouce pour le contrôler facilement.", + "ar": "إدراج الـ **$(joystick)** أسفل السفينة الفضائية حتى يتمكن اللاعبون من استخدام إبهامهم للتحكم بها بسهولة.", + "de": "Platzieren Sie den **$(joystick)** unter dem Schiff auf dem Bildschirm, damit der Spieler es leicht mit dem Daumen steuern kann.", + "es": "Coloca el $(joystick) debajo de la nave en la pantalla, de manera que el jugador pueda usar su pulgar para controlarlo fácilmente.", + "fi": "Aseta $(joystick) aluksen alle näytölle, jotta pelaaja voi käyttää peukaloaan sen ohjaamiseen helposti.", + "it": "Posiziona il **$(joystick)** sotto la nave sullo schermo, in modo che il giocatore possa usarlo facilmente con il pollice.", + "tr": "Oyuncunun onu kolayca kontrol edebilmesi için **$(joystick)**'i ekrandaki geminin altına yerleştirin.", + "ja": "画面上の宇宙船の下に **$(joystick)** を配置し、プレイヤーが親指で簡単に操作できるようにします。", + "ko": "화면에서 우주선 아래에 **$(joystick)**를 배치하여 플레이어가 쉽게 엄지로 제어할 수 있도록 합니다.", + "pl": "Umieść **$(joystick)** poniżej statku na ekranie, aby gracz mógł łatwo nim sterować kciukiem.", + "pt": "Coloque o $(joystick) abaixo da nave na tela, de forma que o jogador possa usar o polegar para controlá-lo facilmente.", + "ru": "Разместите **$(joystick)** под кораблем на экране, чтобы игрок мог легко управлять им большим пальцем.", + "sl": "Postavite **$(joystick)** pod ladjo na zaslonu, tako da ga lahko igralec enostavno upravlja s palcem.", + "sq": "Vendose ate $(joystick) nder anijen ne ekran, qe te mund lojtari te perdore gishtin e madh per te kontrolluar ate lehte.", + "th": "วาง $(joystick) ใต้เรือในฉาก ให้ผู้เล่นสามารถใช้นิ้วกลางเพื่อควบคุมได้ง่าย\n\nเมื่อคุณเสร็จแล้ว ให้คลิกที่ปุ่มด้านล่าง", + "uk": "Розмістіть **$(joystick)** під кораблем на екрані, щоб гравець міг легко керувати ним великим пальцем.", + "zh": "将 $(joystick) 放在屏幕上的飞船下方,这样玩家就可以用拇指轻松控制它。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSIxMjcuMjc5IDY2LjI3NSAyMTkuNDAyIDI5Ny4zNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpieD0iaHR0cHM6Ly9ib3h5LXN2Zy5jb20iPgogIDxyZWN0IHg9IjEyNy4yNzkiIHk9IjY2LjUwOSIgd2lkdGg9IjIxOS40MDIiIGhlaWdodD0iMjk2LjY0OSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoODcsIDg1LCA4NSk7Ii8+CiAgPHBhdGggZD0iTSAyMzguMzI2IDIzMC40NDMgTCAyNTUuMDI1IDI2Mi44NjUgTCAyMjEuNjI4IDI2Mi44NjUgTCAyMzguMzI2IDIzMC40NDMgWiIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMjU1LCAxNjIsIDU2KTsiIGJ4OnNoYXBlPSJ0cmlhbmdsZSAyMjEuNjI4IDIzMC40NDMgMzMuMzk3IDMyLjQyMiAwLjUgMCAxQDZlMjg1NDhlIi8+CiAgPGVsbGlwc2Ugc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoNTksIDIyMiwgOTcpOyIgY3g9IjIzNy45OTEiIGN5PSIzMTkuNjU5IiByeD0iMjEuMjc5IiByeT0iMTkuODUzIi8+CiAgPHJlY3QgeD0iMTI3LjM5MyIgeT0iNjYuMjc1IiB3aWR0aD0iMTAiIGhlaWdodD0iMjk3LjM2IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigyMDgsIDM3LCAzNyk7Ii8+CiAgPHJlY3QgeD0iMzM2LjMzMyIgeT0iNjYuOTI3IiB3aWR0aD0iOS43NiIgaGVpZ2h0PSIyOTUuOTg3IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigyMzIsIDQ0LCA0NCk7Ii8+CiAgPHJlY3QgeD0iMTM2Ljk3IiB5PSI2Ni42NDIiIHdpZHRoPSIxOTkuNDkzIiBoZWlnaHQ9IjkuMjAxIiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigyMzMsIDQ2LCA0Nik7Ii8+CiAgPHJlY3QgeD0iMTM4LjIyOSIgeT0iMzU0LjE4IiB3aWR0aD0iMTk3LjE1NSIgaGVpZ2h0PSI4LjUwMiIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMjMwLCA1MywgNTMpOyIvPgo8L3N2Zz4=" + } + }, + "interactsWithCanvas": true + }, + { + "metaKind": "add-behavior", + "objectKey": "ship", + "behaviorListItemId": "#behavior-item-SpriteMultitouchJoystick--TopDownMultitouchMapper", + "behaviorParameterPanelId": "#behavior-parameters-TopDownMultitouchMapper", + "behaviorDisplayNameByLocale": { + "en": "Top down multi-touch controller mapper", + "fr": "Contrôleur multi-touch de haut en bas", + "ar": "محول تحكم متعدد اللمسات من الأعلى إلى الأسفل", + "de": "Top-Down-Multitouch-Controller-Mapper", + "es": "Mapeador de controlador multitáctil de arriba abajo", + "fi": "Ylhäältä alas monikosketusohjain", + "it": "Mappatore del controller multitouch dall'alto verso il basso", + "tr": "Üstten aşağı çoklu dokunmatik denetleyici haritalayıcı", + "ja": "トップダウンマルチタッチコントローラーマッパー", + "ko": "탑 다운 멀티터치 컨트롤러 매퍼", + "pl": "Maper kontrolera wielodotykowego od góry do dołu", + "pt": "Mapeador de controlador multitouch de cima para baixo", + "ru": "Маппер контроллера мультитач сверху вниз", + "sl": "Maper krmilnika večkratnega dotika od zgoraj navzdol", + "sq": "Mapuesi i kontrolluesit të shumë prekjeve nga lart-dhe-poshtë", + "th": "ตัวแมปคอนโทรลเลอร์แบบหลายจุดสัมผัสจากบนลงล่าง", + "uk": "Мапер контролера багатодотикового зверху донизу", + "zh": "自上而下的多点触控控制器映射器" + }, + "parameters": [], + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's link our $(joystick) and our $(ship) thanks to the **behaviors** that came with the prefab:\n\nclick on the 3 dot menu, or right click on **$(ship)**, and select **Edit behaviors**.", + "fr": "Lions notre $(joystick) et notre $(ship) grâce aux **comportements** qui sont venus avec le prefab:\n\ncliquez sur le menu à 3 points, ou faites un clic droit sur **$(ship)**, et sélectionnez **Modifier les comportements**.", + "ar": "هيّا نربط $(joystick) و$(ship) بواسطة **السلوكيات** التي أتت مع الكائن المجهز مسبقًا: \n\nالضغط على قائمة الثلاث نقاط، أو النقر على زر الفأرة الأيمن على الـ **$(ship)** وتحديد **تحرير السلوكيات**.", + "de": "Verknüpfen wir unser **$(joystick)** und unser **$(ship)** dank der **Verhaltensweisen**, die mit dem Prefab geliefert wurden:\n\nKlicken Sie auf das Menü mit den 3 Punkten oder klicken Sie mit der rechten Maustaste auf **$(ship)** und wählen Sie **Verhaltensweisen bearbeiten**.", + "es": "Vinculemos nuestro $(joystick) y nuestro $(ship) gracias a los **comportamientos** que vinieron con el prefab:\n\nhaz clic en el menú de 3 puntos, o haz clic derecho en **$(ship)**, y selecciona **Editar comportamientos**.", + "fi": "Yhdistetään $(joystick) ja $(ship) **käyttäytymisten** avulla, jotka tulivat prefabista:\n\nklikkaa 3 pisteen valikkoa tai klikkaa oikealla hiiren painikkeella **$(ship)** ja valitse **Muokkaa käyttäytymisiä**.", + "it": "Colleghiamo il nostro **$(joystick)** e il nostro **$(ship)** grazie ai **comportamenti** che sono venuti con il prefab:\n\nclicca sul menu a 3 punti, o fai clic destro su **$(ship)**, e seleziona **Modifica comportamenti**.", + "tr": "Önceden yapılmış eylem ve koşullarla birlikte gelen **davranışlar** sayesinde $(joystick) ve $(ship) nesnelerimizi birleştirelim:\n\n3 nokta menüsüne tıklayın veya **$(ship)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "プレハブに付属している **$(joystick)** と **$(ship)** の **動作** のおかげでリンクしましょう。\n\n3点メニューをクリックするか、**$(ship)** を右クリックして **動作の編集** を選択します。", + "ko": "프리팹에 포함된 **동작** 덕분에 $(joystick)와 $(ship)를 연결해 봅시다:\n\n3 점 메뉴를 클릭하거나 **$(ship)**를 마우스 오른쪽 버튼으로 클릭한 다음 **동작 편집**을 선택하세요.", + "pl": "Połączmy nasz **$(joystick)** i nasz **$(ship)** dzięki **akcjom**, które zostały dostarczone z prefabrykatem:\n\nkliknij menu 3 kropek lub kliknij prawym przyciskiem myszy **$(ship)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos vincular nosso $(joystick) e nosso $(ship) graças aos **comportamentos** que vieram com o prefab:\n\nclique no menu de 3 pontos, ou clique com o botão direito em **$(ship)**, e selecione **Editar comportamentos**.", + "ru": "Свяжем наш **$(joystick)** и наш **$(ship)** благодаря **поведениям**, которые поставляются с префабом:\n\nнажмите на меню из 3 точек или щелкните правой кнопкой мыши на **$(ship)** и выберите **Изменить поведение**.", + "sl": "Povežimo naš **$(joystick)** in naš **$(ship)** zahvaljujoč **vedenjem**, ki so prišla s predlogo:\n\nkliknite na meni z 3 pikami ali z desno miškino tipko kliknite **$(ship)** in izberite **Uredi vedenja**.", + "sq": "Ec te linkojme $(joystick) dhe $(ship) tone fale te **veprimet** qe erdhen me prefabin:\n\nshtype ne 3 pikat menu, ose shtype me anen te djatht ne **$(ship)** dhe selekto **Ndrysho veprimet**", + "th": "ให้เชื่อมโยง $(joystick) และ $(ship) ของเราด้วย **พฤติกรรม** ที่มาพร้อมกับ prefab:\n\nคลิกที่เมนู 3 จุด หรือคลิกขวาที่ **$(ship)** และเลือก **แก้ไขพฤติกรรม**", + "uk": "Зв'яжемо наш **$(joystick)** і наш **$(ship)** завдяки **поведінці**, яка поставляється з префабом:\n\nнатисніть на меню з 3 крапками або клацніть правою кнопкою миші на **$(ship)** і виберіть **Змінити поведінку**.", + "zh": "让我们通过预制的 **动作** 来连接我们的 $(joystick) 和 $(ship):\n\n点击 3 点菜单,或右键点击 **$(ship)**,然后选择 **编辑动作**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's link our $(joystick) and our $(ship) thanks to the **behaviors** that came with the prefab:\n\nSelect, then long press on **$(ship)**, then select **Edit behaviors**.", + "fr": "Lions notre $(joystick) et notre $(ship) grâce aux **comportements** qui sont venus avec le prefab:\n\nSélectionnez, puis appuyez longuement sur **$(ship)**, puis sélectionnez **Modifier les comportements**.", + "ar": "هيّا نربط $(joystick) و$(ship) بواسطة **السلوكيات** التي أتت مع الكائن المجهز مسبقًا: \n\nتحديد، ثم ضغطة مطولة على الـ **$(ship)** وتحديد **تحرير السلوكيات**.", + "de": "Verknüpfen wir unser **$(joystick)** und unser **$(ship)** dank der **Verhaltensweisen**, die mit dem Prefab geliefert wurden:\n\nWählen Sie aus, dann lange drücken Sie auf **$(ship)**, dann wählen Sie **Verhaltensweisen bearbeiten**.", + "es": "Vinculemos nuestro $(joystick) y nuestro $(ship) gracias a los **comportamientos** que vinieron con el prefab:\n\nSelecciona, luego presiona por un largo tiempo en **$(ship)**, luego selecciona **Editar comportamientos**.", + "fi": "Yhdistetään $(joystick) ja $(ship) **käyttäytymisten** avulla, jotka tulivat prefabista:\n\nValitse, sitten pidä pitkään painettuna **$(ship)**, sitten valitse **Muokkaa käyttäytymisiä**.", + "it": "Colleghiamo il nostro **$(joystick)** e il nostro **$(ship)** grazie ai **comportamenti** che sono venuti con il prefab:\n\nSeleziona, poi tieni premuto a lungo su **$(ship)**, poi seleziona **Modifica comportamenti**.", + "tr": "Önceden yapılmış eylem ve koşullarla birlikte gelen **davranışlar** sayesinde $(joystick) ve $(ship) nesnelerimizi birleştirelim:\n\nSeçin, ardından **$(ship)** üzerinde uzun basın ve **Davranışları Düzenle**'yi seçin.", + "ja": "プレハブに付属している **$(joystick)** と **$(ship)** の **動作** のおかげでリンクしましょう。\n\n選択し、**$(ship)** を長押しして、**動作の編集** を選択します。", + "ko": "프리팹에 포함된 **동작** 덕분에 $(joystick)와 $(ship)를 연결해 봅시다:\n\n선택한 다음 **$(ship)**를 길게 누른 다음 **동작 편집**을 선택하세요.", + "pl": "Połączmy nasz **$(joystick)** i nasz **$(ship)** dzięki **akcjom**, które zostały dostarczone z prefabrykatem:\n\nWybierz, a następnie przytrzymaj długo **$(ship)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos vincular nosso $(joystick) e nosso $(ship) graças aos **comportamentos** que vieram com o prefab:\n\nSelecione, depois pressione por um longo tempo em **$(ship)**, depois selecione **Editar comportamentos**.", + "ru": "Свяжем наш **$(joystick)** и наш **$(ship)** благодаря **поведениям**, которые поставляются с префабом:\n\nВыберите, затем долго нажмите на **$(ship)**, затем выберите **Изменить поведение**.", + "sl": "Povežimo naš **$(joystick)** in naš **$(ship)** zahvaljujoč **vedenjem**, ki so prišla s predlogo:\n\nIzberite, nato dolgo pritisnite na **$(ship)**, nato izberite **Uredi vedenja**.", + "sq": "Hajde te linkojme $(joystick) dhe $(ship) tone fale te **veprimve** qe erdhen me prefabin:\n\nSelekto, pastaj mbaje gjate gishtin ne **$(ship)**, pastaj selekto **Ndrysho veprimet**", + "th": "ให้เชื่อมโยง $(joystick) และ $(ship) ของเราด้วย **พฤติกรรม** ที่มาพร้อมกับ prefab:\n\nเลือก แล้วกดค้างที่ **$(ship)** แล้วเลือก **แก้ไขพฤติกรรม**", + "uk": "Зв'яжемо наш **$(joystick)** і наш **$(ship)** завдяки **поведінці**, яка поставляється з префабом:\n\nВиберіть, а потім тримайте довго на **$(ship)**, а потім виберіть **Змінити поведінку**.", + "zh": "让我们通过预制的 **动作** 来连接我们的 $(joystick) 和 $(ship):\n\n选择,然后长按 **$(ship)**,然后选择 **编辑动作**。" + } + }, + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it! Now the joystick will control the ship!", + "fr": "C'est tout ! Maintenant, la manette contrôlera le vaisseau !", + "ar": "هذا كل شيء! الآن ستتحكم عصا التحكم بالسفينة الفضائية!", + "de": "Das ist es! Jetzt wird der Joystick das Schiff steuern!", + "es": "¡Eso es todo! ¡Ahora el joystick controlará el barco!", + "fi": "Siinä se on! Nyt joystick ohjaa alusta!", + "it": "Ecco fatto! Ora il joystick controllerà la nave!", + "tr": "İşte bu kadar! Artık joystick gemiyi kontrol edecek!", + "ja": "完了です!これでジョイスティックが宇宙船を制御します!", + "ko": "이것이죠! 이제 조이스틱이 우주선을 제어할 겁니다!", + "pl": "To wszystko! Teraz joystick będzie sterował statkiem!", + "pt": "É isso aí! Agora o joystick controlará o navio!", + "ru": "Вот и всё! Теперь джойстик будет управлять кораблем!", + "sl": "To je to! Zdaj bo joystick nadzoroval ladjo!", + "sq": "C' ajo! Tash joystiku do te kontrolloje anijen!", + "th": "นั่นเอง! ตอนนี้ joystick จะควบคุมเรือ!", + "uk": "Ось і все! Тепер джойстик буде керувати кораблем!", + "zh": "就是这样!现在摇杆将控制飞船!" + } + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched" + } + ] +} \ No newline at end of file diff --git a/tutorials/in-app/knightPlatformer.json b/tutorials/in-app/knightPlatformer.json new file mode 100644 index 0000000..1eb43f9 --- /dev/null +++ b/tutorials/in-app/knightPlatformer.json @@ -0,0 +1,511 @@ +{ + "id": "knightPlatformer", + "titleByLocale": { + "en": "Let's make a platformer game", + "fr": "Faisons un jeu de plateforme", + "ar": "لنصنع لعبة بلاتفورمر", + "de": "Lass uns ein Plattformspiel machen", + "es": "Hagamos un juego de plataformas", + "fi": "Tehdään tasohyppelypeli", + "it": "Facciamo un gioco platform", + "tr": "Platform oyunu yapalım", + "ja": "プラットフォーマーゲームを作ろう", + "ko": "플랫폼 게임을 만들어 보자", + "pl": "Zróbmy grę platformową", + "pt": "Vamos fazer um jogo de plataforma", + "th": "มาทำเกมแพลตฟอร์มกันเถอะ", + "ru": "Сделаем платформер", + "sl": "Naredimo igro platforme", + "sq": "Le të bëjmë një lojë platformë", + "uk": "Зробимо платформер", + "zh": "让我们制作一个平台游戏" + }, + "bulletPointsByLocale": [ + { + "en": "Use a behavior to mark an object as a platform.", + "fr": "Utilisez un comportement pour marquer un objet comme une plateforme.", + "ar": "استخدم سلوكًا لتحديد كائن كمنصة.", + "de": "Verwende ein Verhalten, um ein Objekt als Plattform zu markieren.", + "es": "Usa un comportamiento para marcar un objeto como plataforma.", + "fi": "Käytä käyttäytymistä merkitäksesi objektin alustaksi.", + "it": "Usa un comportamento per segnare un oggetto come piattaforma.", + "tr": "Bir nesneyi platform olarak işaretlemek için bir davranış kullanın.", + "ja": "オブジェクトをプラットフォームとしてマークするために動作を使用します。", + "ko": "객체를 플랫폼으로 표시하는 동작을 사용합니다.", + "pl": "Użyj zachowania, aby oznaczyć obiekt jako platformę.", + "pt": "Use um comportamento para marcar um objeto como plataforma.", + "th": "ใช้พฤติกรรมเพื่อทำเครื่องหมายวัตถุเป็นแพลตฟอร์ม", + "ru": "Используйте поведение, чтобы отметить объект как платформу.", + "sl": "Uporabite vedenje za označitev predmeta kot platformo.", + "sq": "Përdorni një sjellje për të shënuar një objekt si një platformë.", + "uk": "Використовуйте поведінку, щоб позначити об'єкт як платформу.", + "zh": "使用行为将对象标记为平台。" + }, + { + "en": "Use another behavior to control the player.", + "fr": "Utilisez un autre comportement pour contrôler le joueur.", + "ar": "استخدم سلوكًا آخر للتحكم في اللاعب.", + "de": "Verwende ein anderes Verhalten, um den Spieler zu steuern.", + "es": "Usa otro comportamiento para controlar al jugador.", + "fi": "Käytä toista käyttäytymistä pelaajan ohjaamiseen.", + "it": "Usa un altro comportamento per controllare il giocatore.", + "tr": "Oyuncuyu kontrol etmek için başka bir davranış kullanın.", + "ja": "プレイヤーを操作するために別の動作を使用します。", + "ko": "플레이어를 제어하기 위해 다른 행동을 사용합니다.", + "pl": "Użyj innego zachowania, aby kontrolować gracza.", + "pt": "Use outro comportamento para controlar o jogador.", + "th": "ใช้พฤติกรรมอื่นในการควบคุมผู้เล่น", + "ru": "Используйте другое поведение, чтобы управлять игроком.", + "sl": "Uporabite drugo vedenje za nadzor igralca.", + "sq": "Përdorni një sjellje tjetër për të kontrolluar lojtarin.", + "uk": "Використовуйте іншу поведінку для керування гравцем.", + "zh": "使用另一种行为来控制玩家。" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "level1" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/knightPlatformer/game.json", + "initialProjectData": { + "playerHitBox": "KnightHitBox", + "tiles": "Tiles", + "level1": "Level 1" + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a Platformer where the player must get the key then reach the door to open it. Let's see the current game state.\n\nClick on the **preview** button to play.", + "fr": "Ce jeu est un jeu de plateforme où le joueur doit obtenir la clé puis atteindre la porte pour l'ouvrir. Voyons l'état actuel du jeu.\n\nCliquez sur le bouton **aperçu** pour jouer.", + "ar": "هذه اللعبة هي لعبة منصات حيث يجب على اللاعب الحصول على المفتاح ثم الوصول إلى الباب لفتحه. دعونا نرى حالة اللعبة الحالية.\n\nانقر على زر **المعاينة** للعب.", + "de": "Dieses Spiel ist ein Platformer, bei dem der Spieler den Schlüssel holen und dann die Tür erreichen muss, um sie zu öffnen. Lassen Sie uns den aktuellen Spielstand ansehen.\n\nKlicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.", + "es": "Este juego es un plataformas donde el jugador debe conseguir la llave y luego llegar a la puerta para abrirla. Veamos el estado actual del juego.\n\nHaz clic en el botón **vista previa** para jugar.", + "fi": "Tämä peli on tasohyppely, jossa pelaajan on ensin saatava avain ja sitten päästävä ovelle avaamaan se. Katsotaan pelin nykytilaa.\n\nNapsauta **esikatselu**-painiketta pelataksesi.", + "it": "Questo gioco è un platformer in cui il giocatore deve ottenere la chiave e poi raggiungere la porta per aprirla. Vediamo lo stato attuale del gioco.\n\nClicca sul pulsante **anteprima** per giocare.", + "tr": "Bu oyun, oyuncunun anahtarı alıp ardından kapıya ulaşarak açması gereken bir platform oyunudur. Mevcut oyun durumunu görelim.\n\nOynamak için **önizleme** düğmesine tıklayın.", + "ja": "このゲームは、プレイヤーが鍵を手に入れ、ドアに到達して開ける必要があるプラットフォーマーです。現在のゲームの状態を見てみましょう。\n\n**プレビュー**ボタンをクリックしてプレイしてください。", + "ko": "이 게임은 플레이어가 열쇠를 얻고 문에 도달하여 열어야 하는 플랫폼 게임입니다. 현재 게임 상태를 확인해 보겠습니다.\n\n플레이하려면 **미리보기** 버튼을 클릭하세요.", + "pl": "Ta gra to platformówka, w której gracz musi zdobyć klucz, a następnie dotrzeć do drzwi, aby je otworzyć. Zobaczmy aktualny stan gry.\n\nKliknij przycisk **podgląd**, aby zagrać.", + "pt": "Este jogo é um jogo de plataforma onde o jogador deve pegar a chave e depois alcançar a porta para abri-la. Vamos ver o estado atual do jogo.\n\nClique no botão **pré-visualização** para jogar.", + "th": "เกมนี้เป็นเกมแพลตฟอร์มที่ผู้เล่นต้องได้รับกุญแจแล้วไปถึงประตูเพื่อเปิดมัน ดูสถานะเกมปัจจุบัน\n\nคลิกปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "ru": "Эта игра — платформер, где игрок должен получить ключ, а затем добраться до двери, чтобы открыть её. Давайте посмотрим текущее состояние игры.\n\nНажмите кнопку **предварительный просмотр**, чтобы играть.", + "sl": "Ta igra je platformer, kjer mora igralec dobiti ključ in nato doseči vrata, da jih odpre. Poglejmo trenutni stanje igre.\n\nKliknite gumb **predogled**, da igrate.", + "sq": "Kjo lojë është një platformë ku lojtari duhet të marrë çelësin dhe pastaj të arrijë derën për ta hapur. Le të shohim gjendjen aktuale të lojës.\n\nKlikoni butonin **parashikim** për të luajtur.", + "uk": "Ця гра — платформер, де гравець повинен отримати ключ, а потім дістатися до дверей, щоб їх відкрити. Давайте подивимося на поточний стан гри.\n\nНатисніть кнопку **попередній перегляд**, щоб грати.", + "zh": "这个游戏是一款平台游戏,玩家必须得到钥匙然后到达门口以打开它。让我们看看当前的游戏状态。\n\n点击 **预览** 按钮开始游戏。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "Try to move the knight with left/right arrows.\n\nYou'll see that it cannot move. Let's fix this!\nClose this window and go back to the editor.", + "fr": "Essayez de déplacer le chevalier avec les flèches gauche/droite.\n\nVous verrez qu'il ne peut pas bouger. Corrigeons cela !\nFermez cette fenêtre et retournez à l'éditeur.", + "ar": "حاول تحريك الفارس باستخدام سهام اليسار/اليمين.\n\nسترى أنه لا يمكنه التحرك. دعنا نصلح ذلك!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Versuche, den Ritter mit den Links-/Rechtspfeilen zu bewegen.\n\nDu wirst sehen, dass er sich nicht bewegen kann. Lassen wir das beheben!\nSchließe dieses Fenster und gehe zurück zum Editor.", + "es": "Intenta mover al caballero con las flechas izquierda/derecha.\n\nVerás que no puede moverse. ¡Arreglémoslo!\nCierra esta ventana y vuelve al editor.", + "fi": "Yritä liikuttaa ritaria vasemmalle/oikealle nuolinäppäimillä.\n\nHuomaat, että se ei voi liikkua. Korjataan tämä!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Prova a spostare il cavaliere con le frecce sinistra/destra.\n\nVedrai che non può muoversi. Sistemiamolo!\nChiudi questa finestra e torna all'editor.", + "tr": "Şövalyeyi sol/sağ ok tuşlarıyla hareket ettirmeyi dene.\n\nHareket edemediğini göreceksin. Hadi bunu düzeltelim!\nBu pencereyi kapat ve editöre geri dön.", + "ja": "矢印キーの左/右でナイトを動かしてみてください。\n\n動かないことがわかりますね。修正しましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "왼쪽/오른쪽 화살표 키로 기사를 이동해 보세요.\n\n움직이지 않는 것을 볼 수 있습니다. 수정해 봅시다!\n이 창을 닫고 편집기로 돌아가세요.", + "pl": "Spróbuj poruszyć rycerzem za pomocą strzałek lewo/prawo.\n\nZobaczysz, że nie może się ruszyć. Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "Tente mover o cavaleiro com as setas esquerda/direita.\n\nVocê verá que ele não pode se mover. Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "th": "ลองขยับอัศวินด้วยปุ่มลูกศรซ้าย/ขวา\n\nคุณจะเห็นว่าเขาไม่สามารถเคลื่อนที่ได้ มาแก้ไขกันเถอะ!\nปิดหน้าต่างนี้แล้วกลับไปที่ตัวแก้ไข", + "ru": "Попробуйте переместить рыцаря с помощью стрелок влево/вправо.\n\nВы увидите, что он не может двигаться. Давайте это исправим!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Poskusi premakniti viteza s puščicama levo/desno.\n\nVideli boste, da se ne more premakniti. Popravimo to!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Provo ta lëvizësh kalorësin me shigjetat majtas/djathtas.\n\nDo të shohësh që nuk mund të lëvizë. Ta rregullojmë këtë!\nMbylle këtë dritare dhe kthehu te redaktori.", + "uk": "Спробуйте перемістити лицаря стрілками вліво/вправо.\n\nВи побачите, що він не може рухатися. Давайте це виправимо!\nЗакрийте це вікно і поверніться до редактора.", + "zh": "尝试使用左右箭头移动骑士。\n\n你会发现它无法移动。让我们来修复它!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "playerHitBox", + "behaviorListItemId": "#behavior-item-PlatformBehavior--PlatformerObjectBehavior", + "behaviorParameterPanelId": "#behavior-parameters-PlatformerObject", + "behaviorDisplayNameByLocale": { + "en": "Platformer character", + "fr": "Personnage de plateforme", + "ar": "شخصية منصات", + "de": "Plattform-Charakter", + "es": "Personaje de plataformas", + "fi": "Tasohyppelyhahmo", + "it": "Personaggio platform", + "tr": "Platform karakter", + "ja": "プラットフォーマーキャラクター", + "ko": "플랫폼 캐릭터", + "pl": "Postać platformowa", + "pt": "Personagem de plataforma", + "th": "ตัวละครแพลตฟอร์ม", + "ru": "Персонаж платформера", + "sl": "Platformni lik", + "sq": "Karakteri i platformës", + "uk": "Персонаж платформера", + "zh": "平台角色" + }, + "parameters": [ + { + "parameterId": "#JumpSpeed", + "expectedValue": "700", + "description": { + "messageByLocale": { + "en": "Let's update the jump speed to **700**, so the knight can jump higher to reach the highest platforms.", + "fr": "Mettons à jour la vitesse de saut à **700**, afin que le chevalier puisse sauter plus haut pour atteindre les plates-formes les plus hautes.", + "ar": "لنقم بتحديث سرعة القفز إلى **700**، حتى يتمكن الفارس من القفز أعلى للوصول إلى أعلى المنصات.", + "de": "Lassen Sie uns die Sprunggeschwindigkeit auf **700** aktualisieren, damit der Ritter höher springen kann, um die höchsten Plattformen zu erreichen.", + "es": "Actualicemos la velocidad de salto a **700**, para que el caballero pueda saltar más alto y alcanzar las plataformas más altas.", + "fi": "Päivitetään hyppykorkeus **700**-ksi, jotta ritari voi hypätä korkeammalle ja saavuttaa korkeimmat alustat.", + "it": "Aggiorniamo la velocità di salto a **700**, così il cavaliere può saltare più in alto per raggiungere le piattaforme più alte.", + "tr": "Zıplama hızını **700** olarak güncelleyelim, böylece şövalye en yüksek platformlara ulaşmak için daha yükseğe zıplayabilir.", + "ja": "ジャンプ速度を **700** に更新して、ナイトがより高くジャンプして最高のプラットフォームに到達できるようにしましょう。", + "ko": "점프 속도를 **700**으로 업데이트하여 기사가 더 높은 플랫폼에 도달할 수 있도록 점프 높이를 높여보세요.", + "pl": "Zaktualizujmy prędkość skoku do **700**, aby rycerz mógł skakać wyżej i dosięgnąć najwyższych platform.", + "pt": "Vamos atualizar a velocidade de salto para **700**, para que o cavaleiro possa pular mais alto para alcançar as plataformas mais altas.", + "th": "มาปรับความเร็วในการกระโดดเป็น **700** เพื่อให้อัศวินสามารถกระโดดสูงขึ้นไปถึงแพลตฟอร์มที่สูงที่สุดได้", + "ru": "Давайте обновим скорость прыжка до **700**, чтобы рыцарь мог прыгать выше и достигать самых высоких платформ.", + "sl": "Posodobimo hitrost skoka na **700**, da bo vitez lahko skočil višje in dosegel najvišje platforme.", + "sq": "Le të përditësojmë shpejtësinë e kërcimit në **700**, në mënyrë që kalorësi të mund të kërcejë më lart për të arritur platformat më të larta.", + "uk": "Оновимо швидкість стрибка до **700**, щоб лицар міг стрибати вище і досягати найвищих платформ.", + "zh": "将跳跃速度更新为 **700**,这样骑士就可以跳得更高以到达最高的平台。" + } + } + } + ], + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's add movement to our knight with the help of a **behavior**.\n\nClick on the 3 dot menu, or right click on **$(playerHitBox)**, and select **Edit behaviors**.", + "fr": "Ajoutons du mouvement à notre chevalier avec l'aide d'un **comportement**.\n\nCliquez sur le menu à 3 points ou faites un clic droit sur **$(playerHitBox)** et sélectionnez **Modifier les comportements**.", + "ar": "لنضيف حركة إلى فارسنا بمساعدة **سلوك**.\n\nانقر على قائمة النقاط الثلاث، أو انقر بزر الماوس الأيمن على **$(playerHitBox)**، واختر **تعديل السلوكيات**.", + "de": "Lassen Sie uns unserem Ritter mit Hilfe eines **Verhaltens** Bewegung hinzufügen.\n\nKlicken Sie auf das 3-Punkte-Menü oder rechtsklicken Sie auf **$(playerHitBox)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Agreguemos movimiento a nuestro caballero con la ayuda de un **comportamiento**.\n\nHaz clic en el menú de 3 puntos o haz clic derecho en **$(playerHitBox)** y selecciona **Editar comportamientos**.", + "fi": "Lisätään ritariimme liikettä **käyttäytymisen** avulla.\n\nNapsauta 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(playerHitBox)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo movimento al nostro cavaliere con l'aiuto di un **comportamento**.\n\nClicca sul menu a 3 punti o fai clic destro su **$(playerHitBox)** e seleziona **Modifica comportamenti**.", + "tr": "Şövalyemize bir **davranış** yardımıyla hareket ekleyelim.\n\n3 noktalı menüye tıklayın veya **$(playerHitBox)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "騎士に**動作**を追加しましょう。\n\n3点メニューをクリックするか、**$(playerHitBox)**を右クリックして、**動作を編集**を選択します。", + "ko": "**동작**의 도움으로 우리 기사에게 움직임을 추가해 보겠습니다.\n\n3점 메뉴를 클릭하거나 **$(playerHitBox)**를 마우스 오른쪽 버튼으로 클릭하고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy ruch naszemu rycerzowi za pomocą **zachowania**.\n\nKliknij menu z trzema kropkami lub kliknij prawym przyciskiem myszy **$(playerHitBox)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar movimento ao nosso cavaleiro com a ajuda de um **comportamento**.\n\nClique no menu de 3 pontos ou clique com o botão direito em **$(playerHitBox)** e selecione **Editar comportamentos**.", + "th": "มาเพิ่มการเคลื่อนไหวให้กับอัศวินของเราด้วยความช่วยเหลือของ **พฤติกรรม**\n\nคลิกที่เมนู 3 จุด หรือตรงคลิกขวาที่ **$(playerHitBox)** และเลือก **แก้ไขพฤติกรรม**", + "ru": "Давайте добавим движение нашему рыцарю с помощью **поведения**.\n\nНажмите на меню с 3 точками или щелкните правой кнопкой мыши на **$(playerHitBox)** и выберите **Редактировать поведения**.", + "sl": "Dodajmo premikanje našemu vitezu s pomočjo **vedenja**.\n\nKliknite na meni s 3 pikami ali desno kliknite na **$(playerHitBox)** in izberite **Uredi vedenja**.", + "sq": "Le të shtojmë lëvizje për kalorësin tonë me ndihmën e një **sjellje**.\n\nKlikoni në menunë me 3 pika, ose klikoni me të djathtën në **$(playerHitBox)** dhe zgjidhni **Redakto sjelljet**.", + "uk": "Додаймо рух нашому лицарю за допомогою **поведінки**.\n\nНатисніть на меню з 3 крапками або клацніть правою кнопкою миші на **$(playerHitBox)** і виберіть **Редагувати поведінки**.", + "zh": "让我们借助**行为**来给我们的骑士添加动作。\n\n点击三点菜单,或右键点击**$(playerHitBox)**,然后选择**编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's add movement to our knight with the help of a **behavior**.\n\nSelect, then long press on **$(playerHitBox)**, then select **Edit behaviors**.", + "fr": "Ajoutons du mouvement à notre chevalier avec l'aide d'un **comportement**.\n\nSélectionnez, puis appuyez longuement sur **$(playerHitBox)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف حركة إلى فارسنا بمساعدة **سلوك**.\n\nحدد، ثم اضغط مطولاً على **$(playerHitBox)**، ثم اختر **تعديل السلوكيات**.", + "de": "Lassen Sie uns unserem Ritter mit Hilfe eines **Verhaltens** Bewegung hinzufügen.\n\nWählen Sie, dann drücken Sie lange auf **$(playerHitBox)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Agreguemos movimiento a nuestro caballero con la ayuda de un **comportamiento**.\n\nSelecciona, luego mantén presionado **$(playerHitBox)** y selecciona **Editar comportamientos**.", + "fi": "Lisätään ritariimme liikettä **käyttäytymisen** avulla.\n\nValitse, sitten pidä pitkään painettuna **$(playerHitBox)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo movimento al nostro cavaliere con l'aiuto di un **comportamento**.\n\nSeleziona, poi premi a lungo su **$(playerHitBox)** e seleziona **Modifica comportamenti**.", + "tr": "Şövalyemize bir **davranış** yardımıyla hareket ekleyelim.\n\nSeçin, ardından **$(playerHitBox)** üzerinde uzun basın ve **Davranışları Düzenle**'yi seçin.", + "ja": "騎士に**動作**を追加しましょう。\n\n選択してから、**$(playerHitBox)**を長押しし、**動作を編集**を選択します。", + "ko": "**동작**의 도움으로 우리 기사에게 움직임을 추가해 보겠습니다.\n\n**$(playerHitBox)**를 선택한 다음 길게 눌러 **동작 편집**을 선택하세요.", + "pl": "Dodajmy ruch naszemu rycerzowi za pomocą **zachowania**.\n\nWybierz, a następnie przytrzymaj **$(playerHitBox)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar movimento ao nosso cavaleiro com a ajuda de um **comportamento**.\n\nSelecione, depois pressione e segure **$(playerHitBox)** e selecione **Editar comportamentos**.", + "th": "มาเพิ่มการเคลื่อนไหวให้กับอัศวินของเราด้วยความช่วยเหลือของ **พฤติกรรม**\n\nเลือก จากนั้นกดค้างที่ **$(playerHitBox)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Давайте добавим движение нашему рыцарю с помощью **поведения**.\n\nВыберите, затем нажмите и удерживайте **$(playerHitBox)**, затем выберите **Редактировать поведения**.", + "sl": "Dodajmo premikanje našemu vitezu s pomočjo **vedenja**.\n\nIzberite, nato dolgo pritisnite na **$(playerHitBox)**, nato izberite **Uredi vedenja**.", + "sq": "Le të shtojmë lëvizje për kalorësin tonë me ndihmën e një **sjellje**.\n\nZgjidhni, pastaj mbani shtypur **$(playerHitBox)**, pastaj zgjidhni **Redakto sjelljet**.", + "uk": "Додаймо рух нашому лицарю за допомогою **поведінки**.\n\nВиберіть, потім довго натискайте на **$(playerHitBox)**, потім виберіть **Редагувати поведінки**.", + "zh": "让我们借助**行为**来给我们的骑士添加动作。\n\n选择,然后长按**$(playerHitBox)**,然后选择**编辑行为**。" + } + }, + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it! Now the knight can move and jump so high!", + "fr": "Ça y est ! Maintenant, le chevalier peut se déplacer et sauter très haut !", + "ar": "هذا كل شيء! الآن يمكن للفارس أن يتحرك ويقفز عاليًا!", + "de": "Das war's! Jetzt kann der Ritter sich bewegen und so hoch springen!", + "es": "¡Eso es todo! ¡Ahora el caballero puede moverse y saltar muy alto!", + "fi": "Siinä se on! Nyt ritari voi liikkua ja hypätä todella korkealle!", + "it": "Ecco fatto! Ora il cavaliere può muoversi e saltare così in alto!", + "tr": "İşte bu kadar! Artık şövalye hareket edebilir ve çok yükseğe zıplayabilir!", + "ja": "これで完了です!これで騎士は動いて高くジャンプできます!", + "ko": "이제 완료되었습니다! 이제 기사가 움직이고 높이 점프할 수 있습니다!", + "pl": "To wszystko! Teraz rycerz może się poruszać i skakać tak wysoko!", + "pt": "É isso aí! Agora o cavaleiro pode se mover e pular bem alto!", + "th": "แค่นั้นแหละ! ตอนนี้อัศวินสามารถเคลื่อนที่และกระโดดได้สูงมาก!", + "ru": "Вот и все! Теперь рыцарь может двигаться и прыгать так высоко!", + "sl": "To je to! Zdaj se lahko vitez premika in skače zelo visoko!", + "sq": "Kaq është! Tani kalorësi mund të lëvizë dhe të kërcejë shumë lart!", + "uk": "Ось і все! Тепер лицар може рухатися і стрибати так високо!", + "zh": "就是这样!现在骑士可以移动并跳得很高了!" + } + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "inGameMessagePosition": "bottom-right", + "inGameMessage": { + "messageByLocale": { + "en": "The knight will fall in loop.\n\nLet's add a new behavior to the gray platform.", + "fr": "Le chevalier tombera en boucle.\n\nAjoutons un nouveau comportement à la plateforme grise.", + "ar": "سيسقط الفارس في حلقة متكررة.\n\nلنُضف سلوكًا جديدًا إلى المنصة الرمادية.", + "de": "Der Ritter wird in einer Schleife fallen.\n\nLass uns der grauen Plattform ein neues Verhalten hinzufügen.", + "es": "El caballero caerá en un bucle.\n\nAñadamos un nuevo comportamiento a la plataforma gris.", + "fi": "Ritari putoaa silmukkaan.\n\nLisätään uusi käyttäytyminen harmaalle alustalle.", + "it": "Il cavaliere cadrà in un loop.\n\nAggiungiamo un nuovo comportamento alla piattaforma grigia.", + "tr": "Şövalye döngü içinde düşecek.\n\nGri platforma yeni bir davranış ekleyelim.", + "ja": "ナイトはループして落下します。\n\n灰色のプラットフォームに新しい挙動を追加しましょう。", + "ko": "기사가 반복적으로 떨어질 것입니다.\n\n회색 플랫폼에 새로운 동작을 추가해 봅시다.", + "pl": "Rycerz będzie spadał w pętli.\n\nDodajmy nowe zachowanie do szarej platformy.", + "pt": "O cavaleiro cairá em um loop.\n\nVamos adicionar um novo comportamento à plataforma cinza.", + "th": "อัศวินจะตกลงไปในลูป\n\nมาเพิ่มพฤติกรรมใหม่ให้กับแพลตฟอร์มสีเทากันเถอะ", + "ru": "Рыцарь будет падать в цикле.\n\nДавайте добавим новое поведение серой платформе.", + "sl": "Vitez bo padal v zanki.\n\nDodajmo novo vedenje sivi platformi.", + "sq": "Kalorësi do të bjerë në një cikël të pafund.\n\nLe të shtojmë një sjellje të re në platformën gri.", + "uk": "Лицар буде падати в циклі.\n\nДодамо нову поведінку сірій платформі.", + "zh": "骑士会不断掉落。\n\n让我们给灰色平台添加一个新行为。" + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "tiles", + "behaviorListItemId": "#behavior-item-PlatformBehavior--PlatformBehavior", + "behaviorParameterPanelId": "#behavior-parameters-Platform", + "behaviorDisplayNameByLocale": { + "en": "Platform", + "fr": "Plateforme", + "ar": "منصة", + "de": "Plattform", + "es": "Plataforma", + "fi": "Alusta", + "it": "Piattaforma", + "tr": "Platform", + "ja": "プラットフォーム", + "ko": "플랫폼", + "pl": "Platforma", + "pt": "Plataforma", + "th": "แพลตฟอร์ม", + "ru": "Платформа", + "sl": "Platforma", + "sq": "Platformë", + "uk": "Платформа", + "zh": "平台" + }, + "parameters": [], + "objectHighlightDescription": { + "messageByLocale": { + "en": "Open this object to be able to add the Platform **behavior** on it.\n\nClick on the 3 dot menu, or right click on **$(tiles)**, and select **Edit behaviors**.", + "fr": "Ouvrez cet objet pour pouvoir y ajouter le **comportement** de plateforme.\n\nCliquez sur le menu à 3 points ou faites un clic droit sur **$(tiles)** et sélectionnez **Modifier les comportements**.", + "ar": "افتح هذا الكائن لتتمكن من إضافة **سلوك** المنصة عليه.\n\nانقر على قائمة النقاط الثلاث، أو انقر بزر الماوس الأيمن على **$(tiles)**، واختر **تعديل السلوكيات**.", + "de": "Öffnen Sie dieses Objekt, um das Platform-**Verhalten** hinzuzufügen.\n\nKlicken Sie auf das 3-Punkte-Menü oder rechtsklicken Sie auf **$(tiles)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Abre este objeto para poder agregar el **comportamiento** de plataforma.\n\nHaz clic en el menú de 3 puntos o haz clic derecho en **$(tiles)** y selecciona **Editar comportamientos**.", + "fi": "Avaa tämä objekti, jotta voit lisätä siihen **käyttäytymisen**.\n\nNapsauta 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(tiles)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Apri questo oggetto per poter aggiungere il **comportamento** Platform.\n\nClicca sul menu a 3 punti o fai clic destro su **$(tiles)** e seleziona **Modifica comportamenti**.", + "tr": "Bu nesneyi açarak üzerine Platform **davranışını** ekleyebilirsiniz.\n\n3 noktalı menüye tıklayın veya **$(tiles)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "このオブジェクトを開いて、プラットフォーマーの**動作**を追加できるようにします。\n\n3点メニューをクリックするか、**$(tiles)**を右クリックして、**動作を編集**を選択します。", + "ko": "이 객체를 열어 플랫포머 **동작**을 추가할 수 있도록 하세요.\n\n3점 메뉴를 클릭하거나 **$(tiles)**를 마우스 오른쪽 버튼으로 클릭하고 **동작 편집**을 선택하세요.", + "pl": "Otwórz ten obiekt, aby móc dodać **zachowanie** Platform.\n\nKliknij menu z trzema kropkami lub kliknij prawym przyciskiem myszy **$(tiles)** i wybierz **Edytuj zachowania**.", + "pt": "Abra este objeto para poder adicionar o **comportamento** de Plataforma.\n\nClique no menu de 3 pontos ou clique com o botão direito em **$(tiles)** e selecione **Editar comportamentos**.", + "th": "เปิดวัตถุนี้เพื่อเพิ่ม **พฤติกรรม** แพลตฟอร์ม\n\nคลิกที่เมนู 3 จุด หรือตรงคลิกขวาที่ **$(tiles)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Откройте этот объект, чтобы добавить **поведение** платформера.\n\nНажмите на меню с 3 точками или щелкните правой кнопкой мыши на **$(tiles)** и выберите **Редактировать поведения**.", + "sl": "Odprite ta objekt, da lahko dodate **vedenje** Platform.\n\nKliknite na meni s 3 pikami ali desno kliknite na **$(tiles)** in izberite **Uredi vedenja**.", + "sq": "Hapni këtë objekt për të qenë në gjendje të shtoni **sjelljen** Platform mbi të.\n\nKlikoni në menunë me 3 pika, ose klikoni me të djathtën mbi **$(tiles)** dhe zgjidhni **Redakto sjelljet**.", + "uk": "Відкрийте цей об'єкт, щоб додати **поведінку** платформера.\n\nНатисніть на меню з 3 крапками або клацніть правою кнопкою миші на **$(tiles)** і виберіть **Редагувати поведінки**.", + "zh": "打开这个对象以便能够在其上添加平台**行为**。\n\n点击三点菜单,或右键点击**$(tiles)**,然后选择**编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Open this object to be able to add the Platform **behavior** on it.\n\nSelect, then long press on **$(tiles)**, then select **Edit behaviors**.", + "fr": "Ouvrez cet objet pour pouvoir ajouter le **comportement** Plateforme dessus.\n\nSélectionnez, puis appuyez longuement sur **$(tiles)**, puis sélectionnez **Modifier les comportements**.", + "ar": "افتح هذا الكائن لتتمكن من إضافة **سلوك** المنصة عليه.\n\nحدد، ثم اضغط مطولاً على **$(tiles)**، ثم اختر **تعديل السلوكيات**.", + "de": "Öffnen Sie dieses Objekt, um das Platform-**Verhalten** darauf hinzufügen zu können.\n\nWählen Sie, dann drücken Sie lange auf **$(tiles)**, dann wählen Sie **Verhalten bearbeiten**.", + "es": "Abre este objeto para poder agregar el **comportamiento** de Plataforma en él.\n\nSelecciona, luego mantén presionado **$(tiles)**, luego selecciona **Editar comportamientos**.", + "fi": "Avaa tämä objekti, jotta voit lisätä siihen **käyttäytymisen**.\n\nValitse, sitten pidä pitkään painettuna **$(tiles)**, sitten valitse **Muokkaa käyttäytymistä**.", + "it": "Apri questo oggetto per poter aggiungere il **comportamento** di Piattaforma su di esso.\n\nSeleziona, poi premi a lungo su **$(tiles)**, poi seleziona **Modifica comportamenti**.", + "tr": "Bu nesneyi açarak üzerine Platform **davranışını** ekleyebilirsiniz.\n\nSeçin, ardından **$(tiles)** üzerinde uzun basın, ardından **Davranışları Düzenle**'yi seçin.", + "ja": "このオブジェクトを開いて、そこにプラットフォーマーの**動作**を追加できるようにします。\n\n選択してから、**$(tiles)**を長押しし、次に**動作を編集**を選択します。", + "ko": "이 객체를 열어 플랫포머 **동작**을 추가할 수 있도록 합니다.\n\n선택한 다음 **$(tiles)**를 길게 눌러 **동작 편집**을 선택하세요.", + "pl": "Otwórz ten obiekt, aby móc dodać **zachowanie** Platform.\n\nWybierz, a następnie przytrzymaj **$(tiles)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Abra este objeto para poder adicionar o **comportamento** de Plataforma nele.\n\nSelecione, em seguida, pressione e segure **$(tiles)**, em seguida, selecione **Editar comportamentos**.", + "th": "เปิดวัตถุนี้เพื่อเพิ่ม **พฤติกรรม** แพลตฟอร์ม ในนั้น\n\nเลือก จากนั้นกดค้างที่ **$(tiles)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Откройте этот объект, чтобы добавить **поведение** платформера на него.\n\nВыберите, затем нажмите и удерживайте **$(tiles)**, затем выберите **Редактировать поведения**.", + "sl": "Odprite ta objekt, da lahko dodate **vedenje** Platform nanj.\n\nIzberite, nato dolgo pritisnite na **$(tiles)**, nato izberite **Uredi vedenja**.", + "sq": "Hapni këtë objekt për të qenë në gjendje të shtoni **sjelljen** Platform mbi të.\n\nZgjidhni, pastaj mbani shtypur **$(tiles)**, pastaj zgjidhni **Redakto sjelljet**.", + "uk": "Відкрийте цей об'єкт, щоб додати **поведінку** платформера на нього.\n\nВиберіть, потім натисніть і утримуйте **$(tiles)**, потім виберіть **Редагувати поведінки**.", + "zh": "打开此对象以添加平台**行为**。\n\n选择,然后长按**$(tiles)**,然后选择**编辑行为**。" + } + }, + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it! Now the knight can stand on the object $(tiles) that use the Platform behavior.", + "fr": "C'est tout ! Maintenant, le chevalier peut se tenir sur l'objet $(tiles) qui utilise le comportement de plateforme.", + "ar": "هذا كل شيء! الآن يمكن للفارس الوقوف على الكائن $(tiles) الذي يستخدم سلوك النظام الأساسي.", + "de": "Das ist es! Jetzt kann der Ritter auf dem Objekt $(tiles) stehen, das das Plattformverhalten verwendet.", + "es": "¡Eso es todo! Ahora el caballero puede estar de pie sobre el objeto $(tiles) que utiliza el comportamiento de plataforma.", + "fi": "Siinä se kaikki! Nyt ritari voi seistä $(tiles) -objektilla, joka käyttää alustan käyttäytymistä.", + "it": "È tutto qui! Ora il cavaliere può stare sull'oggetto $(tiles) che utilizza il comportamento della piattaforma.", + "tr": "Tamam! Artık şövalye, Platform davranışını kullanan $(tiles) nesnesinin üzerinde durabilir.", + "ja": "以上です!これで騎士は、プラットフォーム動作を使用している$(tiles)オブジェクトの上に立つことができます。", + "ko": "그게 다야! 이제 기사가 플랫폼 동작을 사용하는 $(tiles) 객체 위에 서 있을 수 있습니다.", + "pl": "To wszystko! Teraz rycerz może stać na obiekcie $(tiles), który używa zachowania Platformy.", + "pt": "É isso aí! Agora o cavaleiro pode ficar em cima do objeto $(tiles) que usa o comportamento da plataforma.", + "th": "เสร็จสิ้นแล้ว! ตอนนี้อัศวินสามารถยืนบนวัตถุ $(tiles) ที่ใช้พฤติกรรมของแพลตฟอร์มได้", + "ru": "Вот и всё! Теперь рыцарь может стоять на объекте $(tiles), который использует поведение платформы.", + "sl": "To je to! Zdaj se lahko vitez postavi na predmet $(tiles), ki uporablja vedenje platforme.", + "sq": "Kështu është! Tani kalorësi mund të qëndrojë në objektin $(tiles) që përdor sjelljen e platformës.", + "uk": "Ось і все! Тепер лицар може стояти на об'єкті $(tiles), який використовує поведінку платформи.", + "zh": "就是这样!现在骑士可以站在使用平台行为的对象$(tiles)上。" + } + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "description": { + "messageByLocale": { + "en": "We're done!\nLet's test our game to see the changes we've made!\n\nClick on the **Preview** button.", + "fr": "Nous avons terminé !\nTestons notre jeu pour voir les changements que nous avons apportés !\n\nCliquez sur le bouton **Aperçu**.", + "ar": "لقد انتهينا!\nلنقم باختبار لعبتنا لرؤية التغييرات التي قمنا بها!\n\nانقر فوق زر **معاينة**.", + "de": "Wir sind fertig!\nTesten wir unser Spiel, um die Änderungen zu sehen, die wir vorgenommen haben!\n\nKlicken Sie auf die Schaltfläche **Vorschau**.", + "es": "¡Hemos terminado!\n¡Probemos nuestro juego para ver los cambios que hemos hecho!\n\nHaz clic en el botón **Vista previa**.", + "fi": "Olemme valmiita!\nTestataan peliämme nähdäksemme tekemämme muutokset!\n\nNapsauta **Esikatselu**-painiketta.", + "it": "Abbiamo finito!\nTestiamo il nostro gioco per vedere le modifiche che abbiamo apportato!\n\nFai clic sul pulsante **Anteprima**.", + "tr": "Tamamlandı!\nYaptığımız değişiklikleri görmek için oyunumuzu test edelim!\n\n**Önizleme** düğmesine tıklayın.", + "ja": "完了しました!\n私たちが行った変更を確認するために、ゲームをテストしましょう!\n\n**プレビュー**ボタンをクリックします。", + "ko": "완료되었습니다!\n만든 변경 사항을 확인하기 위해 게임을 테스트해 봅시다!\n\n**미리보기** 버튼을 클릭하세요.", + "pl": "Skończone!\nPrzetestujmy naszą grę, aby zobaczyć wprowadzone zmiany!\n\nKliknij przycisk **Podgląd**.", + "pt": "Estamos prontos!\nVamos testar nosso jogo para ver as mudanças que fizemos!\n\nClique no botão **Visualizar**.", + "th": "เราเสร็จสิ้นแล้ว!\nมาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราทำ!\n\nคลิกที่ปุ่ม **ดูตัวอย่าง**", + "ru": "Мы закончили!\nДавайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли!\n\nНажмите кнопку **Предпросмотр**.", + "sl": "Končano je!\nPreizkusimo našo igro, da vidimo spremembe, ki smo jih naredili!\n\nKliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar!\nLe të testojmë lojën tonë për të parë ndryshimet që kemi bërë!\n\nKliko në butonin **Shiko paraprakisht**.", + "uk": "Ми закінчили!\nДавайте протестуємо нашу гру, щоб побачити зміни, які ми зробили!\n\nНатисніть кнопку **Попередній перегляд**.", + "zh": "我们完成了!\n让我们测试游戏以查看我们所做的更改!\n\n点击**预览**按钮。" + } + } + } + ], + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد انتهيت من هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai completato questa lezione!", + "tr": "# Bu dersi tamamladınız!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 마쳤습니다!", + "pl": "# Zakończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณได้เสร็จสิ้นบทเรียนนี้แล้ว!", + "ru": "# Вы завершили это урок!", + "sl": "# Dokončali ste ta pouk!", + "sq": "# Keni përfunduar këtë mësim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你已完成本课程!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, dans ce tutoriel vous avez appris comment :", + "ar": "أحسنت، في هذا الدرس التعليمي تعلمت كيفية :", + "de": "Gut gemacht, in diesem Tutorial haben Sie gelernt, wie Sie:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derste şunları öğrendiniz:", + "ja": "お疲れ様です、このチュートリアルでは以下の方法を学びました:", + "ko": "잘 했어요, 이 튜토리얼에서는 다음을 배웠습니다:", + "pl": "Dobrze wykonane, w tym samouczku nauczyłeś się, jak:", + "pt": "Bem feito, neste tutorial você aprendeu como:", + "th": "เก่งมาก เรียนรู้วิธีทำดังนี้ในบทแนะนำนี้", + "ru": "Отлично сработано, в этом учебнике вы узнали, как:", + "sl": "Dobro opravljeno, v tem vadnem programu ste se naučili, kako:", + "sq": "Mirë, në këtë udhëzues keni mësuar si të:", + "uk": "Добре зроблено, у цьому підручнику ви вивчили, як:", + "zh": "干得好,在这个教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to control a player with a Platformer Object behaviors\n\n- How to edit the jump speed of the player\n\n- How to add collisions in a platformer", + "fr": "- Comment contrôler un joueur avec les comportements d'un objet de plateforme\n\n- Comment modifier la vitesse de saut du joueur\n\n- Comment ajouter des collisions dans un jeu de plateforme", + "ar": "- كيفية التحكم في اللاعب باستخدام سلوكيات كائن النظام الأساسي\n\n- كيفية تحرير سرعة القفز للاعب\n\n- كيفية إضافة تصادمات في لعبة منصات", + "de": "- Wie man einen Spieler mit den Verhaltensweisen eines Plattformobjekts steuert\n\n- Wie man die Sprunggeschwindigkeit des Spielers bearbeitet\n\n- Wie man Kollisionen in einem Plattformspiel hinzufügt", + "es": "- Cómo controlar a un jugador con los comportamientos de un objeto de plataforma\n\n- Cómo editar la velocidad de salto del jugador\n\n- Cómo agregar colisiones en un juego de plataformas", + "fi": "- Kuinka hallita pelaajaa alustan käyttäytymisillä\n\n- Kuinka muokata pelaajan hyppyä\n\n- Kuinka lisätä törmäykset alustapeliin", + "it": "- Come controllare un giocatore con i comportamenti di un oggetto platformer\n\n- Come modificare la velocità di salto del giocatore\n\n- Come aggiungere collisioni in un platformer", + "tr": "- Bir Oyuncuyu Platformcu Nesne davranışlarıyla nasıl kontrol edeceğinizi\n\n- Oyuncunun zıplama hızını nasıl düzenleyeceğinizi\n\n- Bir platform oyununda çarpışmaları nasıl ekleyeceğinizi", + "ja": "- プラットフォームオブジェクトの動作でプレイヤーを制御する方法\n\n- プレイヤーのジャンプ速度を編集する方法\n\n- プラットフォームでの衝突の追加方法", + "ko": "- 플랫폼 오브젝트 동작으로 플레이어를 제어하는 방법\n\n- 플레이어의 점프 속도를 편집하는 방법\n\n- 플랫폼에 충돌 추가하는 방법", + "pl": "- Jak kontrolować gracza za pomocą zachowań obiektu platformera\n\n- Jak edytować prędkość skoku gracza\n\n- Jak dodawać kolizje w grze platformowej", + "pt": "- Como controlar um jogador com os comportamentos de um objeto de plataforma\n\n- Como editar a velocidade de pulo do jogador\n\n- Como adicionar colisões em um jogo de plataforma", + "th": "- วิธีการควบคุมผู้เล่นด้วยพฤติกรรมของวัตถุแพลตฟอร์ม\n\n- วิธีการแก้ไขความเร็วในการกระโดดของผู้เล่น\n\n- วิธีการเพิ่มการชนในเกมแพลตฟอร์ม", + "ru": "- Как управлять игроком с помощью поведений объекта платформера\n\n- Как редактировать скорость прыжка игрока\n\n- Как добавить столкновения в платформер", + "sl": "- Kako nadzirati igralca s vedenji predmeta platforme\n\n- Kako urediti hitrost skoka igralca\n\n- Kako dodati trčenja v platformer", + "sq": "- Si të kontrolloni një lojtar me sjelljet e një objekti platformer\n\n- Si të ndryshoni shpejtësinë e kalimit të lojtarit\n\n- Si të shtoni përplasje në një platformë", + "uk": "- Як керувати гравцем за допомогою поведінки об'єкта платформера\n\n- Як редагувати швидкість стрибка гравця\n\n- Як додати зіткнення в платформері", + "zh": "- 如何使用平台对象行为来控制玩家\n\n- 如何编辑玩家的跳跃速度\n\n- 如何在平台游戏中添加碰撞" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des éléments à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir añadiendo cosas a este juego o publicarlo!", + "fi": "Voit jatkaa asioiden lisäämistä tähän peliin tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、それを公開することができます!", + "ko": "이 게임에 계속해서 새로운 요소를 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "th": "คุณสามารถเพิ่มสิ่งต่างๆในเกมนี้ต่อได้หรือตีพิมพ์!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni atë!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续添加内容到这个游戏中或发布它!" + } + } + ] + } +} diff --git a/tutorials/in-app/object3d.json b/tutorials/in-app/object3d.json new file mode 100644 index 0000000..24c219c --- /dev/null +++ b/tutorials/in-app/object3d.json @@ -0,0 +1,673 @@ +{ + "id": "object3d", + "titleByLocale": { + "en": "Let's add a 3D object to our game", + "fr": "Ajoutons un objet 3D à notre jeu", + "ar": "لنضيف كائن ثلاثي الأبعاد إلى لعبتنا", + "de": "Fügen wir unserem Spiel ein 3D-Objekt hinzu", + "es": "Agreguemos un objeto 3D a nuestro juego", + "fi": "Lisätään 3D-objekti peliimme", + "it": "Aggiungiamo un oggetto 3D al nostro gioco", + "tr": "Oyunumuza 3D bir nesne ekleyelim", + "ja": "ゲームに3Dオブジェクトを追加しましょう", + "ko": "게임에 3D 객체를 추가합시다", + "pl": "Dodajmy obiekt 3D do naszej gry", + "pt": "Vamos adicionar um objeto 3D ao nosso jogo", + "th": "มาเพิ่มวัตถุ 3 มิติในเกมของเรากันเถอะ", + "ru": "Добавим 3D объект в нашу игру", + "sl": "Dodajmo 3D predmet v našo igro", + "sq": "Le të shtojmë një objekt 3D në lojën tonë", + "uk": "Додамо 3D об'єкт до нашої гри", + "zh": "让我们在游戏中添加一个3D对象" + }, + "bulletPointsByLocale": [ + { + "en": "Add a 3D Box", + "fr": "Ajoutez une boîte 3D", + "ar": "أضف صندوق ثلاثي الأبعاد", + "de": "Füge eine 3D-Box hinzu", + "es": "Agrega una caja 3D", + "fi": "Lisää 3D-ruutu", + "it": "Aggiungi una scatola 3D", + "tr": "3D Kutu Ekle", + "ja": "3Dボックスを追加する", + "ko": "3D 박스를 추가하세요", + "pl": "Dodaj pudełko 3D", + "pt": "Adicione uma caixa 3D", + "th": "เพิ่มกล่อง 3 มิติ", + "ru": "Добавить 3D ящик", + "sl": "Dodajte 3D škatlo", + "sq": "Shto një kuti 3D", + "uk": "Додайте 3D ящик", + "zh": "添加一个3D盒子" + }, + { + "en": "Add a behavior", + "fr": "Ajoutez un comportement", + "ar": "أضف سلوكًا", + "de": "Füge ein Verhalten hinzu", + "es": "Agrega un comportamiento", + "fi": "Lisää käyttäytyminen", + "it": "Aggiungi un comportamento", + "tr": "Davranış ekle", + "ja": "動作を追加する", + "ko": "행동 추가", + "pl": "Dodaj zachowanie", + "pt": "Adicione um comportamento", + "th": "เพิ่มพฤติกรรม", + "ru": "Добавить поведение", + "sl": "Dodajte vedenje", + "sq": "Shto një sjellje", + "uk": "Додайте поведінку", + "zh": "添加行为" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "gameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/object3d/game.json", + "initialProjectData": { + "gameScene": "GameScene", + "platform": "Platform" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Ju keni perfunduar kete mesim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, voici ce que vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du geler:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa opit miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derslerde şunları öğrendiniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다.", + "pl": "Dobrze, w tym samouczku nauczyłeś się, jak:", + "pt": "Bom trabalho, neste tutorial você aprendeu como:", + "ru": "Хорошо, в этом уроке вы узнали, как:", + "sl": "Bravo, v tem vadnem programu ste se naučili, kako:", + "sq": "Bravo, ne kete mesim ju keni mesuar si te:", + "th": "ทำได้ดีเยี่ยม, ในบทเรียนนี้คุณได้เรียนรู้วิธี:", + "uk": "Добре, в цьому уроці ви дізналися, як:", + "zh": "做得好,在本教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- Use a 3D Box\n\n- Add a behavior", + "fr": "- Utiliser une boîte 3D\n\n- Ajouter un comportement", + "ar": "- استخدام صندوق ثلاثي الأبعاد\n\n- إضافة سلوك", + "de": "- Verwenden Sie eine 3D-Box\n\n- Fügen Sie ein Verhalten hinzu", + "es": "- Usar una caja 3D\n\n- Añadir un comportamiento", + "fi": "- Käytä 3D-ruutua\n\n- Lisää käyttäytyminen", + "it": "- Utilizzare una scatola 3D\n\n- Aggiungere un comportamento", + "tr": "- 3D Kutu Kullan\n\n- Davranış ekle", + "ja": "- 3Dボックスを使用する\n\n- 動作を追加する", + "ko": "- 3D 상자 사용\n\n- 동작 추가", + "pl": "- Użyj pudełka 3D\n\n- Dodaj zachowanie", + "pt": "- Usar uma caixa 3D\n\n- Adicionar um comportamento", + "ru": "- Использовать 3D-бокс\n\n- Добавить поведение", + "sl": "- Uporabite 3D polje\n\n- Dodajte vedenje", + "sq": "- Përdor një kuti 3D\n\n- Shtoni një sjellje", + "th": "- ใช้กล่อง 3D\n\n- เพิ่มพฤติกรรม", + "uk": "- Використовуйте 3D-бокс\n\n- Додайте поведінку", + "zh": "- 使用3D盒子\n\n- 添加行为" + } + }, + { + "messageByLocale": { + "en": "Now try to get the character to the goal button, while avoiding the red objects!", + "fr": "Maintenant, essayez d'amener le personnage jusqu'au bouton objectif, tout en évitant les objets rouges !", + "ar": "الآن حاول الوصول بالشخصية إلى زر الهدف، مع تجنب الكائنات الحمراء!", + "de": "Versuchen Sie nun, die Figur zum Zielknopf zu bringen, während Sie die roten Objekte vermeiden!", + "es": "¡Ahora intenta llevar al personaje al botón de objetivo, evitando los objetos rojos!", + "fi": "Yritä nyt saada hahmo tavoitepainikkeeseen, välttäen punaisia esineitä!", + "it": "Ora prova a portare il personaggio al pulsante obiettivo, evitando gli oggetti rossi!", + "tr": "Şimdi karakteri hedef düğmeye ulaştırmayı deneyin, kırmızı nesnelerden kaçınarak!", + "ja": "赤いオブジェクトを避けながら、キャラクターをゴールボタンに移動させてみてください!", + "ko": "빨간 물체를 피하면서 캐릭터를 목표 버튼으로 이동시켜보세요!", + "pl": "Teraz spróbuj doprowadzić postać do przycisku celu, unikając czerwonych obiektów!", + "pt": "Agora tente levar o personagem até o botão de objetivo, evitando os objetos vermelhos!", + "ru": "Теперь попробуйте довести персонажа до кнопки цели, избегая красных объектов!", + "sl": "Poskusite zdaj, da osebo pripeljete do ciljnega gumba, pri tem pa se izognete rdečim predmetom!", + "sq": "Tani provoni të merrni personazhin te butoni i qëllimit, duke shmangur objektet e kuqe!", + "th": "ลองพยายามนำตัวละครไปยังปุ่มเป้าหมาย โดยหลีกเลี่ยงวัตถุสีแดง!", + "uk": "Тепер спробуйте довести персонажа до кнопки цілі, уникайте червоних об'єктів!", + "zh": "现在试着将角色带到目标按钮,同时避开红色物体!" + } + } + ] + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a platformer where the player must reach the goal button to complete the level. Let's check the current game state.\n\nClick the **Preview** button to play.", + "fr": "Ce jeu est un jeu de plateforme où le joueur doit atteindre le bouton d'objectif pour terminer le niveau. Voyons l'état actuel du jeu.\n\nCliquez sur le bouton **Aperçu** pour jouer.", + "ar": "هذه اللعبة هي لعبة منصات حيث يجب على اللاعب الوصول إلى زر الهدف لإنهاء المستوى. دعونا نتحقق من حالة اللعبة الحالية.\n\nانقر على زر **المعاينة** للعب.", + "de": "Dieses Spiel ist ein Platformer, bei dem der Spieler den Zielknopf erreichen muss, um das Level abzuschließen. Lassen Sie uns den aktuellen Spielstand überprüfen.\n\nKlicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.", + "es": "Este juego es un plataformas donde el jugador debe alcanzar el botón de objetivo para completar el nivel. Veamos el estado actual del juego.\n\nHaz clic en el botón **Vista previa** para jugar.", + "fi": "Tämä peli on tasohyppely, jossa pelaajan on saavutettava tavoitenappi tason suorittamiseksi. Katsotaan pelin nykytilaa.\n\nNapsauta **Esikatselu**-painiketta pelataksesi.", + "it": "Questo gioco è un platformer in cui il giocatore deve raggiungere il pulsante obiettivo per completare il livello. Vediamo lo stato attuale del gioco.\n\nClicca sul pulsante **Anteprima** per giocare.", + "tr": "Bu oyun, oyuncunun seviyeyi tamamlamak için hedef düğmesine ulaşması gereken bir platform oyunudur. Mevcut oyun durumunu kontrol edelim.\n\nOynamak için **Önizleme** düğmesine tıklayın.", + "ja": "このゲームは、プレイヤーがゴールボタンに到達してレベルをクリアするプラットフォーマーです。現在のゲームの状態を確認しましょう。\n\n**プレビュー**ボタンをクリックしてプレイしてください。", + "ko": "이 게임은 플레이어가 목표 버튼에 도달하여 레벨을 완료해야 하는 플랫폼 게임입니다. 현재 게임 상태를 확인해 보겠습니다.\n\n플레이하려면 **미리보기** 버튼을 클릭하세요.", + "pl": "Ta gra to platformówka, w której gracz musi dotrzeć do przycisku celu, aby ukończyć poziom. Sprawdźmy aktualny stan gry.\n\nKliknij przycisk **Podgląd**, aby zagrać.", + "pt": "Este jogo é um jogo de plataforma onde o jogador deve alcançar o botão de objetivo para completar o nível. Vamos verificar o estado atual do jogo.\n\nClique no botão **Pré-visualização** para jogar.", + "th": "เกมนี้เป็นเกมแพลตฟอร์มที่ผู้เล่นต้องไปถึงปุ่มเป้าหมายเพื่อผ่านด่าน มาดูสถานะปัจจุบันของเกมกัน\n\nคลิกปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "ru": "Эта игра — платформер, в котором игрок должен достичь целевой кнопки, чтобы завершить уровень. Давайте проверим текущее состояние игры.\n\nНажмите кнопку **Предварительный просмотр**, чтобы играть.", + "sl": "Ta igra je platformer, kjer mora igralec doseči ciljni gumb, da dokonča stopnjo. Preverimo trenutno stanje igre.\n\nKliknite gumb **Predogled**, da igrate.", + "sq": "Kjo lojë është një platformë ku lojtari duhet të arrijë butonin e objektivit për të përfunduar nivelin. Le të shohim gjendjen aktuale të lojës.\n\nKlikoni butonin **Parashikim** për të luajtur.", + "uk": "Ця гра — платформер, у якій гравець повинен дістатися до цільової кнопки, щоб завершити рівень. Давайте перевіримо поточний стан гри.\n\nНатисніть кнопку **Попередній перегляд**, щоб грати.", + "zh": "这个游戏是一款平台游戏,玩家必须到达目标按钮才能完成关卡。让我们检查当前的游戏状态。\n\n点击 **预览** 按钮开始游戏。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "The character is stuck in a loop, continuously falling onto the red objects. We need to add solid ground beneath their feet using a platform object! Let's fix this!\nClose this window and go back to the editor.", + "fr": "Le personnage est coincé dans une boucle et tombe en continu sur les objets rouges. Nous devons ajouter un sol solide sous ses pieds avec un objet plateforme ! Corrigeons cela !\nFermez cette fenêtre et retournez à l'éditeur.", + "ar": "الشخصية عالقة في حلقة، تسقط باستمرار على الكائنات الحمراء. نحتاج إلى إضافة أرضية صلبة تحت قدميها باستخدام كائن منصة! لنصلح هذا!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Die Figur steckt in einer Schleife fest und fällt ständig auf die roten Objekte. Wir müssen festen Boden mit einem Plattform-Objekt unter ihren Füßen hinzufügen! Lassen wir das beheben!\nSchließe dieses Fenster und gehe zurück zum Editor.", + "es": "El personaje está atrapado en un bucle, cayendo continuamente sobre los objetos rojos. ¡Necesitamos añadir un suelo sólido debajo de sus pies con un objeto plataforma! ¡Arreglémoslo!\nCierra esta ventana y vuelve al editor.", + "fi": "Hahmo on jumissa silmukassa ja putoaa jatkuvasti punaisille esineille. Meidän täytyy lisätä kiinteä alusta sen jalkojen alle käyttämällä taso-objektia! Korjataan tämä!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Il personaggio è bloccato in un ciclo, cadendo continuamente sugli oggetti rossi. Dobbiamo aggiungere un terreno solido sotto i suoi piedi con un oggetto piattaforma! Sistemiamolo!\nChiudi questa finestra e torna all'editor.", + "tr": "Karakter bir döngü içinde sıkışmış ve sürekli kırmızı nesnelerin üzerine düşüyor. Ayaklarının altına bir platform nesnesiyle sağlam bir zemin eklemeliyiz! Hadi bunu düzeltelim!\nBu pencereyi kapat ve editöre geri dön.", + "ja": "キャラクターがループにはまり、赤いオブジェクトの上に落ち続けています。足元にプラットフォームオブジェクトを追加して、しっかりした地面を作りましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "캐릭터가 루프에 갇혀 계속 빨간 물체 위로 떨어지고 있습니다. 발 아래에 플랫폼 객체를 추가하여 단단한 바닥을 만들어야 합니다! 수정해 봅시다!\n이 창을 닫고 편집기로 돌아가세요.", + "pl": "Postać utknęła w pętli, ciągle spadając na czerwone obiekty. Musimy dodać solidne podłoże pod jej stopami za pomocą obiektu platformy! Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "O personagem está preso em um loop, caindo continuamente sobre os objetos vermelhos. Precisamos adicionar um chão sólido sob seus pés com um objeto de plataforma! Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "th": "ตัวละครติดอยู่ในลูป ตกลงบนวัตถุสีแดงตลอดเวลา เราจำเป็นต้องเพิ่มพื้นแข็งใต้เท้าของเขาโดยใช้วัตถุแพลตฟอร์ม! มาแก้ไขกันเถอะ!\nปิดหน้าต่างนี้แล้วกลับไปที่ตัวแก้ไข", + "ru": "Персонаж застрял в цикле, постоянно падая на красные объекты. Нам нужно добавить твердую землю под его ноги, используя объект платформы! Давайте это исправим!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Lik je obtičal v zanki in neprestano pada na rdeče predmete. Pod njegove noge moramo dodati trdna tla s predmetom platforme! Popravimo to!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Karakteri është bllokuar në një cikël, duke rënë vazhdimisht mbi objektet e kuqe. Duhet të shtojmë një tokë të qëndrueshme nën këmbët e tij me një objekt platforme! Ta rregullojmë këtë!\nMbylle këtë dritare dhe kthehu te redaktori.", + "uk": "Персонаж застряг у циклі, постійно падаючи на червоні об'єкти. Нам потрібно додати твердий ґрунт під його ноги, використовуючи об'єкт платформи! Давайте це виправимо!\nЗакрийте це вікно і поверніться до редактора.", + "zh": "角色陷入循环,不断掉落到红色物体上。我们需要使用平台对象在他脚下添加坚实的地面!让我们来修复它!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開きます。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri **Predmete** ploščo.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:platform", + "nextStepTrigger": { + "presenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "placement": "top", + "description": { + "messageByLocale": { + "en": "We've created a 3D Box **$(platform)** for you! It's already configured with different textures\n\nLet's check it out by clicking on the 3 dot menu, or right click on **$(platform)**, and select **Edit object**.", + "fr": "Nous avons créé une boîte 3D **$(platform)** pour vous ! Elle est déjà configurée avec différentes textures\n\nAllons la voir en cliquant sur le menu à 3 points, ou en cliquant avec le bouton droit sur **$(platform)**, et en sélectionnant **Modifier l'objet**.", + "ar": "لقد قمنا بإنشاء صندوق 3D **$(platform)** لك! إنها مكونة بالفعل بمختلف القوام\n\nلنلقي نظرة عليها عن طريق النقر على القائمة المنسدلة المكونة من 3 نقاط، أو النقر بزر الفأرة الأيمن على **$(platform)**، واختيار **تحرير الكائن**.", + "de": "Wir haben eine 3D-Box **$(platform)** für Sie erstellt! Sie ist bereits mit verschiedenen Texturen konfiguriert\n\nLassen Sie uns das überprüfen, indem Sie auf das 3-Punkte-Menü klicken oder mit der rechten Maustaste auf **$(platform)** klicken und **Objekt bearbeiten** auswählen.", + "es": "¡Hemos creado una caja 3D **$(platform)** para ti! Ya está configurada con diferentes texturas\n\nVamos a verla haciendo clic en el menú de 3 puntos, o haciendo clic derecho en **$(platform)**, y seleccionando **Editar objeto**.", + "fi": "Olemme luoneet sinulle 3D-ruudun **$(platform)**! Se on jo määritetty eri tekstuureilla\n\nTarkistetaan se napsauttamalla 3 pisteen valikkoa tai napsauttamalla hiiren oikealla painikkeella **$(platform)** ja valitsemalla **Muokkaa objektia**.", + "it": "Abbiamo creato una scatola 3D **$(platform)** per te! È già configurata con diverse texture\n\nDiamo un'occhiata facendo clic sul menu a 3 punti, o facendo clic con il pulsante destro su **$(platform)**, e selezionando **Modifica oggetto**.", + "tr": "Sizin için 3D Kutu **$(platform)** oluşturduk! Zaten farklı dokularla yapılandırılmış\n\n3 nokta menüsüne tıklayarak veya **$(platform)** üzerinde sağ tıklayarak ve **Nesneyi Düzenle**'yi seçerek inceleyelim.", + "ja": "3Dボックス **$(platform)** を作成しました! すでにさまざまなテクスチャで構成されています\n\n3点メニューをクリックするか、**$(platform)** を右クリックして **オブジェクトを編集** を選択して確認しましょう。", + "ko": "3D 상자 **$(platform)** 를 만들었습니다! 이미 다양한 텍스처로 구성되어 있습니다\n\n3 점 메뉴를 클릭하거나 **$(platform)**을 마우스 오른쪽 단추로 클릭하고 **객체 편집**을 선택하여 확인해 보겠습니다.", + "pl": "Stworzyliśmy dla ciebie 3D Box **$(platform)**! Jest już skonfigurowany z różnymi teksturami\n\nSprawdźmy to, klikając na menu 3 kropek lub klikając prawym przyciskiem myszy na **$(platform)** i wybierając **Edytuj obiekt**.", + "pt": "Criamos uma caixa 3D **$(platform)** para você! Já está configurada com diferentes texturas\n\nVamos dar uma olhada clicando no menu de 3 pontos, ou clicando com o botão direito em **$(platform)**, e selecionando **Editar objeto**.", + "ru": "Мы создали для вас 3D-бокс **$(platform)**! Он уже настроен с различными текстурами\n\nДавайте проверим это, нажав на меню из 3 точек или щелкнув правой кнопкой мыши на **$(platform)** и выбрав **Редактировать объект**.", + "sl": "Ustvarili smo 3D polje **$(platform)** za vas! Je že konfiguriran z različnimi teksturami\n\nPreverimo ga tako, da kliknemo na meni z 3 pikami ali z desno miškino tipko kliknemo na **$(platform)** in izberemo **Uredi predmet**.", + "sq": "Kemi krijuar një kuti 3D **$(platform)** për ju! Është tashmë e konfiguruar me tekstura të ndryshme\n\nLe të e kontrollojmë duke klikuar në menunë 3 pikësh, ose duke klikuar me të djathtën në **$(platform)**, dhe duke zgjedhur **Ndrysho objektin**.", + "th": "เราได้สร้างกล่อง 3D **$(platform)** ไว้ให้คุณแล้ว! มันถูกกำหนดค่าไว้แล้วด้วยเนื้อหาที่แตกต่าง\n\nมาดูกันโดยการคลิกที่เมนู 3 จุด หรือคลิกขวาที่ **$(platform)** และเลือก **แก้ไขวัตถุ**", + "uk": "Ми створили для вас 3D-бокс **$(platform)**! Він вже налаштований з різними текстурами\n\nДавайте перевіримо це, натиснувши на меню з 3 крапками або клацнувши правою кнопкою миші на **$(platform)** і вибравши **Редагувати об'єкт**.", + "zh": "我们为您创建了一个3D Box **$(platform)**!它已经配置了不同的纹理\n\n让我们通过单击3点菜单或右键单击 **$(platform)** 并选择 **编辑对象** 来查看它。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "We've created a 3D Box **$(platform)** for you! It's already configured with different textures\n\nLet's check it out by selecting, then long press on **$(platform)**, then select **Edit object**.", + "fr": "Nous avons créé une boîte 3D **$(platform)** pour vous ! Elle est déjà configurée avec différentes textures\n\nAllons la voir en la sélectionnant, puis en appuyant longuement sur **$(platform)**, puis en sélectionnant **Modifier l'objet**.", + "ar": "لقد قمنا بإنشاء صندوق 3D **$(platform)** لك! إنها مكونة بالفعل بمختلف القوام\n\nلنلقي نظرة عليها عن طريق تحديدها، ثم الضغط المطول على **$(platform)**، ثم اختيار **تحرير الكائن**.", + "de": "Wir haben eine 3D-Box **$(platform)** für Sie erstellt! Sie ist bereits mit verschiedenen Texturen konfiguriert\n\nLassen Sie uns das überprüfen, indem Sie **$(platform)** auswählen, dann lange drücken, und **Objekt bearbeiten** auswählen.", + "es": "¡Hemos creado una caja 3D **$(platform)** para ti! Ya está configurada con diferentes texturas\n\nVamos a verla seleccionándola, luego manteniendo presionado **$(platform)**, y seleccionando **Editar objeto**.", + "fi": "Olemme luoneet sinulle 3D-ruudun **$(platform)**! Se on jo määritetty eri tekstuureilla\n\nTarkistetaan se valitsemalla, sitten pitämällä pitkään painettuna **$(platform)**, ja valitsemalla **Muokkaa objektia**.", + "it": "Abbiamo creato una scatola 3D **$(platform)** per te! È già configurata con diverse texture\n\nDiamo un'occhiata selezionandola, quindi premendo a lungo su **$(platform)**, quindi selezionando **Modifica oggetto**.", + "tr": "Sizin için 3D Kutu **$(platform)** oluşturduk! Zaten farklı dokularla yapılandırılmış\n\nŞimdi seçerek, ardından **$(platform)** üzerinde uzun basarak ve **Nesneyi Düzenle**'yi seçerek inceleyelim.", + "ja": "3Dボックス **$(platform)** を作成しました! すでにさまざまなテクスチャで構成されています\n\n**$(platform)** を選択し、長押しして **オブジェクトを編集** を選択して確認しましょう。", + "ko": "3D 상자 **$(platform)** 를 만들었습니다! 이미 다양한 텍스처로 구성되어 있습니다\n\n**$(platform)**을 선택한 다음 길게 눌러 **객체 편집**을 선택하여 확인해 보겠습니다.", + "pl": "Stworzyliśmy dla ciebie 3D Box **$(platform)**! Jest już skonfigurowany z różnymi teksturami\n\nSprawdźmy to, wybierając, a następnie długie naciśnięcie **$(platform)**, a następnie wybierając **Edytuj obiekt**.", + "pt": "Criamos uma caixa 3D **$(platform)** para você! Já está configurada com diferentes texturas\n\nVamos dar uma olhada selecionando, em seguida, pressionando e segurando **$(platform)**, e selecionando **Editar objeto**.", + "ru": "Мы создали для вас 3D-бокс **$(platform)**! Он уже настроен с различными текстурами\n\nДавайте проверим это, выбрав, затем удерживая **$(platform)**, затем выбрав **Редактировать объект**.", + "sl": "Ustvarili smo 3D polje **$(platform)** za vas! Je že konfiguriran z različnimi teksturami\n\nPreverimo ga tako, da ga izberemo, nato pa dolgo pritisnemo **$(platform)** in izberemo **Uredi predmet**.", + "sq": "Kemi krijuar një kuti 3D **$(platform)** për ju! Është tashmë e konfiguruar me tekstura të ndryshme\n\nLe të e kontrollojmë duke zgjedhur, pastaj duke shtypur dhe mbajtur **$(platform)**, dhe duke zgjedhur **Ndrysho objektin**.", + "th": "เราได้สร้างกล่อง 3D **$(platform)** ไว้ให้คุณแล้ว! มันถูกกำหนดค่าไว้แล้วด้วยเนื้อหาที่แตกต่าง\n\nมาดูกันโดยการเลือก แล้วกดค้างที่ **$(platform)** แล้วเลือก **แก้ไขวัตถุ**", + "uk": "Ми створили для вас 3D-бокс **$(platform)**! Він вже налаштований з різними текстурами\n\nДавайте перевіримо це, вибравши, а потім утримуючи **$(platform)**, а потім вибравши **Редагувати об'єкт**.", + "zh": "我们为您创建了一个3D Box **$(platform)**!它已经配置了不同的纹理\n\n让我们通过选择,然后长按 **$(platform)**,然后选择 **编辑对象** 来查看它。" + } + } + } + }, + { + "elementToHighlightId": "#behaviors-tab", + "nextStepTrigger": { + "presenceOfElement": "#add-behavior-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "You can see that the box has already all faces configured! Now let's make this object a platform by adding a **behavior**.", + "fr": "Vous pouvez voir que la boîte a déjà toutes ses faces de configurées ! Maintenant, faisons de cet objet une plateforme en ajoutant un **comportement**.", + "ar": "يمكنك رؤية أن الصندوق قد تم تكوين جميع الوجوه بالفعل! الآن دعونا نجعل هذا الكائن منصة عن طريق إضافة **سلوك**.", + "de": "Sie können sehen, dass die Box bereits alle Seiten konfiguriert hat! Lassen Sie uns dieses Objekt nun zu einer Plattform machen, indem wir ein **Verhalten** hinzufügen.", + "es": "¡Puedes ver que la caja ya tiene todas las caras configuradas! Ahora hagamos de este objeto una plataforma añadiendo un **comportamiento**.", + "fi": "Voit nähdä, että laatikossa on jo kaikki kasvot määritetty! Tehdään tästä objektista nyt alusta lisäämällä **käyttäytyminen**.", + "it": "Puoi vedere che la scatola ha già tutte le facce configurate! Ora rendiamo questo oggetto una piattaforma aggiungendo un **comportamento**.", + "tr": "Kutunun zaten tüm yüzlerinin yapılandırıldığını görebilirsiniz! Şimdi bu nesneyi bir **davranış** ekleyerek bir platform haline getirelim.", + "ja": "ボックスにはすでにすべての面が構成されていることがわかります! これを **動作** を追加することで、このオブジェクトをプラットフォームにしましょう。", + "ko": "상자에 이미 모든 면이 구성되어 있는 것을 볼 수 있습니다! 이제 **동작**을 추가하여 이 객체를 플랫폼으로 만들어 보겠습니다.", + "pl": "Możesz zobaczyć, że pudełko ma już wszystkie strony skonfigurowane! Teraz zróbmy z tego obiektu platformę, dodając **zachowanie**.", + "pt": "Você pode ver que a caixa já tem todas as faces configuradas! Agora vamos fazer deste objeto uma plataforma adicionando um **comportamento**.", + "ru": "Вы можете видеть, что у коробки уже все грани настроены! Теперь давайте сделаем этот объект платформой, добавив **поведение**.", + "sl": "Vidite, da je škatla že vse strani konfigurirana! Sedaj naredimo ta predmet platformo z dodajanjem **vedenja**.", + "sq": "Mund të shihni se kutia ka tashmë të gjitha faqet e konfiguruara! Tani bëjmë këtë objekt një platformë duke shtuar një **sjellje**.", + "th": "คุณสามารถเห็นว่ากล่องมีทุกด้านถูกกำหนดค่าไว้แล้ว! ตอนนี้เราจะทำให้วัตถุนี้เป็นแพลตฟอร์มโดยการเพิ่ม **พฤติกรรม**", + "uk": "Ви можете побачити, що коробка вже має всі грані налаштовані! Тепер давайте зробимо цей об'єкт платформою, додавши **поведінку**.", + "zh": "您可以看到盒子已经配置了所有的面!现在让我们通过添加 **行为** 来使这个对象成为一个平台。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#add-behavior-button", + "nextStepTrigger": { + "presenceOfElement": "#behavior-item-SmoothCamera--SmoothCamera" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's add a new behavior", + "fr": "Ajoutons un nouveau comportement", + "ar": "هيّا نقوم بإضافة سلوك جديد.", + "de": "Lassen Sie uns ein neues Verhalten hinzufügen", + "es": "Añadamos un nuevo comportamiento", + "fi": "Lisätään uusi käyttäytyminen", + "it": "Aggiungiamo un nuovo comportamento", + "tr": "Yeni bir davranış ekleyelim", + "ja": "新しい動作を追加しましょう", + "ko": "새로운 동작을 추가해 보겠습니다", + "pl": "Dodajmy nowe zachowanie", + "pt": "Vamos adicionar um novo comportamento", + "ru": "Добавим новое поведение", + "sl": "Dodajmo novo vedenje", + "sq": "Shtojmë një sjellje të re", + "th": "มาเพิ่มพฤติกรรมใหม่", + "uk": "Додамо нову поведінку", + "zh": "让我们添加一个新的行为" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#behavior-item-PlatformBehavior--PlatformBehavior", + "nextStepTrigger": { + "presenceOfElement": "#behavior-parameters-Platform" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Platform** behavior.", + "fr": "Sélectionnez le comportement **Plateforme**.", + "ar": "تحديد السلوك **منصة**.", + "de": "Wählen Sie das **Plattform**-Verhalten aus.", + "es": "Selecciona el comportamiento **Plataforma**.", + "fi": "Valitse **Alusta**-käyttäytyminen.", + "it": "Seleziona il comportamento **Piattaforma**.", + "tr": "**Platform** davranışını seçin.", + "ja": "**プラットフォーム**動作を選択します。", + "ko": "**플랫폼** 동작을 선택해 보겠습니다.", + "pl": "Wybierz zachowanie **Platforma**.", + "pt": "Selecione o comportamento **Plataforma**.", + "ru": "Выберите поведение **Платформа**.", + "sl": "Izberite vedenje **Platforma**.", + "sq": "Zgjidh sjelljen **Platformë**.", + "th": "เลือกพฤติกรรม **แพลตฟอร์ม**", + "uk": "Виберіть поведінку **Платформа**.", + "zh": "选择 **平台** 行为。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#object-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "That's it! Now our 3D platform is ready!", + "fr": "C'est tout ! Maintenant notre plateforme 3D est prête !", + "ar": "هذا كل شيء! الآن منصتنا ثلاثية الأبعاد جاهزة!", + "de": "Das ist es! Jetzt ist unsere 3D-Plattform bereit!", + "es": "¡Eso es! ¡Ahora nuestra plataforma 3D está lista!", + "fi": "Siinä se on! Nyt 3D-alustamme on valmis!", + "it": "È tutto! Ora la nostra piattaforma 3D è pronta!", + "tr": "İşte bu kadar! Şimdi 3D platformumuz hazır!", + "ja": "それでおしまいです! これで3Dプラットフォームが完成しました!", + "ko": "그게 다입니다! 이제 3D 플랫폼이 준비되었습니다!", + "pl": "To wszystko! Teraz nasza platforma 3D jest gotowa!", + "pt": "É isso aí! Agora nossa plataforma 3D está pronta!", + "ru": "Вот и все! Теперь наша 3D-платформа готова!", + "sl": "To je to! Zdaj je naša 3D platforma pripravljena!", + "sq": "Kështu është! Tani platforma jonë 3D është gati!", + "th": "เสร็จแล้ว! ตอนนี้แพลตฟอร์ม 3D ของเราพร้อมแล้ว!", + "uk": "Ось і все! Тепер наша 3D-платформа готова!", + "zh": "就是这样!现在我们的3D平台准备好了!" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:platform", + "nextStepTrigger": { + "instanceAddedOnScene": "platform" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag $(platform) from the menu to the canvas.", + "fr": "Faites glisser $(platform) du menu au canvas.", + "ar": "سحب $(platform) من القائمة إلى المشهد.", + "de": "Ziehen Sie $(platform) aus dem Menü auf die Leinwand.", + "es": "Arrastra $(platform) desde el menú al lienzo.", + "fi": "Vedä $(platform) valikosta kankaalle.", + "it": "Trascina $(platform) dal menu alla tela.", + "tr": "$(platform)'yi menüden tuvale sürükleyin.", + "ja": "メニューから $(platform) をキャンバスにドラッグします。", + "ko": "메뉴에서 $(platform)을 캔버스로 끌어다 놓습니다.", + "pl": "Przeciągnij $(platform) z menu na płótno.", + "pt": "Arraste $(platform) do menu para o canvas.", + "ru": "Перетащите $(platform) из меню на холст.", + "sl": "Povlecite $(platform) iz menija na platno.", + "sq": "Tërhiqni $(platform) nga menuja në kanavacë.", + "th": "ลาก $(platform) จากเมนูไปยังแคนวาส", + "uk": "Перетягніть $(platform) з меню на полотно.", + "zh": "从菜单将 $(platform) 拖到画布上。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "**Select** then **drag** $(platform) into the **scene**.", + "fr": "**Sélectionnez** puis **faites glisser** $(platform) du menu au canvas.", + "ar": "**تحديد** ثم **سحب** الـ $(platform) إلى **المشهد**.", + "de": "**Wählen** und **ziehen** Sie $(platform) aus dem Menü auf die **Leinwand**.", + "es": "**Seleccione** y **arrastrar** $(platform) al **escenario**.", + "fi": "**Valitse** ja **vedä** $(platform) kankaalle.", + "it": "**Seleziona** quindi **trascina** $(platform) nella **tela**.", + "tr": "**Seçin** ve ardından **sürükleyin** $(platform) 'u **sahne**ye.", + "ja": "**$(platform)** を選択して **キャンバス** に**ドラッグ**します。", + "ko": "**$(platform)**을 선택한 다음 **캔버스**로 **드래그**하십시오.", + "pl": "**Wybierz** a następnie **przeciągnij** $(platform) na **płótno**.", + "pt": "**Selecione** e **arraste** $(platform) para a **cena**.", + "ru": "**Выберите** и **перетащите** $(platform) в **сцену**.", + "sl": "**Izberite** in **povlecite** $(platform) v **prizorišče**.", + "sq": "**Zgjidhni** pastaj **tërhiqni** $(platform) në **skenë**.", + "th": "**เลือก** แล้ว **ลาก** $(platform) ไปยัง **ฉาก**", + "uk": "**Виберіть** потім **перетягніть** $(platform) в **сцену**.", + "zh": "**选择** 然后 **拖动** $(platform) 到 **场景**。" + } + }, + "placement": "left" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Ich bin fertig", + "es": "He terminado", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Skończyłem", + "pt": "Eu terminei", + "ru": "Я закончил", + "sl": "Končal sem", + "sq": "Përfundoj", + "th": "เสร็จแล้ว", + "uk": "Я закінчив", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "Let's place $(platform) below our character.\n\nYou can resize it by dragging the handles!", + "fr": "Plaçons $(platform) en dessous de notre personnage.\n\nVous pouvez la redimensionner en utilisant les petits carrés !", + "ar": "لنضع $(platform) أسفل شخصيتنا.\n\nيمكنك تغيير حجمها عن طريق سحب الأيادي!", + "de": "Platzieren wir $(platform) unter unserem Charakter.\n\nSie können es vergrößern, indem Sie die Griffe ziehen!", + "es": "Coloquemos $(platform) debajo de nuestro personaje.\n\n¡Puedes redimensionarla arrastrando los tiradores!", + "fi": "Asetetaan $(platform) hahmon alle.\n\nVoit muuttaa sen kokoa vetämällä kahvoja!", + "it": "Mettiamo $(platform) sotto il nostro personaggio.\n\nPuoi ridimensionarla trascinando le maniglie!", + "tr": "$(platform)'yi karakterimizin altına yerleştirelim.\n\nKulpları sürükleyerek boyutunu değiştirebilirsiniz!", + "ja": "$(platform) をキャラクターの下に置きましょう。\n\nハンドルをドラッグしてサイズを変更できます!", + "ko": "$(platform)을 캐릭터 아래에 놓아 보겠습니다.\n\n손잡이를 끌어서 크기를 조절할 수 있습니다!", + "pl": "Umieśćmy $(platform) poniżej naszej postaci.\n\nMożesz zmienić jego rozmiar, przeciągając za uchwyty!", + "pt": "Vamos colocar $(platform) abaixo do nosso personagem.\n\nVocê pode redimensioná-la arrastando as alças!", + "ru": "Давайте поместим $(platform) под нашего персонажа.\n\nВы можете изменить его размер, перетаскивая за ручки!", + "sl": "Postavimo $(platform) pod naš lik.\n\nVelikost lahko spremenite tako, da povlečete ročaje!", + "sq": "Le të vendosim $(platform) poshtë personazhit tonë.\n\nMund ta rregulloni madhësinë duke e tërhequr me dorë!", + "th": "มาวาง $(platform) ด้านล่างตัวละครของเรา\n\nคุณสามารถปรับขนาดได้โดยลากจับ!", + "uk": "Давайте розмістимо $(platform) під нашим персонажем.\n\nВи можете змінити його розмір, перетягуючи за ручки!", + "zh": "让我们把 $(platform) 放在我们的角色下面。\n\n您可以通过拖动手柄来调整它的大小!" + } + }, + "image": { + "dataUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARQAAACuCAYAAAD3VvLeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAzVSURBVHgB7d1dbxzVGcDx5+yuI6Cq6goJxA1MxU3LTRMcW9Cbrj9Bwz0U565qiWM+gTefACsJiDsvpVUvQz+B3aug2I6NhNTeZYXaJvQGtxKQ2jtzmLPeiRx7d3Zeztmdl/9PsiAva8Vr+++ZnfOcEQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmTgmc2n9jzdO+v/n/5vHVNz//uCdwZr+9Nq+/9e/0xX9/aeejA8HUNQTODGISBFtapH0hmNu6+8bvPIETg5h8d/JcN6W5dW/x9xcFie0trXb2Lq92JCeOUBx5EhOtvSe/qaR31Dhe5kjFricx0fp0RA598Zc5UpnMxES0Xh/8QqsbC7s3O5IRQXFgZEwiRMWqMTGJEJUJnopJJEdUCIplsTGJEBUrJsQkQlTGGBmTSMaoZA2KFqCaavFDNjYmkQxRyROUXvi2LRh49dnnvdeee6EtKX353aPtB99/0xMk9vyF5+Z/9eNXrkhKE57rdvjmSQ2CkigmkZRRyROUbvh2VZDsNGccTn9SSXiaM07c6c9m+LYiFQ9KqphEUkSFy8Y55YqJocXjknIyOWNizNf5knKmmBhKrye9pExQcsgdkwhRmchCTCK1jErmmEQSRoWgZGQtJhGiMpbFmERqFZXcMYkkiApBycB6TCJE5RwHMYnUIirWYhKZEBWCkkHg+9etxyRiotKf+0AwEPzPv+IgJpH5hm5sSkVZj0kkJioEJYOFnVvvK1GfiAPh+z1o9JtcPRtauH+rG34Bd8SN3nG//5ZUkDmKDmNyXZzR1/cvrs2f/d2ZB+U/f/ZKecj5+s7NFdtRMTFRx43lSwcbh4InFu7dvuEgKr2j4/By/UE1L9df+nyjZy6Rh/9r/2tJh5ff+/7Ir9OZByUI5IOHm15bSshmVIhJPMtRqXRMIma9jfWoDGOydDB6lKEYpzwtfeefNT5SISbJWIpKLWISsRqVCTExChEUFb441gr0nYd/8TwpoTxRISbp5IxKrWISsRKVBDExivSirKf6eqtOUSEm2QyiIrIh6dQyJpFcUUkYE6NoV3kGUXmw6c1LyQxeVVfy6zSP0aK947kjT5CKea6VUmmHA725C81Un5+qORWVVJLGxGiJQ+YKThDo2DUVSvTFM3sheM+29Fb430tSEjkWukWLq9ivI6E8iwqVbnR3l/4gl+996OSSfxm0pLWmU+4+0pxrmsvPiZYyOD1C8QMxRxrtuLfwQxt1NHLx6z+9XIoFRxZWzdZ6YC0NGyuUh1F5V2ro/uJqN4xJlo99ZW/xWqLvx8IubNNarTz85OWOFJjFJfhEZQKb4w51jEqOmEQSRaXQK2VVQ60XNSoO5nmIyhguZqfqFBULMYlMjErhl943Gup60V6kdTYcSFTOcfhc1yIqFmMSiY1K4YMSvpq/9rOrvUJdVg36g4E1T9wwUanlOf4ojp9raejmmlSUg5hExkal2Kc8ojsvvN0r3CvyC7u3NhwOrHXN8KFgwOVzHa0DkgoaDu65vEzevnvx/DYbhQ2KicmL73x1QwrK0cCaiQmTxme4eK6rvqjQfFzm4ws/zp7YN3aRoNNNqs2q10Zf3o1/R3pFTnYbP/WPKnZMTttbem9dtOpIfsRkAlvP9ZiYVHKT6vBIxdNz5hat1k4bY1ccz3zX+0efelvhu2tHv1ZKd198+6tSfWNZ+EInJgnlfa5jjkwqu+u9xahMHF8o2inPQdliYuQ8JCcmKeR5rus6OxV+vD0Lpz+JZqGKExQtve/7qrQvkA0H1rppHhP+KNwmJullHA48rPMgZs6oJB6sLEZQwphoXy0X7fJwGsO1I6kG1sLzxnZdl4HnkXE4cD5oBZW9RJyEiUpf0m956Yv/VtIp7ZkHRamTmLx0tdeTkjIxMQvSZPRcUqw6z5Zkke8ujclvWFVF5g4CLdVKPSPXktbmqP1jR5l5UC4cy/t1jUmEqCRjZdVsTaOS53Yk2uwIEL6omyQqMw/KT0t+mpM3JhGiEs/qEvyaRcXGvY2SRoXbaGRkMyYRojKak3memkTF5o3SkkSFoGTgIiYRovI0l8OBVY+Ki7suTorKTIJidrj/16felbLuH9vUzbY4iElEBcoTDAS+33Y5HBhG5RWpIIe3cI2NylSDYgLy6NNXHrQCvd8UfUf19YOib6I0itPhQK07C7u3SzF2MA0LO7e6YmFF9hjVXVR4GP7A0+5+6IVRmX8sj2cbFLMBtZyd22mo9X//0Svd+gAnw4HEZCRHUan0CmVLq2PHGbvQbWpB+To8xZEzMXnyj1D6N1JCVqNCTGJZjkotxh0cRSV21ezUgqJExp+r6tGhKQMrUSEmiViKSq1mpyxHpTjDgb7IF2P/UElPSixXVIhJKjmjUstBzEoOB770Tm87LMf2qD/TfVX6T3KmqBCTTDJGpdZT3ZUcDtQtuarO3ApRad0t89L701JFhZjkkjIqbBEhJ1HxdZD6eQi0vlq44UBzydhc5Tl7Yy+tin//nTQSRYWYWJEwKsRkyCwSbDYaqYcDGw21efeN8/vHjvy7MiWjLhk/+TNz/51Nry0VERsVYmLVhKgQk6FcK47DiyYXgrmtJFGZSlDMyliR+Cs5qqWvS4WMjAoxcWJMVIjJkJXxhYRRmUpQmr5MXv6rxfoS4Vl7KirExKkzUSEmQ1ZnoRJEheFAx0xUwhei22WOSVnuZGiiEr6AuExMTjgZrJwQFYIyBa/v3PqblNTe0mqnKc39skxAL+7e3ha4ndKOiQpBwVgmJuGp2rr5f7ZVKJnHchh+4zvbvExpdfjM42fOvX+CgpFOxyRCVMrj1J0DD8SyuNuREBScMyomEaJSHi6iMuneRoUJilLuDs+QXFxMIkSlPGxGJcmN0qYSlJd+2+tqrcyy+3MflFmKH56PdYO+Sn2/ENiVJCYRolIeNqKS9K6LSrLJdW/jB5ve/Pyc+snhsf5vmW/uVSVpYnKaVsHK5XsffiLlV9l7G0fMlo3DexynWgaQ5hauMwkKiiVrTCIViUrlg2IMN1jfT/MYX/xLSzsfJTq64UXZmssbE4PTn3Iwa1NaqnVHUmqq5p3CDQeieGzEJEJUiq1Sw4EoHpsxiRCVYqrccCCKxUVMIkSlWBgOxBQEWlB5DAdiKpzcU2ioQpeRS20aw4Ezv3MgisNFVIhJcVz6fKMXfuO7m3LXss0sD55iMyrEpHhe37m5okS5+JyM3cCKoNScjagQk+JyEJXY3fAICnJFhZgUn8WoTNxak6BgYLhV5Xaax4Tn0Z8Rk3KwEJVE+/QSFAyYtSnhteR2mseIkit7l1c7glLIEZXEm34TFORb6Kb0OlEpD9VsdETS7T101DxOvME6Qak5K6tmiUopRGtT5MzdOydJOsdjEJQas7oEn6gUGsOBcMrJPA9RKSSGA+GUy+HAk6hcWxMUAsOBcE/rnrii5dDv+9uCmZvFcKC1LSB/8fNfMsFaQH//xxcjP8d7i9dW5GTbQ3tOYrK8dHB+u0C+Puwa93mNDPaPvRDsOxkONJT0GkfNS2fneThCqakzNxfPLyYmmD7zja4l6Iorge4yHIinWIsKMSkkZ9tUaN1Z2L09cm0KQam53FEhJoVmPSoxMTEICrJHhZiUgrWoTIiJQVAwYKKSejhQyWfEpBxyRyVBTAyCgoH7i6vd1MOBIissZCuPzFFJGBODoGAYE51tp3pWx5aKr4O/SjqHvkr+GIJSc7liEiEqpTC8DelWyofNm8eYxyb5ywSlxqzEJEJUCu1UTFJNGg8ljgo3S68pqzE5TasbC7s3O1I+lb1Zes6YnHboS3hVL+bG6Ryh1NDe4uqGk5gYDAcWisWYGBOPVAhKDfnS70rKXbtS6B31jz8TzJzlmERio0JQasgcsppDV7Efld7R8fHymwcf9wQzZYYDHcQkMnjfdy+enzgmKDXlICrEpEAGg3tKb4grWm+M+lwTlBqzGBViUkAMB2LqLESFmBQYw4GYuhxRISYlwHAgpi5DVIhJiTAciKlLERViUkLTGA7Ms1K2J2nH3VEKrz7zvPfaj15oj/vzL799tP3g8Tc9qZZ2+OZJBVfKnrW39N66aNVJ9JdTxMTIExSgiiofFCNRVFLGxKjFk4dszqy05DSnYmKjkiEmBq+hYKzoNRUl6oCYVM/Y11QyxsTgCAWouaeOVHLEBAAGTFT2Lr/n5va0AAAAAAAAAAAAAAAAQEpqb/Eag36ohYWdW6wMd4xZHgDWEBQA1hAUANYQFADWEBQA1hAUANYQFADWEBQA1hAUANYQFADWEBQA1hAUANYQFADWEBQA1hAUANYQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAlfwAZVGNx1EZJcQAAAAASUVORK5CYII=" + } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessage": { + "messageByLocale": { + "en": "Great job! Now use your arrows and space bar to press the purple button.", + "fr": "Super travail ! Utilisez maintenant les flèches et la barre d'espace pour appuyer sur le bouton violet.", + "ar": "عمل رائع! الآن استخدم الأسهم وشريط المسافة للضغط على الزر الأرجواني.", + "de": "Tolle Arbeit! Verwende nun die Pfeiltasten und die Leertaste, um den violetten Knopf zu drücken.", + "es": "¡Buen trabajo! Ahora usa las flechas y la barra espaciadora para presionar el botón morado.", + "fi": "Hienoa työtä! Käytä nuolia ja välilyöntiä painaaksesi violetin värinen painiketta.", + "it": "Ottimo lavoro! Ora usa le frecce e la barra spaziatrice per premere il pulsante viola.", + "tr": "Harika iş çıkardın! Şimdi mor düğmeye basmak için ok tuşlarını ve boşluk tuşunu kullan.", + "ja": "よくできました!次は矢印キーとスペースバーで紫色のボタンを押しましょう。", + "ko": "잘했어요! 이제 화살표 키와 스페이스바를 사용하여 보라색 버튼을 누르세요.", + "pl": "Świetna robota! Teraz użyj strzałek i spacji, aby nacisnąć fioletowy przycisk.", + "pt": "Ótimo trabalho! Agora use as setas e a barra de espaço para pressionar o botão roxo.", + "ru": "Отличная работа! Теперь используйте стрелки и пробел, чтобы нажать фиолетовую кнопку.", + "sl": "Odlično opravljeno! Sedaj uporabi puščice in preslednico, da pritisneš vijolični gumb.", + "sq": "Pune e shkëlqyer! Tani përdor shigjetat dhe tastin e hapësirës për të shtypur butonin vjollcë.", + "th": "เยี่ยมมาก! ตอนนี้ใช้ปุ่มลูกศรและแป้นเว้นวรรคเพื่อกดปุ่มสีม่วง", + "uk": "Чудова робота! Тепер використайте стрілки та пробіл, щоб натиснути фіолетову кнопку.", + "zh": "干得好!现在使用箭头键和空格键按下紫色按钮。" + } + }, + "inGameTouchMessage": { + "messageByLocale": { + "en": "Great job! Now use the joystick and A button to press the purple button.", + "fr": "Super travail ! Utilisez maintenant le joystick et le bouton A pour appuyer sur le bouton violet.", + "ar": "عمل رائع! الآن استخدم عصا التحكم والزر A للضغط على الزر الأرجواني.", + "de": "Tolle Arbeit! Verwende nun den Joystick und die A-Taste, um den violetten Knopf zu drücken.", + "es": "¡Buen trabajo! Ahora usa el joystick y el botón A para presionar el botón morado.", + "fi": "Hienoa työtä! Käytä nyt joystickiä ja A-näppäintä painaaksesi violetin värinen painiketta.", + "it": "Ottimo lavoro! Ora usa il joystick e il pulsante A per premere il pulsante viola.", + "tr": "Harika iş çıkardın! Şimdi mor düğmeye basmak için joystick ve A düğmesini kullan.", + "ja": "よくできました!次はジョイスティックとAボタンで紫色のボタンを押しましょう。", + "ko": "잘했어요! 이제 조이스틱과 A 버튼을 사용하여 보라색 버튼을 누르세요.", + "pl": "Świetna robota! Teraz użyj joysticka i przycisku A, aby nacisnąć fioletowy przycisk.", + "pt": "Ótimo trabalho! Agora use o joystick e o botão A para pressionar o botão roxo.", + "ru": "Отличная работа! Теперь используйте джойстик и кнопку A, чтобы нажать фиолетовую кнопку.", + "sl": "Odlično opravljeno! Sedaj uporabi joystick in gumb A, da pritisneš vijolični gumb.", + "sq": "Pune e shkëlqyer! Tani përdor joystick-un dhe butonin A për të shtypur butonin vjollcë.", + "th": "เยี่ยมมาก! ตอนนี้ใช้จอยสติ๊กและปุ่ม A เพื่อกดปุ่มสีม่วง", + "uk": "Чудова робота! Тепер використайте джойстик і кнопку A, щоб натиснути фіолетову кнопку.", + "zh": "干得好!现在使用摇杆和A键按下紫色按钮。" + } + }, + "inGameMessagePosition": "top-right" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + "fr": "Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.", + "ar": "حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.", + "de": "Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.", + "fi": "Olemme valmiit! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.", + "it": "abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.", + "tr": "Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.", + "ja": "完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。", + "ko": "우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.", + "pl": "Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.", + "pt": "Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.", + "ru": "Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.", + "sl": "Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。" + } + }, + "placement": "bottom" + } + } + ] +} \ No newline at end of file diff --git a/tutorials/in-app/plinkoMultiplier.json b/tutorials/in-app/plinkoMultiplier.json new file mode 100644 index 0000000..ab0472d --- /dev/null +++ b/tutorials/in-app/plinkoMultiplier.json @@ -0,0 +1,1772 @@ +{ + "id": "plinkoMultiplier", + "titleByLocale": { + "en": "Let's improve a scoring system", + "fr": "Améliorons un système de score", + "ar": "لنحسن نظام تسجيل النقاط", + "de": "Verbessern wir ein Punktesystem", + "es": "Mejoremos un sistema de puntuación", + "fi": "Parannetaan pisteytysjärjestelmää", + "it": "Miglioriamo un sistema di punteggio", + "tr": "Bir puanlama sistemi geliştirelim", + "ja": "スコアリングシステムを改善しましょう", + "ko": "점수 시스템을 개선합시다", + "pl": "Ulepszmy system punktacji", + "pt": "Vamos melhorar um sistema de pontuação", + "th": "มาปรับปรุงระบบการให้คะแนนกันเถอะ", + "ru": "Улучшите систему подсчета очков", + "sl": "Izboljšajmo sistem točkovanja", + "sq": "Le të përmirësojmë një sistem të pikëzimit", + "uk": "Покращимо систему підрахунку очок", + "zh": "改进记分系统" + }, + "bulletPointsByLocale": [ + { + "en": "Make objects disappear or appear when colliding", + "fr": "Faire disparaître ou apparaître des objets lors d'une collision", + "ar": "جعل الكائنات تختفي أو تظهر عند الاصطدام", + "de": "Objekte beim Zusammenstoß verschwinden oder erscheinen lassen", + "es": "Hacer que los objetos desaparezcan o aparezcan al chocar", + "fi": "Tee esineiden katoavan tai ilmestyvän törmäyksen yhteydessä", + "it": "Far scomparire o apparire oggetti in caso di collisione", + "tr": "Çarpışma durumunda nesnelerin kaybolmasını veya görünmesini sağlayın", + "ja": "衝突時にオブジェクトを消去または表示する", + "ko": "충돌 시 객체를 사라지게 하거나 나타나게 하기", + "pl": "Spraw, aby obiekty znikały lub pojawiały się przy kolizji", + "pt": "Fazer objetos desaparecerem ou aparecerem ao colidir", + "th": "ทำให้วัตถุหายไปหรือปรากฏขึ้นเมื่อชนกัน", + "ru": "Заставлять объекты исчезать или появляться при столкновении", + "sl": "Naj predmeti izginejo ali se pojavijo ob trku", + "sq": "Bëj që objektet të zhduken ose të shfaqen kur përplasen", + "uk": "Змушуйте об'єкти зникати або з'являтися при зіткненні", + "zh": "在碰撞时使对象消失或出现" + }, + { + "en": "Create, modify and access a scene variable", + "fr": "Créer, modifier et accéder à une variable de scène", + "ar": "إنشاء وتعديل والوصول إلى متغير المشهد", + "de": "Erstellen, ändern und auf eine Szenenvariable zugreifen", + "es": "Crear, modificar y acceder a una variable de escena", + "fi": "Luo, muokkaa ja käytä kohtauksen muuttujaa", + "it": "Creare, modificare e accedere a una variabile di scena", + "tr": "Bir sahne değişkeni oluşturun, değiştirin ve erişin", + "ja": "シーン変数を作成、変更、およびアクセスする", + "ko": "씬 변수를 생성, 수정 및 액세스", + "pl": "Tworzenie, modyfikowanie i dostęp do zmiennej sceny", + "pt": "Criar, modificar e acessar uma variável de cena", + "th": "สร้าง แก้ไข และเข้าถึงตัวแปรฉาก", + "ru": "Создание, изменение и доступ к переменной сцены", + "sl": "Ustvarite, spremenite in dostopajte do spremenljivke scene", + "sq": "Krijoni, modifikoni dhe aksesoni një variabël të skenës", + "uk": "Створюйте, змінюйте та отримуйте доступ до змінної сцени", + "zh": "创建、修改和访问场景变量" + }, + { + "en": "Update a score accordingly", + "fr": "Mettre à jour un score en conséquence", + "ar": "تحديث النتيجة وفقًا لذلك", + "de": "Passen Sie den Punktestand entsprechend an", + "es": "Actualizar una puntuación en consecuencia", + "fi": "Päivitä pisteet sen mukaisesti", + "it": "Aggiorna di conseguenza un punteggio", + "tr": "Puanı buna göre güncelle", + "ja": "スコアを適宜更新する", + "ko": "점수를 적절히 업데이트", + "pl": "Aktualizuj wynik odpowiednio", + "pt": "Atualizar uma pontuação de acordo", + "th": "อัปเดตคะแนนตามนั้น", + "ru": "Обновите счет соответственно", + "sl": "Posodobite rezultat ustrezno", + "sq": "Përditësoni një rezultat në përputhje me rrethanat", + "uk": "Відповідно оновлюйте оцінку", + "zh": "相应地更新分数" + } + ], + "editorSwitches": { + "Login": { + "editor": "Scene", + "scene": "gameScene" + }, + "CreateLeaderboard": { + "editor": "Scene", + "scene": "gameScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "gameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/plinkoMultiplier/game.json", + "initialProjectData": { + "gameScene": "GameScene", + "multiplier": "Multiplier", + "scoreMultiplier": "ScoreMultiplier", + "ball": "Ball", + "particles": "PegStar_Particle" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Ju keni perfunduar kete mesim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, voici ce que vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du geler:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derste şunları öğrendiniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다.", + "pl": "Dobrze, w tym samouczku nauczyłeś się, jak:", + "pt": "Bom trabalho, neste tutorial você aprendeu como:", + "ru": "Хорошо, в этом уроке вы узнали, как:", + "sl": "Bravo, v tem vadnem programu ste se naučili, kako:", + "sq": "Bravo, ne kete mesim ju keni mesuar si te:", + "th": "ทำได้ดีเยี่ยม, ในบทเรียนนี้คุณได้เรียนรู้วิธี:", + "uk": "Добре, в цьому уроці ви дізналися, як:", + "zh": "做得好,在本教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to create a scene variable\n\n- How to update a scene variable\n\n- How to use a scene variable in an expression", + "fr": "- Comment créer une variable de scène\n\n- Comment mettre à jour une variable de scène\n\n- Comment utiliser une variable de scène dans une expression", + "ar": "- إنشاء متغير مشهد\n\n- تحديث متغير المشهد\n\n- استخدام متغير المشهد كتعبير", + "de": "- Eine Szenenvariable erstellen\n\n- Eine Szenenvariable aktualisieren\n\n- Eine Szenenvariable in einem Ausdruck verwenden", + "es": "- Cómo crear una variable de escena\n\n- Cómo actualizar una variable de escena\n\n- Cómo usar una variable de escena en una expresión", + "fi": "- Kuinka luoda kohtauksen muuttuja\n\n- Kuinka päivittää kohtauksen muuttuja\n\n- Kuinka käyttää kohtauksen muuttujaa lausekkeessa", + "it": "- Come creare una variabile di scena\n\n- Come aggiornare una variabile di scena\n\n- Come utilizzare una variabile di scena in un'espressione", + "tr": "- Bir sahne değişkeni oluşturma\n\n- Bir sahne değişkenini güncelleme\n\n- Bir sahne değişkenini bir ifadede kullanma", + "ja": "- シーン変数の作成方法\n\n- シーン変数の更新方法\n\n- シーン変数を式で使用する方法", + "ko": "- 씬 변수를 만드는 방법\n\n- 씬 변수를 업데이트하는 방법\n\n- 씬 변수를 표현식에서 사용하는 방법", + "pl": "- Jak utworzyć zmienną sceny\n\n- Jak zaktualizować zmienną sceny\n\n- Jak użyć zmiennej sceny w wyrażeniu", + "pt": "- Como criar uma variável de cena\n\n- Como atualizar uma variável de cena\n\n- Como usar uma variável de cena em uma expressão", + "ru": "- Как создать переменную сцены\n\n- Как обновить переменную сцены\n\n- Как использовать переменную сцены в выражении", + "sl": "- Kako ustvariti spremenljivko scene\n\n- Kako posodobiti spremenljivko scene\n\n- Kako uporabiti spremenljivko scene v izrazu", + "sq": "- Si të krijoni një variabël skene\n\n- Si të përditësoni një variabël skene\n\n- Si të përdorni një variabël skene në një shprehje", + "th": "- วิธีสร้างตัวแปรของ scene\n\n- วิธีอัพเดทตัวแปรของ scene\n\n- วิธีใช้ตัวแปรของ scene ใน expression", + "uk": "- Як створити змінну сцени\n\n- Як оновити змінну сцени\n\n- Як використовувати змінну сцени в виразі", + "zh": "- 如何创建场景变量\n\n- 如何更新场景变量\n\n- 如何在表达式中使用场景变量" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des choses à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir agregando cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaisemista!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、公開することができます!", + "ko": "이 게임에 더 많은 것을 추가하거나 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Ju mund te vazhdoni te shtoni gjera te kete loje, ose publikoje!", + "th": "คุณสามารถพัฒนาเกมนี้ต่อไปหรือจะเผยแพร่เลยก็ได้!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续为这个游戏添加东西,或者发布它!" + } + } + ] + }, + "flow": [ + { + "id": "Login", + "nextStepTrigger": { + "absenceOfElement": "#login-now" + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "This game uses a leaderboard! let's **login** so we can set it up automatically!\n\nYou can skip this step if you don't want to use a leaderboard, by closing the leaderboard dialog.", + "fr": "Ce jeu utilise un classement ! Connectons-nous **pour que nous puissions le configurer automatiquement !**\n\nVous pouvez ignorer cette étape si vous ne souhaitez pas utiliser de classement, en fermant la boîte de dialogue du classement.", + "ar": "هذه اللعبة تستخدم لوحة صدارة! هيّا نقوم ب**تسجيل الدخول** حتى نتمكن من إعداده تلقائيًا!\n\nيمكنك تخطي هذه الخطوة إذا لم يكن لديك الرغبة في استخدام لوحة صدارة، من خلال إغلاق نافذة لوحات الصدارة.", + "de": "Dieses Spiel verwendet eine Bestenliste! Lass uns **einloggen**, damit wir sie automatisch einrichten können!\n\nDu kannst diesen Schritt überspringen, wenn du keine Bestenliste verwenden möchtest, indem du das Bestenlisten-Dialogfeld schließt.", + "es": "¡Este juego usa una tabla de clasificación! ¡**Inicia sesión** para que podamos configurarlo automáticamente!\n\nPuedes omitir este paso si no quieres usar una tabla de clasificación, cerrando el cuadro de diálogo de la tabla de clasificación.", + "fi": "Tämä peli käyttää tulostaulua! Kirjaudu **sisään**, jotta voimme määrittää sen automaattisesti!\n\nVoit ohittaa tämän vaiheen, jos et halua käyttää tulostaulua, sulkemalla tulostaulun valintaikkunan.", + "it": "Questo gioco utilizza una classifica! Effettua il **login** in modo da poterla configurare automaticamente!\n\nPuoi saltare questo passaggio se non vuoi utilizzare una classifica, chiudendo la finestra di dialogo della classifica.", + "tr": "Bu oyun bir liderlik tablosu kullanıyor! **Giriş yapalım** böylece otomatik olarak ayarlayabiliriz!\n\nLiderlik tablosu kullanmak istemiyorsanız, liderlik tablosu iletişim kutusunu kapatıp bu adımı atlayabilirsiniz.", + "ja": "このゲームはリーダーボードを使用しています!**ログイン**して自動的に設定できるようにしましょう!\n\nリーダーボードを使用したくない場合は、リーダーボードダイアログを閉じることでこのステップをスキップできます。", + "ko": "이 게임은 리더보드를 사용합니다! **로그인**하여 자동으로 설정할 수 있도록 합시다!\n\n리더보드를 사용하고 싶지 않다면 리더보드 대화 상자를 닫아 이 단계를 건너뛸 수 있습니다.", + "pl": "Ta gra wykorzystuje tablicę wyników! Zaloguj się, abyśmy mogli ją skonfigurować automatycznie!\n\nMożesz pominąć ten krok, jeśli nie chcesz korzystać z tablicy wyników, zamykając okno dialogowe tablicy wyników.", + "pt": "Este jogo usa uma tabela de classificação! Vamos **entrar** para que possamos configurá-lo automaticamente!\n\nVocê pode pular esta etapa se não quiser usar uma tabela de classificação, fechando a caixa de diálogo da tabela de classificação.", + "ru": "Эта игра использует таблицу лидеров! Давайте **войдем**, чтобы мы могли настроить ее автоматически!\n\nВы можете пропустить этот шаг, если не хотите использовать таблицу лидеров, закрыв окно диалога таблицы лидеров.", + "sl": "Ta igra uporablja lestvico! Prijavimo se, da jo lahko nastavimo samodejno!\n\nČe ne želite uporabljati lestvice, lahko ta korak preskočite tako, da zaprete pogovorno okno lestvice.", + "sq": "Kjo lojë përdor një tabelë të klasifikimit! Le të **hyni** që ta mund të konfigurojmë atë automatikisht!\n\nJu mund të kaloni këtë hap nëse nuk doni të përdorni një tabelë klasifikimi, duke mbyllur dritaren e dialogut të tabelës së klasifikimit.", + "th": "เกมนี้ใช้ leaderboard! ให้เรา **เข้าสู่ระบบ** เพื่อที่จะตั้งค่า leaderboard ให้เราอัตโนมัติ!\n\nคุณสามารถข้ามขั้นตอนนี้ได้หากคุณไม่ต้องการใช้ leaderboard โดยการปิดกล่องโต้ตอบ leaderboard", + "uk": "Ця гра використовує таблицю лідерів! Давайте **увійдемо**, щоб ми могли налаштувати її автоматично!\n\nВи можете пропустити цей крок, якщо не хочете використовувати таблицю лідерів, закривши вікно діалогу таблиці лідерів.", + "zh": "这个游戏使用了排行榜!让我们**登录**,这样我们就可以自动设置它!\n\n如果您不想使用排行榜,可以通过关闭排行榜对话框来跳过此步骤。" + } + }, + "placement": "top" + }, + "disableBlockingLayer": true + }, + { + "id": "CreateLeaderboard", + "elementToHighlightId": "#create-and-replace-new-leaderboard", + "nextStepTrigger": { + "absenceOfElement": "#create-and-replace-new-leaderboard" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "First, let's **create a leaderboard** as this game will need it. You're lucky, everything will be automatically set up for you!", + "fr": "Tout d'abord, créons un **classement** car ce jeu en aura besoin. Vous avez de la chance, tout sera automatiquement configuré pour vous !", + "ar": "أولًا، هيّا نقوم ب**إنشاء لوحة صدارة** حيث ستحتاج اللعبة إليها. لحسن حظك، كل شيء سيتم إعداده تلقائيًا لأجلك!", + "de": "Lass uns zuerst eine **Bestenliste erstellen**, da dieses Spiel sie benötigen wird. Du hast Glück, alles wird automatisch für dich eingerichtet!", + "es": "Primero, **creemos una tabla de clasificación** porque este juego la necesitará. ¡Tienes suerte, todo se configurará automáticamente para ti!", + "fi": "Ensinnäkin, luodaan **tulostaulu**, koska tämä peli tarvitsee sen. Olet onnekas, kaikki asetetaan automaattisesti sinulle!", + "it": "Prima di tutto, creiamo una **classifica** perché questo gioco ne avrà bisogno. Hai fortuna, tutto sarà configurato automaticamente per te!", + "tr": "Öncelikle, bu oyunun ihtiyacı olacağı için bir **liderlik tablosu oluşturalım**. Şanslısınız, her şey sizin için otomatik olarak ayarlanacak!", + "ja": "まず、このゲームには必要になるため、**リーダーボードを作成**しましょう。あなたは幸運です、すべてが自動的に設定されます!", + "ko": "먼저, 이 게임은 리더보드가 필요하므로 **리더보드를 만들어** 봅시다. 당신은 운이 좋습니다, 모든 것이 자동으로 설정될 것입니다!", + "pl": "Najpierw **utwórzmy tablicę wyników**, ponieważ ta gra jej potrzebuje. Masz szczęście, wszystko zostanie dla ciebie automatycznie skonfigurowane!", + "pt": "Primeiro, vamos **criar uma tabela de classificação** porque este jogo precisará dela. Você tem sorte, tudo será configurado automaticamente para você!", + "ru": "Сначала давайте **создадим таблицу лидеров**, так как эта игра ее понадобится. Вам повезло, все будет настроено автоматически!", + "sl": "Najprej **ustvarimo lestvico**, saj jo bo ta igra potrebovala. Imate srečo, vse bo samodejno nastavljeno za vas!", + "sq": "Fillimisht, le të **krijojmë një tabelë klasifikimi** sepse kjo lojë do ta ketë nevojë. Ju keni fat, gjithçka do të jetë e konfiguruar automatikisht për ju!", + "th": "ขั้นแรก **สร้าง leaderboard** ให้เกมนี้เพราะเป็นเกมที่จำเป็นต้องมี เราจะติดตั้งให้คุณอัตโนมัติทั้งหมดเอง คุณโชคดีจริง!", + "uk": "Спочатку давайте **створимо таблицю лідерів**, оскільки ця гра її потребуватиме. Вам пощастило, все буде налаштовано автоматично!", + "zh": "首先,让我们**创建一个排行榜**,因为这个游戏需要它。你很幸运,一切都将自动为你设置!" + } + }, + "placement": "top" + }, + "disableBlockingLayer": true + }, + { + "elementToHighlightId": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-drawer-close", + "nextStepTrigger": { + "absenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-drawer-close" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's close the menu.", + "fr": "Fermons le menu.", + "ar": "هيّا نغلق القائمة.", + "de": "Lass uns das Menü schließen.", + "es": "Cerramos el menú.", + "fi": "Suljetaan valikko.", + "it": "Chiudiamo il menu.", + "tr": "Menüyü kapatalım.", + "ja": "メニューを閉じましょう。", + "ko": "메뉴를 닫아봅시다.", + "pl": "Zamknijmy menu.", + "pt": "Vamos fechar o menu.", + "ru": "Давайте закроем меню.", + "sl": "Zaprimo meni.", + "sq": "Le të mbyllim menunë.", + "th": "ปิดเมนู", + "uk": "Давайте закриємо меню.", + "zh": "让我们关闭菜单。" + } + } + }, + "skippable": true + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Let's go!", + "fr": "C'est parti !", + "ar": "لنبدأ!", + "de": "Los geht's!", + "es": "¡Vamos!", + "fi": "Lähdetään!", + "it": "Andiamo!", + "tr": "Hadi başlayalım!", + "ja": "さあ、始めましょう!", + "ko": "출발!", + "pl": "Zaczynamy!", + "pt": "Vamos lá!", + "ru": "Поехали!", + "sl": "Gremo!", + "sq": "Hajde shkojme!", + "th": "ไปกันเลย!", + "uk": "Почнемо!", + "zh": "让我们开始吧!" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "This game is called Plinko! Click on the **Preview** button to test it out and gather points depending on how many pegs you hit.", + "fr": "Ce jeu s'appelle Plinko! Cliquez sur le bouton **Aperçu** pour le tester et accumuler des points en fonction du nombre de piquets que vous frappez.", + "ar": "هذه اللعبة تسمى Plinko! الضغط على الزر **معاينة** لإختبارها وجمع النقاط حسب عدد العارضات التي تضرب.", + "de": "Dieses Spiel heißt Plinko! Klicken Sie auf die **Vorschau**, um es zu testen und Punkte zu sammeln, je nachdem, wie viele Stifte Sie treffen.", + "es": "¡Este juego se llama Plinko!Haz clic en el botón **Vista previa** para probarlo y gana puntos dependiendo de cuántos clavos golpees.", + "fi": "Tämä peli on nimeltään Plinko! Klikkaa **Esikatselu**-painiketta testataksesi sitä ja kerätäksesi pisteitä sen mukaan, kuinka monta nastaa osut.", + "it": "Questo gioco si chiama Plinko! Clicca sul pulsante **Anteprima** per provarlo e raccogliere punti in base a quanti pioli colpisci.", + "tr": "Bu oyun Plinko adını taşıyor! Test etmek ve kaç tane pimi vurduğunuza bağlı olarak puan toplamak için **Önizleme** düğmesine tıklayın.", + "ja": "このゲームはPlinkoと呼ばれます!**プレビュー**ボタンをクリックしてテストし、ピンを何本当てるかに応じてポイントを集めましょう。", + "ko": "이 게임은 Plinko라고 합니다! **미리보기** 버튼을 클릭하여 테스트하고 몇 개의 핀을 맞추느냐에 따라 점수를 얻으세요.", + "pl": "Ta gra nazywa się Plinko! Kliknij przycisk **Podgląd**, aby ją przetestować i zdobyć punkty w zależności od liczby pali, które trafisz.", + "pt": "Este jogo se chama Plinko! Clique no botão **Visualizar** para testá-lo e ganhe pontos dependendo de quantos pinos você acerta.", + "ru": "Эта игра называется Plinko! Нажмите на кнопку **Предварительный просмотр**, чтобы протестировать ее и набрать очки в зависимости от того, сколько штырей вы попадете.", + "sl": "Ta igra se imenuje Plinko! Kliknite na gumb **Predogled**, da jo preizkusite in zberete točke glede na to, koliko žebljev zadeneš.", + "sq": "Kjo lojë quhet Plinko! Klikoni në butonin **Parashikim** për ta testuar dhe të mblidhni pikë sipas numrit të shkopëve që godisni.", + "th": "เกมนี้มีชื่อว่า Plinko! คุณปล่อยลูกบอลหล่นลงมาในเขาวงกตและทำคะแนนได้เมื่อลูกบอลชนกับเป๊ก กดปุ่ม **ดูตัวอย่าง** เพื่อทดลองเล่นเกม", + "uk": "Ця гра називається Plinko! Натисніть на кнопку **Попередній перегляд**, щоб протестувати її та зібрати бали в залежності від того, скільки штирів ви влучите.", + "zh": "这个游戏叫做Plinko!点击**预览**按钮来测试它,根据你击中的钉子数量来收集积分。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:multiplier", + "nextStepTrigger": { + "instanceAddedOnScene": "multiplier", + "instancesCount": 3 + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag 3 **$(multiplier)** objects to the canvas and place them where they can be hit by the ball.", + "fr": "Faites glisser 3 objets **$(multiplier)** sur le canevas et placez-les là où ils peuvent être touchés par la balle.", + "ar": "سحب 3 كائنات **$(multiplier)** إلى اللوحة وإدراجها في مكان يمكن للكرة ضربها.", + "de": "Ziehe 3 **$(multiplier)**-Objekte auf die Leinwand und platziere sie dort, wo sie von der Kugel getroffen werden können.", + "es": "¡Arrastra 3 objetos **$(multiplier)** al lienzo y colócalos donde puedan ser golpeados por la pelota.", + "fi": "Vedä 3 **$(multiplier)**-objektia kankaalle ja aseta ne paikoilleen, joihin pallo voi osua.", + "it": "Trascina 3 oggetti **$(multiplier)** sul canvas e posizionali dove possono essere colpiti dalla palla.", + "tr": "3 **$(multiplier)** nesnesini tuvale sürükleyin ve topun vurabileceği yerlere yerleştirin.", + "ja": "3つの**$(multiplier)**オブジェクトをキャンバスにドラッグして、ボールが当たる場所に配置します。", + "ko": "3개의 **$(multiplier)** 오브젝트를 캔버스로 끌어다가 공이 맞을 수 있는 곳에 놓습니다.", + "pl": "Przeciągnij 3 obiekty **$(multiplier)** na płótno i umieść je tam, gdzie mogą być trafione przez piłkę.", + "pt": "Arraste 3 objetos **$(multiplier)** para a tela e coloque-os onde possam ser atingidos pela bola.", + "ru": "Перетащите 3 объекта **$(multiplier)** на холст и разместите их там, где их может ударить мяч.", + "sl": "Povlecite 3 objekte **$(multiplier)** na platno in jih postavite tam, kjer jih lahko zadene žoga.", + "sq": "Tërhiqni 3 objekte **$(multiplier)** në kanavas dhe vendosini atje ku mund të goditen nga topi.", + "th": "มาเพิ่ม **$(multiplier)** เพื่อทำให้เกมสนุกขึ้นกันเถอะ! ลาก 3 ชิ้น จากเมนูไปใส่ในแคนวาส และจัดวางให้พวกมันสามารถถูกลูกบอลเก็บไปได้ขณะที่กำลังผ่านเขาวงกต", + "uk": "Перетягніть 3 об'єкти **$(multiplier)** на полотно та розмістіть їх там, де їх може вдарити м'яч.", + "zh": "将3个**$(multiplier)**对象拖到画布上,并将它们放在球可以击中的地方。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "**Select** then **drag** 3 **$(multiplier)** objects to the canvas and place them where they can be hit by the ball.", + "fr": "**Sélectionnez** puis **faites glisser** 3 objets **$(multiplier)** sur le canevas et placez-les là où ils peuvent être touchés par la balle.", + "ar": "**تحديد** و**سحب** 3 كائنات **$(multiplier)** إلى اللوحة وإدراجها في مكان يمكن للكرة ضربها.", + "de": "**Wählen** und **ziehen** Sie 3 **$(multiplier)**-Objekte auf die Leinwand und platzieren Sie sie dort, wo sie von der Kugel getroffen werden können.", + "es": "**Selecciona** y **arrastra** 3 objetos **$(multiplier)** al lienzo y colócalos donde puedan ser golpeados por la pelota.", + "fi": "**Valitse** ja **vedä** 3 **$(multiplier)**-objektia kankaalle ja aseta ne paikoilleen, joihin pallo voi osua.", + "it": "**Seleziona** e **trascina** 3 oggetti **$(multiplier)** sul canvas e posizionali dove possono essere colpiti dalla palla.", + "tr": "**Seç** ve ardından 3 **$(multiplier)** nesnesini tuvale sürükleyin ve topun vurabileceği yerlere yerleştirin.", + "ja": "**$(multiplier)**オブジェクトを3つ選択してキャンバスにドラッグし、ボールが当たる場所に配置します。", + "ko": "**$(multiplier)** 오브젝트를 3개 선택한 후 캔버스로 끌어다가 공이 맞을 수 있는 곳에 놓습니다.", + "pl": "**Wybierz** a następnie **przeciągnij** 3 obiekty **$(multiplier)** na płótno i umieść je tam, gdzie mogą być trafione przez piłkę.", + "pt": "**Selecione** e **arraste** 3 objetos **$(multiplier)** para a tela e coloque-os onde possam ser atingidos pela bola.", + "ru": "**Выберите** и **перетащите** 3 объекта **$(multiplier)** на холст и разместите их там, где их может ударить мяч.", + "sl": "**Izberite** in **povlecite** 3 objekte **$(multiplier)** na platno in jih postavite tam, kjer jih lahko zadene žoga.", + "sq": "**Zgjidhni** dhe **tërhiqni** 3 objekte **$(multiplier)** në kanavas dhe vendosini atje ku mund të goditen nga topi.", + "th": "**เลือก** และ **ลาก** 3 ชิ้น **$(multiplier)** จากเมนูไปใส่ในแคนวาส และจัดวางให้พวกมันสามารถถูกลูกบอลเก็บไปได้ขณะที่กำลังผ่านเขาวงกต", + "uk": "**Виберіть** а потім **перетягніть** 3 об'єкти **$(multiplier)** на полотно та розмістіть їх там, де їх може вдарити м'яч.", + "zh": "**选择**然后**拖动**3个**$(multiplier)**对象到画布上,并将它们放在球可以击中的地方。" + } + }, + "placement": "top" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:scoreMultiplier", + "nextStepTrigger": { + "instanceAddedOnScene": "scoreMultiplier" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Once you're done, place a **$(scoreMultiplier)** under *Score* to display the point multiplier!", + "fr": "Une fois que vous avez terminé, placez un **$(scoreMultiplier)** juste en dessous du *Score* pour afficher le multiplicateur de points !", + "ar": "بمجرد الانتهاء، إدراج **$(scoreMultiplier)** أسفل *Score* لعرض نقاط المضاعِفات!", + "de": "Sobald Sie fertig sind, platzieren Sie ein **$(scoreMultiplier)** unter *Score*, um den Punktemultiplikator anzuzeigen!", + "es": "Una vez que hayas terminado, coloca un **$(scoreMultiplier)** debajo de *Score* para mostrar el multiplicador de puntos.", + "fi": "Kun olet valmis, aseta **$(scoreMultiplier)** *Pisteet*-kohdan alle näyttääksesi pistekerroin!", + "it": "Una volta terminato, posiziona un **$(scoreMultiplier)** sotto *Punteggio* per visualizzare il moltiplicatore di punti!", + "tr": "İşiniz bittiğinde, puan çarpanını göstermek için *Puan* altına bir **$(scoreMultiplier)** yerleştirin!", + "ja": "完了したら、**スコア**の下に**$(scoreMultiplier)**を配置して、ポイントの乗数を表示します。", + "ko": "작업을 마치면 *점수* 아래에 **$(scoreMultiplier)**를 놓아 점수 배수를 표시하세요!", + "pl": "Gdy skończysz, umieść **$(scoreMultiplier)** pod *Wynik*, aby wyświetlić mnożnik punktów!", + "pt": "Uma vez que você terminou, coloque um **$(scoreMultiplier)** embaixo do *Score* para exibir a pontuação atual do multiplicador.", + "ru": "Как только закончите, разместите **$(scoreMultiplier)** под *Очки*, чтобы отобразить множитель очков!", + "sl": "Ko končate, postavite **$(scoreMultiplier)** pod *Točke*, da prikažete množitelj točk!", + "sq": "Kur të keni përfunduar, vendosni një **$(scoreMultiplier)** nën *Pikët* për të shfaqur shumëzuesin e pikëve!", + "th": "เมื่อทำเสร็จแล้ว ให้ใส่ **$(scoreMultiplier)** เพื่อแสดงคะแนน multiplier score ที่เวลาปัจจุบัน ใส่และจัดวางไว้ข้างล่างคะแนนเลย!", + "uk": "Як тільки ви закінчите, розмістіть **$(scoreMultiplier)** під *Очки*, щоб відобразити множник очок!", + "zh": "完成后,在*分数*下方放置一个**$(scoreMultiplier)**,以显示分数乘数。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "Once you're done, select and place a **$(scoreMultiplier)** under *Score* to display the point multiplier!", + "fr": "Une fois que vous avez terminé, sélectionnez et placez un **$(scoreMultiplier)** juste en dessous du *Score* pour afficher le multiplicateur de points !", + "ar": "بمجرد الانتهاء، تحديد وإدراج **$(scoreMultiplier)** أسفل *Score* لعرض نقاط المضاعِفات!", + "de": "Sobald Sie fertig sind, wählen und platzieren Sie ein **$(scoreMultiplier)** unter *Score*, um den Punktemultiplikator anzuzeigen!", + "es": "Una vez que hayas terminado, selecciona y coloca un **$(scoreMultiplier)** debajo de *Score* para mostrar el multiplicador de puntos.", + "fi": "Kun olet valmis, valitse ja aseta **$(scoreMultiplier)** *Pisteet*-kohdan alle näyttääksesi pistekerroin!", + "it": "Una volta terminato, seleziona e posiziona un **$(scoreMultiplier)** sotto *Punteggio* per visualizzare il moltiplicatore di punti!", + "tr": "İşiniz bittiğinde, puan çarpanını göstermek için *Puan* altına bir **$(scoreMultiplier)** seçin ve yerleştirin!", + "ja": "完了したら、**スコア**の下に**$(scoreMultiplier)**を選択して配置して、ポイントの乗数を表示します。", + "ko": "작업을 마치면 *점수* 아래에 **$(scoreMultiplier)**를 선택하고 놓아 점수 배수를 표시하세요!", + "pl": "Gdy skończysz, wybierz i umieść **$(scoreMultiplier)** pod *Wynik*, aby wyświetlić mnożnik punktów!", + "pt": "Uma vez que você terminou, selecione e coloque um **$(scoreMultiplier)** embaixo do *Score* para exibir a pontuação atual do multiplicador.", + "ru": "Как только закончите, выберите и разместите **$(scoreMultiplier)** под *Очки*, чтобы отобразить множитель очков!", + "sl": "Ko končate, izberite in postavite **$(scoreMultiplier)** pod *Točke*, da prikažete množitelj točk!", + "sq": "Kur të keni përfunduar, zgjidhni dhe vendosni një **$(scoreMultiplier)** nën *Pikët* për të shfaqur shumëzuesin e pikëve!", + "th": "เมื่อทำเสร็จแล้ว ให้เลือกและใส่ **$(scoreMultiplier)** เพื่อแสดงคะแนน multiplier score ที่เวลาปัจจุบัน ใส่และจัดวางไว้ข้างล่างคะแนนเลย!", + "uk": "Як тільки ви закінчите, виберіть і розмістіть **$(scoreMultiplier)** під *Очки*, щоб відобразити множник очок!", + "zh": "完成后,在*分数*下方选择并放置一个**$(scoreMultiplier)**,以显示分数乘数。" + } + }, + "placement": "bottom" + }, + "interactsWithCanvas": true + }, + { + "id": "OpenPropertiesManagerForScene", + "elementToHighlightId": "#main-toolbar-project-manager-button", + "nextStepTrigger": { + "presenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-tab-scenes" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We now need to store the score somewhere. Let's create a scene variable! Open the **Project Manager**", + "fr": "Nous devons maintenant stocker le score quelque part. Créons une variable de scène ! Ouvrez le **Project Manager**", + "ar": "نحتاج إلى تخزين النقاط في مكان ما، هيّا نقوم بإنشاء متغير مشهد! فتح **مدير المشروع**", + "de": "Wir müssen den Punktestand jetzt irgendwo speichern. Lass uns eine Szenenvariable erstellen! Öffne den **Projekt-Manager**", + "es": "Ahora necesitamos almacenar la puntuación en algún lugar. ¡Creemos una variable de escena! Abre el **Project Manager**", + "fi": "Nyt meidän täytyy tallentaa pisteet jonnekin. Luodaan kohteen muuttuja! Avaa **Projektin hallinta**", + "it": "Ora dobbiamo memorizzare il punteggio da qualche parte. Creiamo una variabile di scena! Apri il **Project Manager**", + "tr": "Şimdi puanı bir yerde saklamamız gerekiyor. Bir sahne değişkeni oluşturalım! **Proje Yöneticisi**'ni aç", + "ja": "今度はスコアをどこかに保存する必要があります。**シーン変数**を作成しましょう!**プロジェクトマネージャ**を開いてください", + "ko": "이제 점수를 어딘가에 저장해야 합니다. **씬 변수**를 만들어봅시다! **프로젝트 매니저**를 엽니다", + "pl": "Teraz musimy gdzieś przechować wynik. Stwórzmy zmienną sceny! Otwórz **Menedżera projektu**", + "pt": "Agora precisamos armazenar a pontuação em algum lugar. Vamos criar uma variável de cena! Abra o **Project Manager**", + "ru": "Теперь нам нужно где-то сохранить счет. Давайте создадим переменную сцены! Откройте **Менеджер проекта**", + "sl": "Zdaj moramo shraniti rezultat nekje. Ustvarimo spremenljivko scene! Odpri **Upravitelj projekta**", + "sq": "Tani duhet të ruajmë pikët në një vend. Le të krijojmë një variabël skene! Hap **Menaxherin e Projektit**", + "th": "ทีนี้เราจะทำให้ข้อมูลคะแนนถูกจัดเก็บไว้ที่ไหนสักแห่ง เรามาสร้าง **ตัวแปรของ scene** กันเถอะ! เปิด **โปรเจกต์เมเนเจอร์**", + "uk": "Тепер нам потрібно десь зберегти рахунок. Давайте створимо змінну сцени! Відкрийте **Менеджер проекту**", + "zh": "现在我们需要在某处存储分数。让我们创建一个场景变量!打开**项目管理器**" + } + }, + "placement": "bottom" + }, + "shortcuts": [ + { + "stepId": "SceneVariablesOpen", + "trigger": { + "presenceOfElement": "#scene-variables-dialog" + } + } + ] + }, + { + "elementToHighlightId": "sceneInProjectManager:gameScene", + "nextStepTrigger": { + "presenceOfElement": "#scene-variables-dialog #add-variable" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "**Right click** (or click the *3 dot menu*) on $(gameScene) and select **Edit scene variables**.", + "fr": "Faites un **clic droit** (ou appuyez sur le *bouton à trois points*) sur $(gameScene) et sélectionnez **Modifier les variables de scène**.", + "ar": "النقر على *الثلاث نقاط*، أو **النقر على زر الفأرة الأيمن** على $(gameScene) وتحديد **تحرير متغيرات المشهد**.", + "de": "**Rechtsklick** (oder klicken Sie auf das *3-Punkte-Menü*) auf $(gameScene) und wählen Sie **Szenenvariablen bearbeiten**.", + "es": "Haz **clic derecho** (o clic en el **botón de tres puntos**) sobre $(gameScene) y selecciona **Editar variables de escena**.", + "fi": "**Hiiren oikealla painikkeella** (tai napsauta *kolmen pisteen valikkoa*) $(gameScene) ja valitse **Muokkaa kohteen muuttujia**.", + "it": "**Fai clic con il tasto destro** (o fai clic sul *menu a 3 punti*) su $(gameScene) e seleziona **Modifica variabili di scena**.", + "tr": "$(gameScene) üzerinde **sağ tıklayın** (veya *3 nokta menüsünü* tıklayın) ve **Sahne değişkenlerini düzenle**'yi seçin.", + "ja": "$(gameScene)を**右クリック**(または*3点メニュー*をクリック)して**シーン変数を編集**を選択します。", + "ko": "$(gameScene)에서 **마우스 오른쪽 버튼을 클릭** (또는 *3 점 메뉴*를 클릭)하여 **씬 변수 편집**을 선택합니다.", + "pl": "**Kliknij prawym przyciskiem myszy** (lub kliknij *menu 3 kropek*) na $(gameScene) i wybierz **Edytuj zmienne sceny**.", + "pt": "Clique com o **botão direito** (ou toque no *botão de três pontos*) na $(gameScene) e selecione **Editar variáveis de cena**.", + "ru": "**Щелкните правой кнопкой мыши** (или нажмите *меню из трех точек*) на $(gameScene) и выберите **Изменить переменные сцены**.", + "sl": "**Desni klik** (ali kliknite *meni s tremi pikami*) na $(gameScene) in izberite **Uredi spremenljivke scene**.", + "sq": "**Kliko me të djathtën** (ose kliko menynë *3 pikë*) në $(gameScene) dhe zgjidh **Ndrysho variablat e skenës**.", + "th": "**คลิกขวา** ที่ $(gameScene) หรือกดที่ **ปุ่ม 3 จุด** และเลือก **แก้ไขตัวแปรของ scene**", + "uk": "**Клацніть правою кнопкою миші** (або натисніть *меню з трьох крапок*) на $(gameScene) та виберіть **Редагувати змінні сцени**.", + "zh": "在$(gameScene)上**右键单击**(或单击*3点菜单*),然后选择**编辑场景变量**。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "**Long press** (or use the *3 dot menu*) on $(gameScene) and select **Edit scene variables**.", + "fr": "Faites un **appui long** (ou utilisez le *bouton à 3 points*) sur $(gameScene) et sélectionnez **Modifier les variables de scène**.", + "ar": "الضغط على *الثلاث نقاط*، أو **ضغطة مطولة** على $(gameScene) وتحديد **تحرير متغيرات المشهد**.", + "de": "**Langes Drücken** (oder klicken Sie auf das *3-Punkte-Menü*) auf $(gameScene) und wählen Sie **Szenenvariablen bearbeiten**.", + "es": "Haz **pulsación larga** (o usa el **botón de 3 puntos**) sobre $(gameScene) y selecciona **Editar variables de escena**.", + "fi": "**Pidä painettuna** (tai käytä *kolmen pisteen valikkoa*) $(gameScene) ja valitse **Muokkaa kohteen muuttujia**.", + "it": "**Premi a lungo** (o tocca il *menu a 3 punti*) su $(gameScene) e seleziona **Modifica variabili di scena**.", + "tr": "$(gameScene) üzerinde **uzun basın** (veya *3 nokta menüsünü* kullanın) ve **Sahne değişkenlerini düzenle**'yi seçin.", + "ja": "$(gameScene)を**長押し**(または*3点メニュー*を使用)して**シーン変数を編集**を選択します。", + "ko": "$(gameScene)에서 **마우스 오른쪽 버튼을 길게 누르세요** (또는 *3 점 메뉴*를 사용)하여 **씬 변수 편집**을 선택합니다.", + "pl": "**Przytrzymaj** (lub kliknij *menu 3 kropek*) na $(gameScene) i wybierz **Edytuj zmienne sceny**.", + "pt": "Pressione por **muito tempo** (ou use o *botão de três pontos*) na $(gameScene) e selecione **Editar variáveis de cena**.", + "ru": "**Долгое нажатие** (или нажмите *меню из трех точек*) на $(gameScene) и выберите **Изменить переменные сцены**.", + "sl": "**Dolgo pritisnite na** (ali uporabite *meni s tremi pikami*) $(gameScene) in izberite **Uredi spremenljivke scene**.", + "sq": "**Shtypni gjatë** (ose përdorni *menynë 3 pikë*) në $(gameScene) dhe zgjidhni **Ndrysho variablat e skenës**.", + "th": "**กดค้าง** ที่ $(gameScene) หรือกดที่ **ปุ่ม 3 จุด** และเลือก **แก้ไขตัวแปรของ scene**", + "uk": "**Довго натисніть** (або натисніть *меню з трьох крапок*) на $(gameScene) та виберіть **Редагувати змінні сцени**.", + "zh": "在$(gameScene)上**长按**(或使用*3点菜单*),然后选择**编辑场景变量**。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "id": "SceneVariablesOpen", + "elementToHighlightId": "#scene-variables-dialog #add-variable", + "nextStepTrigger": { + "presenceOfElement": "#variable-0-name" + }, + "tooltip": { + "title": { + "messageByLocale": { + "en": "Let's add our first **variable**!", + "fr": "Ajoutons notre première **variable** !", + "ar": "هيّا نقوم بإضافة أول **متغير** لنا!", + "de": "Lassen Sie uns unsere erste **Variable** hinzufügen!", + "es": "¡Agreguemos nuestra primera **variable**!", + "fi": "Lisätään ensimmäinen **muuttuja**!", + "it": "Aggiungiamo la nostra prima **variabile**!", + "tr": "İlk **değişkenimizi** ekleyelim!", + "ja": "最初の**変数**を追加しましょう!", + "ko": "첫 번째 **변수**를 추가해봅시다!", + "pl": "Dodajmy naszą pierwszą **zmienną**!", + "pt": "Vamos adicionar nossa primeira **variável**!", + "ru": "Добавим нашу первую **переменную**!", + "sl": "Dodajmo naš prvi **spremenljivko**!", + "sq": "Të shtojmë **variabël** tonë të parë!", + "th": "มาเพิ่ม **ตัวแปร** แรกของเรากันเถอะ!", + "uk": "Додамо нашу першу **змінну**!", + "zh": "让我们添加我们的第一个**变量**!" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#scene-variables-dialog #variable-0-name", + "nextStepTrigger": { + "valueEquals": "Multi" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's name this variable `Multi`.", + "fr": "Nommons cette variable `Multi`.", + "ar": "هيّا نقوم بتسمية هذا المتغير `Multi`.", + "de": "Nennen wir diese Variable `Multi`.", + "es": "Nombramos esta variable `Multi`.", + "fi": "Nimeä tämä muuttuja `Multi`.", + "it": "Chiamiamo questa variabile `Multi`.", + "tr": "Bu değişkeni `Multi` olarak adlandıralım.", + "ja": "この変数を`Multi`と名前を付けましょう。", + "ko": "이 변수의 이름을 `Multi`로 지어봅시다.", + "pl": "Nazwijmy tę zmienną `Multi`.", + "pt": "Vamos nomear esta variável `Multi`.", + "ru": "Давайте назовем эту переменную `Multi`.", + "sl": "Imenujmo to spremenljivko `Multi`.", + "sq": "Të japim kësaj variabël emrin `Multi`.", + "th": "ตั้งชื่อให้กับตัวแปรนี้ว่า `Multi`", + "uk": "Давайте назвемо цю змінну `Multi`.", + "zh": "让我们将这个变量命名为`Multi`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#scene-variables-dialog #variable-0-text-value", + "nextStepTrigger": { + "valueEquals": "1" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "And finally let's change its initial value to **1**.", + "fr": "Et enfin, changeons sa valeur initiale en **1**.", + "ar": "وأخيرًا وليس آخرًا، هيّا نقوم بتغيير القيمة إلى **1**.", + "de": "Und schließlich ändern wir seinen Anfangswert auf **1**.", + "es": "Y finalmente, cambiemos su valor inicial a **1**.", + "fi": "Lopuksi muutetaan sen alkuarvo **1**.", + "it": "Infine, cambiamo il suo valore iniziale in **1**.", + "tr": "Ve son olarak, başlangıç değerini **1** yapalım.", + "ja": "最後に、その初期値を**1**に変更しましょう。", + "ko": "마지막으로 초기값을 **1**로 변경해봅시다.", + "pl": "Na koniec zmieńmy jego początkową wartość na **1**.", + "pt": "E finalmente, vamos mudar seu valor inicial para **1**.", + "ru": "И, наконец, изменим его начальное значение на **1**.", + "sl": "In končno, spremenimo njegovo začetno vrednost v **1**.", + "sq": "Dhe në fund, të ndryshojmë vlerën fillestare në **1**.", + "th": "และสุดท้าย เปลี่ยนค่าเริ่มต้นเป็น **1**", + "uk": "І нарешті змінимо його початкове значення на **1**.", + "zh": "最后让我们将其初始值更改为**1**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#scene-variables-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#scene-variables-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "And we're done! Let's close this dialog.", + "fr": "Et c'est tout ! Fermons cette boîte de dialogue.", + "ar": "وها قد انتهينا! لنغلق هذه.", + "de": "Und wir sind fertig! Lassen Sie uns diesen Dialog schließen.", + "es": "¡Y listo! Cerramos esta ventana.", + "fi": "Ja valmista tuli! Suljetaan tämä valintaikkuna.", + "it": "E siamo a posto! Chiudiamo questa finestra.", + "tr": "Ve işte bu kadar! Bu iletişim kutusunu kapatalım.", + "ja": "完了です!このダイアログを閉じましょう。", + "ko": "그리고 끝났습니다! 이 대화 상자를 닫아봅시다.", + "pl": "I skończone! Zamknijmy to okno dialogowe.", + "pt": "E acabamos! Vamos fechar esta janela.", + "ru": "И мы закончили! Давайте закроем это диалоговое окно.", + "sl": "In končano! Zaprimo to okno.", + "sq": "Dhe kemi përfunduar! Le të mbyllim këtë dialog.", + "th": "เสร็จแล้ว! ปิดหน้าต่างได้เลย", + "uk": "І ми закінчили! Давайте закриємо це вікно.", + "zh": "我们完成了!让我们关闭这个对话框。" + } + } + } + }, + { + "elementToHighlightId": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-drawer-close", + "nextStepTrigger": { + "absenceOfElement": "div[role=\"presentation\"]:is([data-open=true], :not([aria-hidden=true])) #project-manager-drawer-close" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's close the menu.", + "fr": "Fermons le menu.", + "ar": "هيّا نغلق القائمة.", + "de": "Lassen Sie uns das Menü schließen.", + "es": "Cerramos el menú.", + "fi": "Suljetaan valikko.", + "it": "Chiudiamo il menu.", + "tr": "Menüyü kapatalım.", + "ja": "メニューを閉じましょう。", + "ko": "메뉴를 닫아봅시다.", + "pl": "Zamknijmy menu.", + "pt": "Vamos fechar o menu.", + "ru": "Давайте закроем меню.", + "sl": "Zaprimo meni.", + "sq": "Le të mbyllim menunë.", + "th": "ปิดเมนู", + "uk": "Давайте закриємо меню.", + "zh": "让我们关闭菜单。" + } + } + }, + "skippable": true + }, + { + "elementToHighlightId": "editorTab:gameScene:EventsSheet", + "nextStepTrigger": { + "presenceOfElement": "#events-editor[data-active]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's activate those multipliers. Open the **Events Sheet** of the $(gameScene) scene.", + "fr": "Maintenant, activons ces multiplicateurs. Ouvrons la **Feuille d'événements** de la scène $(gameScene).", + "ar": "الآن هيّا نقوم بتنشيط تلك المضاعِفات، فتح **صفحة أحداث** المشهد $(gameScene).", + "de": "Lassen Sie uns diese Multiplikatoren aktivieren. Öffnen Sie das **Ereignisblatt** der Szene $(gameScene).", + "es": "Ahora activemos esos multiplicadores. Abre la **Hoja de eventos** de la escena $(gameScene).", + "fi": "Nyt aktivoidaan nämä kerroimet. Avaa $(gameScene)-kohteen **Tapahtumataulukko**.", + "it": "Ora attiviamo quei moltiplicatori. Apri il **Foglio eventi** della scena $(gameScene).", + "tr": "Şimdi bu çarpanları etkinleştirelim. $(gameScene) sahnesinin **Olaylar Sayfası**'nı açın.", + "ja": "それでは、その乗数を有効にしましょう。$(gameScene)の**イベントシート**を開きます。", + "ko": "이제 그 배수를 활성화해봅시다. $(gameScene)의 **이벤트 시트**를 엽니다.", + "pl": "Teraz aktywujmy te mnożniki. Otwórz **Arkusz zdarzeń** sceny $(gameScene).", + "pt": "Agora vamos ativar esses multiplicadores. Vamos abra a **Folha de eventos** da cena $(gameScene).", + "ru": "Теперь давайте активируем эти множители. Откройте **Лист событий** сцены $(gameScene).", + "sl": "Sedaj aktivirajmo te množitelje. Odpri **List dogodkov** prizora $(gameScene).", + "sq": "Tani le të aktivizojmë këto shumëzues. Hap **Fletën e ngjarjeve** të skenës $(gameScene).", + "th": "ทีนี้มาทำให้ multiplier ทำงานกัน เปิด **ชี้ทอีเวนต์** ของ scene $(gameScene)", + "uk": "Тепер давайте активуємо ці множники. Відкрийте **Аркуш подій** сцени $(gameScene).", + "zh": "现在让我们激活这些乘数。打开$(gameScene)场景的**事件表**。" + } + }, + "placement": "bottom" + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "#events-editor[data-active] #event-2-1-conditions #add-condition-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We'll start by making the $(multiplier) disappear when it gets hitted by a $(ball). Click **add a condition** to begin.", + "fr": "Nous allons commencer par faire disparaître le $(multiplier) lorsqu'il est touché par une $(ball). Cliquez sur **ajouter une condition** pour commencer.", + "ar": "سوف نبدأ بجعل الـ $(multiplier) تختفي عندما يضربها $(ball). الضغط على **إضافة شرط** للبدأ.", + "de": "Wir werden damit beginnen, dass der $(multiplier) verschwindet, wenn er von einem $(ball) getroffen wird. Klicken Sie auf **Bedingung hinzufügen**, um zu beginnen.", + "es": "Comenzaremos haciendo que el $(multiplier) desaparezca cuando sea golpeado por una $(ball). Haz clic en **agregar una condición** para empezar.", + "fi": "Aloitetaan tekemällä $(multiplier) katoaa, kun se osuu $(ball) -palloon. Klikkaa **lisää ehto** aloittaaksesi.", + "it": "Inizieremo facendo scomparire il $(multiplier) quando viene colpito da una $(ball). Clicca su **aggiungi una condizione** per iniziare.", + "tr": "$(multiplier) bir $(ball) tarafından vurulduğunda kaybolmasını sağlayarak başlayacağız. Başlamak için **bir koşul ekle**'ye tıklayın.", + "ja": "$(multiplier)が$(ball)に当たったときに消えるようにします。**条件を追加**をクリックして始めましょう。", + "ko": "$(multiplier)가 $(ball)에 맞았을 때 사라지도록 시작해봅시다. 시작하려면 **조건 추가**를 클릭하세요.", + "pl": "Zaczniemy od zrobienia $(multiplier) niewidocznym, gdy zostanie uderzony przez $(ball). Kliknij **dodaj warunek**, aby rozpocząć.", + "pt": "Começaremos fazendo o $(multiplier) desaparecer ao ser atingido por uma $(ball). Clique em **adicionar uma condição** para iniciar.", + "ru": "Мы начнем с того, что сделаем $(multiplier) невидимым, когда его ударит $(ball). Нажмите **добавить условие**, чтобы начать.", + "sl": "Začnemo tako, da naredimo $(multiplier) neviden, ko ga zadene $(ball). Kliknite **dodaj pogoj**, da začnete.", + "sq": "Do të fillojmë duke bërë $(multiplier) të zhduket kur goditet nga një $(ball). Kliko **shto një kusht** për të filluar.", + "th": "ขั้นแรก เราจะทำให้ $(multiplier) หายไป เมื่อถูก $(ball) ชนครั้งหนึ่ง อีเวนท์พร้อมแล้ว ให้ **เพิ่มเงื่อนไข** ลงไป", + "uk": "Ми почнемо з того, що зробимо $(multiplier) невидимим, коли його вдарить $(ball). Натисніть **додати умову**, щоб почати.", + "zh": "我们将从当$(multiplier)被$(ball)击中时消失开始。点击**添加条件**开始。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:ball", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-CollisionNP" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(ball)**.", + "fr": "Sélectionnez **$(ball)**.", + "ar": "تحديد **$(ball)**.", + "de": "Wählen Sie **$(ball)**.", + "es": "Seleccione **$(ball)**.", + "fi": "Valitse **$(ball)**.", + "it": "Seleziona **$(ball)**.", + "tr": "**$(ball)**'ı seçin.", + "ja": "**$(ball)**を選択します。", + "ko": "**$(ball)**을 선택하세요.", + "pl": "Wybierz **$(ball)**.", + "pt": "Selecione **$(ball)**.", + "ru": "Выберите **$(ball)**.", + "sl": "Izberite **$(ball)**.", + "sq": "Zgjidh **$(ball)**.", + "th": "เลือก **$(ball)**", + "uk": "Виберіть **$(ball)**.", + "zh": "选择**$(ball)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-CollisionNP", + "nextStepTrigger": { + "presenceOfElement": "#parameter-1-object-selector" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Collision** condition.", + "fr": "Sélectionnez la condition **Collision**.", + "ar": "تحديد الشرط **تصادم**.", + "de": "Wählen Sie die **Kollision**-Bedingung.", + "es": "Seleccione la condición **Colisión**.", + "fi": "Valitse **Törmäys**-ehto.", + "it": "Seleziona la condizione **Collisione**.", + "tr": "**Çarpışma** koşulunu seçin.", + "ja": "**衝突**条件を選択します。", + "ko": "**충돌** 조건을 선택하세요.", + "pl": "Wybierz warunek **Kolizja**.", + "pt": "Selecione a condição **Colisão**.", + "ru": "Выберите условие **Столкновение**.", + "sl": "Izberite pogoj **Trk**.", + "sq": "Zgjidhni kushtin **Grusht**.", + "th": "เลือกเงื่อนไข **การชนกัน**", + "uk": "Виберіть умову **Зіткнення**.", + "zh": "选择**碰撞**条件。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-1-object-selector", + "nextStepTrigger": { + "valueEquals": "Multiplier" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "And select our **$(multiplier)**.", + "fr": "Et sélectionnez notre **$(multiplier)**.", + "ar": "وتحديد الـ **$(multiplier)** خاصتنا.", + "de": "Und wählen Sie unsere **$(multiplier)**.", + "es": "Y seleccione nuestro **$(multiplier)**.", + "fi": "Ja valitse **$(multiplier)**.", + "it": "E seleziona il nostro **$(multiplier)**.", + "tr": "Ve **$(multiplier)**'ımızı seçin.", + "ja": "そして、**$(multiplier)**を選択します。", + "ko": "그리고 우리의 **$(multiplier)**을 선택하세요.", + "pl": "Wybierz nasz **$(multiplier)**.", + "pt": "E selecione nosso **$(multiplier)**.", + "ru": "И выберите наш **$(multiplier)**.", + "sl": "In izberite naš **$(multiplier)**.", + "sq": "Dhe zgjidhni **$(multiplier)** tonë.", + "th": "เลือก **$(multiplier)**", + "uk": "І виберіть наш **$(multiplier)**.", + "zh": "然后选择我们的**$(multiplier)**。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Our **condition** is ready. This **condition** will be **true** when the **$(ball) touches the $(multiplier)**.", + "fr": "Notre **condition** est prête. Elle sera **vraie** quand **$(ball) touche le $(multiplier)**.", + "ar": "شرطنا جاهز. سيكون **صحيحًا** عندما **$(ball) تلمس $(multiplier)**.", + "de": "Unsere **Bedingung** ist bereit. Diese **Bedingung** wird **wahr** sein, wenn der **$(ball) das $(multiplier) berührt**.", + "es": "Nuestra **condición** está lista. Será **verdadera** cuando **$(ball) golpee el $(multiplier)**.", + "fi": "Ehtomme on valmis. Tämä ehto on **tosi**, kun **$(ball) koskettaa $(multiplier)**.", + "it": "La nostra **condizione** è pronta. Questa **condizione** sarà **vera** quando la **$(ball) toccherà il $(multiplier)**.", + "tr": "Bizim **koşulumuz** hazır. Bu **koşul**, **$(ball) $(multiplier)'e dokunduğunda** **doğru** olacaktır.", + "ja": "私たちの**条件**は準備ができています。この**条件**は**$(ball)が$(multiplier)に触れたとき**に**真**になります。", + "ko": "우리의 **조건**이 준비되었습니다. 이 **조건**은 **$(ball)이 $(multiplier)에 닿았을 때** **참**이 될 것입니다.", + "pl": "Naszy **warunek** jest gotowy. Ten **warunek** będzie **prawdziwy**, gdy **$(ball) dotknie $(multiplier)**.", + "pt": "Nossa **condição** está pronta. Ela será **verdadeira** quando **$(ball) bater no $(multiplier)**.", + "ru": "Наше **условие** готово. Это **условие** будет **истинным**, когда **$(ball) коснется $(multiplier)**.", + "sl": "Naš **pogoj** je pripravljen. Ta **pogoj** bo **resničen**, ko **$(ball) zadene $(multiplier)**.", + "sq": "Kushti ynë është gati. Ky **kusht** do të jetë **i vërtetë** kur **$(ball) prek $(multiplier)**.", + "th": "เงื่อนไขของเราพร้อมแล้ว จะเป็น **จริง** เมื่อ **$(ball) ชนกับ $(multiplier)**", + "uk": "Наша **умова** готова. Ця **умова** буде **істинною**, коли **$(ball) доторкнеться $(multiplier)**.", + "zh": "我们的**条件**已准备好。当**$(ball)触碰$(multiplier)**时,这个**条件**将为**真**。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "[data-active=\"true\"] #event-2-1-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's make our multiplier disappear with an **action** now.", + "fr": "Faisons disparaître notre multiplicateur avec une **action** maintenant.", + "ar": "هيّا نقوم بجعل مضاعِفاتنا تختفي بواسطة **إجراء** الآن.", + "de": "Lassen Sie uns unseren Multiplikator jetzt mit einer **Aktion** verschwinden.", + "es": "Hagamos que nuestro multiplicador desaparezca con una **acción** ahora.", + "fi": "Tehdään kerroin näkymättömäksi **toiminnolla** nyt.", + "it": "Facciamo scomparire il nostro moltiplicatore con un'**azione** ora.", + "tr": "Çarpanımızı şimdi bir **eylem** ile kaybolacak şekilde yapalım.", + "ja": "今すぐ**アクション**で私たちの乗数を消えるようにしましょう。", + "ko": "이제 **조치**로 우리의 배수를 사라지게 해봅시다.", + "pl": "Zrobimy nasz mnożnik niewidocznym za pomocą **akcji**.", + "pt": "Vamos fazer nosso multiplicador desaparecer com uma **ação** agora.", + "ru": "Давайте сделаем наш множитель невидимым с помощью **действия**.", + "sl": "Naredimo naš množitelj neviden z **akcijo**.", + "sq": "Le të bëjmë shumëzuesin tonë të zhduket me një **veprim** tani.", + "th": "ทำให้ multiplier หายไป โดยใช้ **การกระทำ**", + "uk": "Давайте зробимо наш множник невидимим за допомогою **дії**.", + "zh": "现在让我们用**动作**让我们的乘数消失。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:multiplier", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-Delete" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **$(multiplier)**.", + "fr": "Sélectionnez **$(multiplier)**.", + "ar": "تحديد **$(multiplier)**.", + "de": "Wählen Sie **$(multiplier)**.", + "es": "Seleccione **$(multiplier)**.", + "fi": "Valitse **$(multiplier)**.", + "it": "Seleziona **$(multiplier)**.", + "tr": "**$(multiplier)**'ı seçin.", + "ja": "**$(multiplier)**を選択します。", + "ko": "**$(multiplier)**을 선택하세요.", + "pl": "Wybierz **$(multiplier)**.", + "pt": "Selecione **$(multiplier)**.", + "ru": "Выберите **$(multiplier)**.", + "sl": "Izberite **$(multiplier)**.", + "sq": "Zgjidhni **$(multiplier)**.", + "th": "เลือก **$(multiplier)**", + "uk": "Виберіть **$(multiplier)**.", + "zh": "选择**$(multiplier)**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-Delete", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will make **$(multiplier)** disappear on collision.", + "fr": "Nous allons faire disparaître **$(multiplier)** en cas de collision.", + "ar": "سوف نجعل **$(multiplier)** تختفي مع التصادم.", + "de": "Wir werden **$(multiplier)** bei Kollision verschwinden lassen.", + "es": "Haremos que **$(multiplier)** desaparezca en caso de colisión.", + "fi": "Tehdään **$(multiplier)** näkymättömäksi törmäyksessä.", + "it": "Faremo scomparire **$(multiplier)** in caso di collisione.", + "tr": "**$(multiplier)**'ı çarpışma durumunda kaybolacak şekilde yapacağız.", + "ja": "衝突時に**$(multiplier)**を消えるようにします。", + "ko": "충돌 시 **$(multiplier)**을 사라지게 만들 것입니다.", + "pl": "Sprawimy, że **$(multiplier)** zniknie w przypadku kolizji.", + "pt": "Vamos fazer com que **$(multiplier)** desapareça em caso de colisão.", + "ru": "Мы заставим **$(multiplier)** исчезнуть при столкновении.", + "sl": "Naredili bomo, da **$(multiplier)** izgine ob trku.", + "sq": "Do të bëjmë që **$(multiplier)** të zhduket në rast të grushtit.", + "th": "เราจะทำให้ **$(multiplier)** หายไปเมื่อมีการชนกัน", + "uk": "Ми зробимо **$(multiplier)** зникне при зіткненні.", + "zh": "我们将使**$(multiplier)**在碰撞时消失。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "It is important to note that only the $(multiplier) that is hitted by the $(ball) (matches our condition) will be deleted. This principle is called **Object picking**.\n\nLet's close this dialog.", + "fr": "Il est important de noter que seul le $(multiplier) qui est touché par la $(ball) (qui correspond à notre condition) sera supprimé. On appelle ce principe le **choix d'objet**.\n\nFermons cette boîte de dialogue.", + "ar": "من المهم أن تلاحظ أن الـ $(multiplier) المضروبة بواسطة الـ $(ball) طبقًا لشرطنا هي فقط ما سيتم حذفها، هذا المبدأ يدعى **إلتقاط الكائن**.\n\nلنغلق هذه.", + "de": "Es ist wichtig zu beachten, dass nur der $(multiplier), der von der $(ball) getroffen wird (unserer Bedingung entspricht), gelöscht wird. Dieses Prinzip nennt sich **Objektauswahl**.\n\nLassen Sie uns diesen Dialog schließen.", + "es": "Es importante tomar en cuenta que solo el $(multiplier) que sea tocado por la $(ball) (coincida con nuestra condición) será eliminado. Este principio se llama **elección de objeto**.\n\nCerraremos esta ventana.", + "fi": "On tärkeää huomata, että vain $(multiplier), joka osuu $(ball) (vastaa ehtoamme), poistetaan. Tätä periaatetta kutsutaan **kohteen valinta**.\n\nSuljetaan tämä valintaikkuna.", + "it": "È importante notare che solo il $(multiplier) colpito dalla $(ball) (che corrisponde alla nostra condizione) verrà eliminato. Questo principio si chiama **scelta dell'oggetto**.\n\nChiudiamo questa finestra.", + "tr": "Yalnızca $(ball) tarafından vurulan $(multiplier) (şartımıza uyan) silinecektir. Bu prensip **Nesne seçimi** olarak adlandırılır.\n\nBu iletişim kutusunu kapatalım.", + "ja": "重要なことは、$(ball)によって当たられた$(multiplier)(私たちの条件に一致する)だけが削除されるということです。この原則は**オブジェクトの選択**と呼ばれます。\n\nこのダイアログを閉じましょう。", + "ko": "중요한 점은 $(ball)이 맞은 $(multiplier)만이 삭제될 것이라는 것입니다. 이 원리는 **객체 선택**이라고 합니다.\n\n이 대화 상자를 닫아봅시다.", + "pl": "Warto zauważyć, że tylko $(multiplier), który zostanie uderzony przez $(ball) (spełniający nasz warunek) zostanie usunięty. Zasada ta nazywa się **Wybór obiektu**.\n\nZamknijmy to okno dialogowe.", + "pt": "É importante notar que apenas o $(multiplier) que for atingido pela $(ball) (que corresponder à nossa condição) será excluído. Esse princípio é chamado de **escolha de objeto**.\n\nVamos fechar esta janela.", + "ru": "Важно отметить, что будет удален только $(multiplier), который будет ударен $(ball) (соответствует нашему условию). Этот принцип называется **Выбор объекта**.\n\nДавайте закроем это диалоговое окно.", + "sl": "Pomembno je opozoriti, da bo izbrisan samo $(multiplier), ki ga zadene $(ball) (ustreza našemu pogoju). Ta načelo se imenuje **Izbira predmeta**.\n\nZaprimo to okno.", + "sq": "Është e rëndësishme të theksohet se vetëm $(multiplier) që goditet nga $(ball) (përputhet me kushtin tonë) do të fshihet. Ky parim quhet **Zgjedhja e objektit**.\n\nLe të mbyllim këtë dritare.", + "th": "สิ่งสำคัญที่คุณควรจดจำไว้คือ มีเพียง $(multiplier) ที่ตรงกับเงื่อนไขเท่านั้นที่ถูกลบ เรียกว่า **การเลือกวัตถุ** ปิดหน้าต่างนี้", + "uk": "Важливо відзначити, що буде видалено лише $(multiplier), який буде вдарений $(ball) (відповідає нашій умові). Цей принцип називається **Вибір об'єкта**.\n\nДавайте закриємо це вікно.", + "zh": "重要的是只有被$(ball)击中的$(multiplier)(符合我们的条件)将被删除。这个原则叫做**对象选择**。\n\n让我们关闭这个对话框。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "[data-active=\"true\"] #event-2-1-actions #add-action-button", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's **update our variable** accordingly.", + "fr": "Mettons à jour notre **variable** en conséquence.", + "ar": "هيّا نقوم ب**تحديث متغيرنا** لتوافق المضاعِفات التي تم جمعها.", + "de": "Aktualisieren wir unsere **Variable** entsprechend.", + "es": "Actualicemos nuestra **variable** en consecuencia.", + "fi": "Päivitetään **muuttujamme** vastaavasti.", + "it": "Aggiorniamo la nostra **variabile** di conseguenza.", + "tr": "Değişkenimizi **uygun şekilde güncelleyelim**.", + "ja": "それに応じて**変数を更新**しましょう。", + "ko": "우리의 **변수를 업데이트**해봅시다.", + "pl": "Zaktualizujmy naszą **zmienną** odpowiednio.", + "pt": "Atualizemos nossa **variável** em conformidade.", + "ru": "Давайте **обновим нашу переменную** соответственно.", + "sl": "Posodobimo naš **spremenljivko** ustrezno.", + "sq": "Le të **përditësojmë variablën tonë** në përputhje.", + "th": "ทำการ **อัพเดทตัวแปร**", + "uk": "Давайте **оновимо нашу змінну** відповідно.", + "zh": "让我们**根据情况更新我们的变量**。" + } + } + } + }, + { + "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-SetNumberVariable" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Search for **Change variable value**.", + "fr": "Recherchez **Modifier la valeur de la variable**.", + "ar": "البحث عن **تغيير قيمة المتغير**.", + "de": "Suchen Sie nach **Ändern Sie den Variablenwert**.", + "es": "Busque **Cambiar el valor de la variable**.", + "fi": "Etsi **Muuta muuttujan arvoa**.", + "it": "Cerca **Cambia il valore della variabile**.", + "tr": "**Değişken değerini değiştir** arayın.", + "ja": "**変数の値を変更**を検索します。", + "ko": "**변수 값 변경**을 검색하세요.", + "pl": "Szukaj **Zmień wartość zmiennej**.", + "pt": "Procure **Alterar o valor da variável**.", + "ru": "Ищите **Изменить значение переменной**.", + "sl": "Išči **Spremeni vrednost spremenljivke**.", + "sq": "Kërkoni **Ndrysho vlerën e variablës**.", + "th": "ค้นหา **เปลี่ยนค่าตัวแปร**.", + "uk": "Шукайте **Змінити значення змінної**.", + "zh": "搜索**更改变量值**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-SetNumberVariable", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Our multiplier is a number, so let's select **Change variable value** action.", + "fr": "Notre multiplicateur est un nombre, donc sélectionnons l'action **Modifier une variable numérique**.", + "ar": "مضاعِفاتنا عبارة عن عدد، لذلك هيّا نقوم بتحديد الإجراء **تغيير قيمة المتغير**.", + "de": "Unser Multiplikator ist eine Zahl, also wählen wir die Aktion **Ändern Sie den Variablenwert**.", + "es": "Nuestro multiplicador es un número, por lo que seleccionemos la acción **Cambiar valor de variable**.", + "fi": "Kerroin on numero, joten valitaan **Muuta muuttujan arvoa** -toiminto.", + "it": "Il nostro moltiplicatore è un numero, quindi selezioniamo l'azione **Cambia valore della variabile**.", + "tr": "Çarpanımız bir sayı olduğu için **Değişken değerini değiştir** eylemini seçelim.", + "ja": "私たちの乗数は数字なので、**変数の値を変更**アクションを選択しましょう。", + "ko": "우리의 배수는 숫자이므로 **변수 값 변경** 조치를 선택해봅시다.", + "pl": "Nasz mnożnik to liczba, więc wybierzmy akcję **Zmień wartość zmiennej**.", + "pt": "Nosso multiplicador é um número, então vamos selecionar a ação **Alterar valor da variável**.", + "ru": "Наш множитель - это число, поэтому давайте выберем действие **Изменить значение переменной**.", + "sl": "Naš množitelj je število, zato izberimo akcijo **Spremeni vrednost spremenljivke**.", + "sq": "Shumëzuesi ynë është një numër, kështu që le të zgjedhim veprimin **Ndrysho vlerën e variablës**.", + "th": "ตัวคูณของเราเป็นตัวเลข ดังนั้นเลือกการกระทำ **เปลี่ยนค่าตัวแปร**", + "uk": "Наш множник - це число, тому давайте виберемо дію **Змінити значення змінної**.", + "zh": "我们的乘数是一个数字,所以让我们选择**更改变量值**动作。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-0-scene-variable-field", + "nextStepTrigger": { + "valueEquals": "Multi" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the variable we created earlier, **Multi**.", + "fr": "Sélectionnez la variable que nous avons créée précédemment, **Multi**.", + "ar": "تحديد المتغير الذي قمنا بإنشائه في البداية (**Multi**).", + "de": "Wählen Sie die Variable, die wir zuvor erstellt haben, **Multi**.", + "es": "Seleccione la variable que creamos anteriormente, **Multi**.", + "fi": "Valitse aiemmin luomamme muuttuja, **Multi**.", + "it": "Seleziona la variabile che abbiamo creato in precedenza, **Multi**.", + "tr": "Daha önce oluşturduğumuz değişkeni seçin, **Multi**.", + "ja": "先ほど作成した変数**Multi**を選択します。", + "ko": "이전에 만든 변수 **Multi**를 선택하세요.", + "pl": "Wybierz zmienną, którą wcześniej utworzyliśmy, **Multi**.", + "pt": "Selecione a variável que criamos anteriormente, **Multi**.", + "ru": "Выберите переменную, которую мы создали ранее, **Multi**.", + "sl": "Izberite spremenljivko, ki smo jo ustvarili prej, **Multi**.", + "sq": "Zgjidhni variablën që krijuam më parë, **Multi**.", + "th": "เลือกตัวแปรที่เราสร้าง **Multi**", + "uk": "Виберіть змінну, яку ми створили раніше, **Multi**.", + "zh": "选择我们之前创建的变量**Multi**。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-1-operator-field", + "nextStepTrigger": { + "valueEquals": "+" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We want to increase the multiplier, so let's select **+ (add)**.", + "fr": "Nous voulons augmenter le multiplicateur, donc sélectionnons **+ (ajouter)**.", + "ar": "نحن نريد أن نزيد المضاعِفات، لذلك هيّا نقوم بتحديد **+ (زائد)**.", + "de": "Wir wollen den Multiplikator erhöhen, also wählen wir **+ (hinzufügen)**.", + "es": "Queremos aumentar el multiplicador, así que seleccionemos **+ (agregar)**.", + "fi": "Haluamme lisätä kerrointa, joten valitse **+ (lisää)**.", + "it": "Vogliamo aumentare il moltiplicatore, quindi selezioniamo **+ (aggiungi)**.", + "tr": "Çarpanı artırmak istiyoruz, bu yüzden **+ (ekle)** seçelim.", + "ja": "私たちは乗数を増やしたいので、**+ (加算)**を選択しましょう。", + "ko": "우리는 배수를 증가시키고 싶으므로 **+ (더하기)**를 선택하세요.", + "pl": "Chcemy zwiększyć mnożnik, więc wybierzmy **+ (dodaj)**.", + "pt": "Queremos aumentar o multiplicador, então vamos selecionar **+ (adicionar)**.", + "ru": "Мы хотим увеличить множитель, поэтому выберем **+ (добавить)**.", + "sl": "Želimo povečati množitelj, zato izberimo **+ (dodaj)**.", + "sq": "Ne duam të rrisim shumëzuesin, kështu që le të zgjedhim **+ (shto)**.", + "th": "เราต้องการเพิ่ม multiplier จึงเลือก **+ (เพิ่ม)**", + "uk": "Ми хочемо збільшити множник, тому виберемо **+ (додати)**.", + "zh": "我们想增加乘数,所以让我们选择**+(加)**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "1" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's enter **1**.", + "fr": "Entrez **1**.", + "ar": "هيّا نقوم بإدخال **1**.", + "de": "Geben wir **1** ein.", + "es": "Ingrese **1**.", + "fi": "Kirjoita **1**.", + "it": "Inseriamo **1**.", + "tr": "**1**'i girelim.", + "ja": "**1**を入力しましょう。", + "ko": "**1**을 입력하세요.", + "pl": "Wprowadźmy **1**.", + "pt": "Digite **1**.", + "ru": "Давайте введем **1**.", + "sl": "Vnesimo **1**.", + "sq": "Le të futemi **1**.", + "th": "ใส่ **1**", + "uk": "Введемо **1**.", + "zh": "输入**1**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now our scene variable **Multi** will **increase by 1** every time **$(ball) collects a $(multiplier)**.", + "fr": "Maintenant notre variable de scène **Multi** **augmentera de 1** à chaque fois que $(ball) collecte un $(multiplier).", + "ar": "الآن سيقوم متغير المشهد **Multi** ب**زيادة بمقدار 1** في كل مرة **$(ball) تجمع $(multiplier)**.", + "de": "Jetzt wird unsere Szenevariable **Multi** **um 1 erhöht** jedes Mal, wenn **$(ball) einen $(multiplier) sammelt**.", + "es": "¡Ahora nuestra variable de escena **Multi** **aumentará en 1** cada vez que la $(ball) recolecte un $(multiplier)!", + "fi": "Nyt kohtauksemme muuttuja **Multi** **kasvaa 1:llä** joka kerta, kun **$(ball) kerää $(multiplier)**.", + "it": "Ora la nostra variabile di scena **Multi** **aumenterà di 1** ogni volta che la $(ball) raccoglie un $(multiplier)!", + "tr": "Artık sahne değişkenimiz **Multi** her **$(ball) bir $(multiplier) topladığında 1 artacak**.", + "ja": "今、私たちのシーン変数**Multi**は**$(ball)が$(multiplier)を集めるたびに1ずつ増加**します。", + "ko": "이제 우리의 씬 변수 **Multi**는 **$(ball)이 $(multiplier)을 수집할 때마다 1씩 증가**할 것입니다.", + "pl": "Teraz nasza zmienna sceny **Multi** **zwiększy się o 1** za każdym razem, gdy **$(ball) zbierze $(multiplier)**.", + "pt": "Agora nossa variável de cena **Multi** **aumentará em 1** toda vez que a $(ball) coletar um $(multiplier)!", + "ru": "Теперь наша переменная сцены **Multi** будет **увеличиваться на 1** каждый раз, когда **$(ball) соберет $(multiplier)**.", + "sl": "Zdaj bo naša spremenljivka prizorišča **Multi** **povečana za 1** vsakič, ko **$(ball) zbere $(multiplier)**.", + "sq": "Tani variabla jonë e skenës **Multi** do të **rritet me 1** çdo herë që **$(ball) të mblidhë një $(multiplier)**.", + "th": "ตอนนี้ตัวแปรของเรา **Multi** จะ **เพิ่มขึ้น 1** ทุกครั้งที่ **$(ball) ได้รับ $(multiplier)**", + "uk": "Тепер наша змінна сцени **Multi** буде **збільшуватися на 1** кожен раз, коли **$(ball) зібере $(multiplier)**.", + "zh": "现在我们的场景变量**Multi**将在**$(ball)收集$(multiplier)时每次增加1**。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "[data-active=\"true\"] #event-2-1-actions #add-action-button", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Finally, we need to ensure that the **$(scoreMultiplier)** we've placed on the scene gets updated accordingly!", + "fr": "Enfin, nous devons nous assurer que le **$(scoreMultiplier)** que nous avons placé sur la scène est mis à jour en conséquence !", + "ar": "وأخيرًا وليس آخرًا، نحتاج أن نتحقق أن الـ **$(scoreMultiplier)** التي أدرجناها في المشهد سيتم تحديثها متوافقةً مع المضاعِفات التي تم جمعها!", + "de": "Schließlich müssen wir sicherstellen, dass der **$(scoreMultiplier)**, den wir in der Szene platziert haben, entsprechend aktualisiert wird!", + "es": "¡Finalmente, debemos asegurarnos de que el **$(scoreMultiplier)** que hemos colocado en la escena se actualice en consecuencia!", + "fi": "Lopuksi meidän täytyy varmistaa, että **$(scoreMultiplier)**, jonka olemme sijoittaneet kohtaukseen, päivitetään asianmukaisesti!", + "it": "Infine, dobbiamo assicurarci che il **$(scoreMultiplier)** che abbiamo posizionato nella scena venga aggiornato di conseguenza!", + "tr": "Son olarak, sahneye yerleştirdiğimiz **$(scoreMultiplier)**'in uygun şekilde güncellendiğinden emin olmamız gerekiyor!", + "ja": "最後に、シーンに配置した**$(scoreMultiplier)**が適切に更新されるようにしましょう!", + "ko": "마지막으로, 씬에 배치한 **$(scoreMultiplier)**가 적절하게 업데이트되도록 해야 합니다!", + "pl": "Wreszcie musimy upewnić się, że **$(scoreMultiplier)**, który umieściliśmy na scenie, zostanie odpowiednio zaktualizowany!", + "pt": "Finalmente, precisamos nos certificar de que o **$(scoreMultiplier)** que colocamos na cena seja atualizado de acordo!", + "ru": "Наконец, нам нужно убедиться, что **$(scoreMultiplier)**, который мы разместили на сцене, будет обновлен соответственно!", + "sl": "Nazadnje moramo zagotoviti, da se **$(scoreMultiplier)**, ki smo ga postavili na prizorišče, ustrezno posodobi!", + "sq": "Përfundimisht, duhet të sigurohemi që **$(scoreMultiplier)** që kemi vendosur në skenë të azhurnohet në përputhje!", + "th": "ขั้นสุดท้าย เราต้องการที่จะแน่ใจว่า **$(scoreMultiplier)** ที่เราใส่ใน scene จะต้องอัพเดทอย่างสอดคล้อง!", + "uk": "Нарешті, нам потрібно переконатися, що **$(scoreMultiplier)**, який ми розмістили на сцені, буде відповідно оновлений!", + "zh": "最后,我们需要确保我们放在场景中的**$(scoreMultiplier)**得到相应的更新!" + } + } + } + }, + { + "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Search for **Text**.", + "fr": "Recherchez **Texte**.", + "ar": "البحث عن **نص**.", + "de": "Suchen Sie nach **Text**.", + "es": "Busque **Texto**.", + "fi": "Etsi **Teksti**.", + "it": "Cerca **Testo**.", + "tr": "**Metin** arayın.", + "ja": "**テキスト**を検索します。", + "ko": "**텍스트**를 검색하세요.", + "pl": "Szukaj **Tekst**.", + "pt": "Procure **Texto**.", + "ru": "Ищите **Текст**.", + "sl": "Išči **Besedilo**.", + "sq": "Kërkoni **Tekst**.", + "th": "ค้นหา **Text**", + "uk": "Шукайте **Текст**.", + "zh": "搜索**文本**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will **Modify the text** that we placed on the screen earlier.", + "fr": "Nous allons **Modifier le texte** que nous avons placé à l'écran plus tôt.", + "ar": "سوف نقوم ب**تعديل النص** الذي أدرجناه في الشاشة بالبداية.", + "de": "Wir werden den Text **ändern**, den wir zuvor auf dem Bildschirm platziert haben.", + "es": "Vamos a **Modificar el texto** que colocamos en la pantalla anteriormente.", + "fi": "Muokkaamme **tekstiä**, jonka sijoitimme aiemmin näytölle.", + "it": "Modificheremo il testo che abbiamo posizionato sullo schermo in precedenza.", + "tr": "Önceki ekrana yerleştirdiğimiz metni **değiştireceğiz**.", + "ja": "前の画面に配置した**テキストを変更**します。", + "ko": "이전에 화면에 배치한 **텍스트를 수정**할 것입니다.", + "pl": "Zmodyfikujemy **tekst**, który wcześniej umieściliśmy na ekranie.", + "pt": "Vamos **Modificar o texto** que colocamos na tela anteriormente.", + "ru": "Мы **изменим текст**, который мы ранее разместили на экране.", + "sl": "Spremenili bomo **besedilo**, ki smo ga prej postavili na zaslon.", + "sq": "Do të **Modifikojmë tekstin** që vendosëm më parë në ekran.", + "th": "เราจะ **แก้ไขข้อความ** ที่เราวางไว้ใน scene ก่อนหน้านี้", + "uk": "Ми **змінимо текст**, який ми раніше розмістили на екрані.", + "zh": "我们将**修改**我们之前放在屏幕上的文本。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-0-object-selector", + "nextStepTrigger": { + "valueEquals": "ScoreMultiplier" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the text object **$(scoreMultiplier)**.", + "fr": "Sélectionnez l'objet texte **$(scoreMultiplier)**.", + "ar": "تحديد الكائن النصي **$(scoreMultiplier)**.", + "de": "Wählen Sie das Textobjekt **$(scoreMultiplier)**.", + "es": "Seleccione el objeto de texto **$(scoreMultiplier)**.", + "fi": "Valitse tekstiobjekti **$(scoreMultiplier)**.", + "it": "Seleziona l'oggetto testo **$(scoreMultiplier)**.", + "tr": "Metin nesnesi **$(scoreMultiplier)**'ı seçin.", + "ja": "テキストオブジェクト**$(scoreMultiplier)**を選択します。", + "ko": "텍스트 객체 **$(scoreMultiplier)**를 선택하세요.", + "pl": "Wybierz obiekt tekstowy **$(scoreMultiplier)**.", + "pt": "Selecione o objeto de texto **$(scoreMultiplier)**.", + "ru": "Выберите текстовый объект **$(scoreMultiplier)**.", + "sl": "Izberite besedilni predmet **$(scoreMultiplier)**.", + "sq": "Zgjidh objektin e tekstit **$(scoreMultiplier)**.", + "th": "เลือกวัตถุข้อความ **$(scoreMultiplier)**", + "uk": "Виберіть текстовий об'єкт **$(scoreMultiplier)**.", + "zh": "选择文本对象**$(scoreMultiplier)**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-3-string-field", + "nextStepTrigger": { + "valueEquals": "\"x\"+Multi" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now, we need to ensure the text displayed will show x1, x2, etc... so let's use our variable to do so.\n\nEnter `\"x\"+Multi`.", + "fr": "Maintenant, nous devons nous assurer que le texte affiché affichera x1, x2, etc ... alors utilisons notre variable pour cela.\n\nEntrez `\"x\"+Multi`.", + "ar": "الآن، نحتاج إلى التحقق أن النص المعروض سوف يعرض x2، x1، إلخ... لذلك هيّا نقوم باستخدام متغيرنا للقيام بذلك.\n\nإدخال `\"x\"+Multi`.", + "de": "Jetzt müssen wir sicherstellen, dass der angezeigte Text x1, x2, usw. anzeigt ... also verwenden wir unsere Variable dafür.\n\nGeben Sie `\"x\"+Multi` ein.", + "es": "Ahora, debemos asegurarnos de que el texto que se muestra muestre x1, x2, etc ... así que usemos nuestra variable para ello.\n\nIngrese `\"x\"+Multi`.", + "fi": "Nyt meidän täytyy varmistaa, että näytettävä teksti näyttää x1, x2, jne... joten käytetään muuttujaa siihen.\n\nKirjoita `\"x\"+Multi`.", + "it": "Ora dobbiamo assicurarci che il testo visualizzato mostri x1, x2, ecc... quindi usiamo la nostra variabile per farlo.\n\nInserisci `\"x\"+Multi`.", + "tr": "Şimdi, görüntülenen metnin x1, x2, vb. göstermesini sağlamamız gerekiyor... bu yüzden bunu yapmak için değişkenimizi kullanalım.\n\n`\"x\"+Multi` girin.", + "ja": "今、表示されるテキストがx1、x2、などを表示するようにしましょう。そのために変数を使用しましょう。\n\n`\"x\"+Multi`を入力します。", + "ko": "이제 표시된 텍스트가 x1, x2 등을 표시하도록 해야 합니다. 그래서 변수를 사용해봅시다.\n\n`\"x\"+Multi`를 입력하세요.", + "pl": "Teraz musimy upewnić się, że wyświetlany tekst pokaże x1, x2, itp... więc użyjmy naszej zmiennej do tego.\n\nWprowadź `\"x\"+Multi`.", + "pt": "Agora, precisamos nos certificar de que o texto exibido exiba x1, x2, etc ... então vamos usar nossa variável para isso.\n\nDigite `\"x\"+Multi`.", + "ru": "Теперь нам нужно убедиться, что отображаемый текст будет показывать x1, x2 и т. д. ... поэтому давайте используем нашу переменную для этого.\n\nВведите `\"x\"+Multi`.", + "sl": "Zdaj moramo zagotoviti, da bo prikazano besedilo prikazalo x1, x2, itd ... zato uporabimo našo spremenljivko za to.\n\nVnesite `\"x\"+Multi`.", + "sq": "Tani, duhet të sigurohemi që teksti i shfaqur do të tregojë x1, x2, etj... kështu që le të përdorim variablën tonë për këtë.\n\nFutni `\"x\"+Multi`.", + "th": "ทีนี้เราแน่ใจแล้วว่าข้อความจะแสดง x1, x2, ... ไปเรื่อยๆ ใช้ตัวแปรเพื่อทำเช่นนั้น\n\nใส่ `\"x\"+Multi`", + "uk": "Тепер нам потрібно переконатися, що відображений текст буде показувати x1, x2, і т. д. ... тому давайте використаємо нашу змінну для цього.\n\nВведіть `\"x\"+Multi`.", + "zh": "现在,我们需要确保显示的文本将显示x1、x2等...所以让我们使用我们的变量来做到这一点。\n\n输入`\"x\"+Multi`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Our **$(scoreMultiplier)** will now be updated thanks to the **Multiplier variable** that we converted to a text!", + "fr": "Notre **$(scoreMultiplier)** sera maintenant mis à jour grâce à la **variable Multiplier** que nous avons convertie en texte !", + "ar": "جميل! سيتم تحديث الـ **$(scoreMultiplier)** بفضل **المتغير Multiplier** الذي حولناه إلى نص!", + "de": "Unser **$(scoreMultiplier)** wird jetzt dank der **Multiplikator-Variable**, die wir in einen Text umgewandelt haben, aktualisiert!", + "es": "¡Nuestra **$(scoreMultiplier)** ahora se actualizará gracias a la **variable Multiplicador** que convertimos en texto!", + "fi": "Nyt **$(scoreMultiplier)** päivitetään **Kerroinmuuttujan** ansiosta, jonka muutimme tekstiksi!", + "it": "Il nostro **$(scoreMultiplier)** sarà ora aggiornato grazie alla **variabile Moltiplicatore** che abbiamo convertito in testo!", + "tr": "Artık **Metin** olarak dönüştürdüğümüz **Çarpan değişkeni** sayesinde **$(scoreMultiplier)** güncellenecek!", + "ja": "私たちの**$(scoreMultiplier)**は、**テキストに変換した乗数変数**のおかげで更新されるようになります!", + "ko": "이제 **텍스트로 변환한 배수 변수** 덕분에 **$(scoreMultiplier)**가 업데이트될 것입니다!", + "pl": "Nasze **$(scoreMultiplier)** zostanie teraz zaktualizowane dzięki **zmiennej mnożnika**, którą zamieniliśmy na tekst!", + "pt": "Nosso **$(scoreMultiplier)** agora será atualizado graças à **variável Multiplicador** que convertemos em texto!", + "ru": "Теперь наш **$(scoreMultiplier)** будет обновлен благодаря **переменной Множитель**, которую мы преобразовали в текст!", + "sl": "Naš **$(scoreMultiplier)** bo zdaj posodobljen zahvaljujoč **spremenljivki Množitelj**, ki smo jo pretvorili v besedilo!", + "sq": "Tani **$(scoreMultiplier)** ynë do të azhurnohet falë **variablës Multiplikues** që e kemi konvertuar në një tekst!", + "th": "**$(scoreMultiplier)** ของเราจะอัพเดทได้อย่างที่ควรจะเป็นเพราะว่าเราได้แปลง **ตัวแปร Multiplier** เป็นข้อความ", + "uk": "Тепер наш **$(scoreMultiplier)** буде оновлено завдяки **змінній Множник**, яку ми перетворили в текст!", + "zh": "我们的**$(scoreMultiplier)**现在将会得到更新,这要感谢我们将**乘数变量**转换为文本!" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#event-1-1-action-0", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "This first event manages the logic when the player hits a peg. Let's modify the score action by **double-clicking on it**!", + "fr": "Cet événement gère la logique lorsque le joueur touche un plot. Modifions l'action de score en **double-cliquant dessus** !", + "ar": "هذا أول حدث يدير منطق ضرب اللاعبين للعارضات. هيّا نقوم بتعديل إجراء النتيجة عن طريق **النقر المزدوج عليه**!", + "de": "Dieses erste Ereignis steuert die Logik, wenn der Spieler einen Stift trifft. Lassen Sie uns die Punktzahlaktion **durch Doppelklick darauf** ändern!", + "es": "Este primer evento gestiona la lógica cuando el jugador toca un plot. ¡Modifiquemos la acción de puntuación **dando doble clic en ella**!", + "fi": "Tämä ensimmäinen tapahtuma hallitsee logiikkaa, kun pelaaja osuu nastaan. Muokataan pistetoimintoa **kaksoisnapsauttamalla sitä**!", + "it": "Questo primo evento gestisce la logica quando il giocatore colpisce un piolo. Modifichiamo l'azione del punteggio **facendo doppio clic su di essa**!", + "tr": "Bu ilk olay, oyuncunun bir pimi vurduğunda mantığı yönetir. Skor eylemini **üzerine çift tıklayarak** değiştirelim!", + "ja": "この最初のイベントは、プレイヤーがピンに当たったときのロジックを管理します。**ダブルクリックして**スコアアクションを変更しましょう!", + "ko": "이 첫 번째 이벤트는 플레이어가 핀을 맞출 때의 로직을 관리합니다. **더블 클릭하여** 점수 액션을 수정해봅시다!", + "pl": "To pierwsze wydarzenie zarządza logiką, gdy gracz trafia w kołek. Zmodyfikujmy akcję punktacji **podwójnym kliknięciem**!", + "pt": "Este primeiro evento gerencia a lógica quando o jogador toca um plot. Vamos modificar a ação de pontuação **clicando duas vezes nela**!", + "ru": "Это первое событие управляет логикой, когда игрок попадает в колышек. Давайте изменим действие оценки **двойным щелчком по нему**!", + "sl": "To prvo dogodek upravlja logiko, ko igralec zadene zatič. Spremenimo akcijo rezultata **z dvojnim klikom nanj**!", + "sq": "Ky ngjarje i pari menaxhon logjikën kur lojtari godet një penxhere. Le të modifikojmë veprimin e rezultatit **duke bërë dy herë klik mbi të**!", + "th": "อีเวนท์แรกนี้ จัดการกับโลจิกเมื่อผู้เล่นชนกับเป๊ก มาแก้ไขการกระทำของคะแนนโดย **ดับเบิลคลิก** กันเถอะ!", + "uk": "Це перше подія керує логікою, коли гравець влучає в колодку. Давайте змінимо дію оцінки **подвійним кліком на ньому**!", + "zh": "这个第一个事件管理了玩家击中钉子时的逻辑。让我们**双击**修改分数动作!" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "This first event manages the logic when the player hits a peg. Let's modify the score action by **pressing 2 times on it**!", + "fr": "Cet événement gère la logique lorsque le joueur touche un plot. Modifions l'action de score en **appuyant 2 fois dessus** !", + "ar": "هذا أول حدث يدير منطق ضرب اللاعبين للعارضات. هيّا نقوم بتعديل إجراء النتيجة عن طريق **الضغط عليه مرتين**!", + "de": "Dieses erste Ereignis steuert die Logik, wenn der Spieler einen Stift trifft. Lassen Sie uns die Punktzahlaktion **durch zweimaliges Drücken darauf** ändern!", + "es": "Este primer evento gestiona la lógica cuando el jugador toca un plot. ¡Modifiquemos la acción de puntuación **presionando 2 veces sobre ella**!", + "fi": "Tämä ensimmäinen tapahtuma hallitsee logiikkaa, kun pelaaja osuu nastaan. Muokataan pistetoimintoa **painamalla sitä 2 kertaa**!", + "it": "Questo primo evento gestisce la logica quando il giocatore colpisce un piolo. Modifichiamo l'azione del punteggio **premendo 2 volte su di essa**!", + "tr": "Bu ilk olay, oyuncunun bir pimi vurduğunda mantığı yönetir. Skor eylemini **üzerine 2 kez basarak** değiştirelim!", + "ja": "この最初のイベントは、プレイヤーがピンに当たったときのロジックを管理します。**2回押して**スコアアクションを変更しましょう!", + "ko": "이 첫 번째 이벤트는 플레이어가 핀을 맞출 때의 로직을 관리합니다. **2번 눌러** 점수 액션을 수정해봅시다!", + "pl": "To pierwsze wydarzenie zarządza logiką, gdy gracz trafia w kołek. Zmodyfikujmy akcję punktacji **naciskając na niego 2 razy**!", + "pt": "Este primeiro evento gerencia a lógica quando o jogador toca um plot. Vamos modificar a ação de pontuação **pressionando 2 vezes nela**!", + "ru": "Это первое событие управляет логикой, когда игрок попадает в колышек. Давайте изменим действие оценки **нажав на него 2 раза**!", + "sl": "To prvo dogodek upravlja logiko, ko igralec zadene zatič. Spremenimo akcijo rezultata **s pritiskom nanj 2-krat**!", + "sq": "Ky ngjarje i pari menaxhon logjikën kur lojtari godet një penxhere. Le të modifikojmë veprimin e rezultatit **duke shtypur 2 herë mbi të**!", + "th": "อีเวนท์แรกนี้ จัดการกับโลจิกเมื่อผู้เล่นชนกับเป๊ก มาแก้ไขการกระทำของคะแนนโดย **กด 2 ครั้ง** กันเถอะ!", + "uk": "Це перше подія керує логікою, коли гравець влучає в колодку. Давайте змінимо дію оцінки **натиснувши на нього 2 рази**!", + "zh": "这个第一个事件管理了玩家击中钉子时的逻辑。让我们**按2次**修改分数动作!" + } + } + } + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "1*Multi" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We want to multiply the score added by the multiplier,\n\nlet's enter `1*Multi`.", + "fr": "Nous voulons multiplier le score ajouté par le multiplicateur,\n\nentrons `1*Multi`.", + "ar": "نحن نحتاج إلى مضاعفة النتيجة المضافة عن طريق المضاعِفات،\n\nهيّا نقوم بإدخال `1*Multi`.", + "de": "Wir möchten das hinzugefügte Ergebnis mit dem Multiplikator multiplizieren,\n\ngeben wir `1*Multi` ein.", + "es": "Queremos multiplicar la puntuación agregada por el multiplicador,\n\ningresamos `1*Multi`.", + "fi": "Haluamme kertoa kerroin lisätystä tuloksesta,\n\nkirjoitetaan `1*Multi`.", + "it": "Vogliamo moltiplicare il punteggio aggiunto dal moltiplicatore,\n\ninseriamo `1*Multi`.", + "tr": "Çarpan tarafından eklenen puanı çarpmak istiyoruz,\n\n`1*Multi`'yi girelim.", + "ja": "私たちは乗数によって追加されたスコアを掛けたいので、`1*Multi`を入力します。", + "ko": "우리는 배수에 의해 추가된 점수를 곱하고 싶습니다.\n\n`1*Multi`를 입력하세요.", + "pl": "Chcemy pomnożyć wynik dodany przez mnożnik,\n\nwprowadźmy `1*Multi`.", + "pt": "Queremos multiplicar a pontuação adicionada pelo multiplicador,\n\ndigitar `1*Multi`.", + "ru": "Мы хотим умножить добавленный результат на множитель,\n\nдавайте введем `1*Multi`.", + "sl": "Želimo pomnožiti rezultat, ki ga je dodal množitelj,\n\nvnesimo `1*Multi`.", + "sq": "Ne duam të shumëzojmë rezultatin e shtuar nga multiplikuesi,\n\nle të futim `1*Multi`.", + "th": "เราต้องการคูณคะแนนที่ถูกเพิ่มโดย multiplier \n\nใส่ `1*Multi`", + "uk": "Ми хочемо помножити результат, який додав множник,\n\nвведемо `1*Multi`.", + "zh": "我们想要将乘数添加的分数相乘,\n\n让我们输入`1*Multi`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "This will make our score update according to the multiplier! Let's save.", + "fr": "Cela fera en sorte que notre score se mette à jour en fonction du multiplicateur ! Enregistrons.", + "ar": "هذا سيجعل نتيجتنا تُحدّث وفقًا للمضاعِفات! هيّا نحفظ.", + "de": "Das wird dazu führen, dass unser Ergebnis entsprechend dem Multiplikator aktualisiert wird! Lassen Sie uns speichern.", + "es": "¡Esto hará que nuestra puntuación se actualice de acuerdo con el multiplicador! Guardemos.", + "fi": "Tämä tekee siitä, että pisteemme päivittyy kerrointa vastaavasti! Tallennetaan.", + "it": "Questo farà sì che il nostro punteggio si aggiorni in base al moltiplicatore! Salviamo.", + "tr": "Bu, puanımızın çarpana göre güncellenmesini sağlayacak! Kaydedelim.", + "ja": "これにより、私たちのスコアが乗数に従って更新されるようになります!保存しましょう。", + "ko": "이렇게 하면 우리의 점수가 배수에 따라 업데이트될 것입니다! 저장합시다.", + "pl": "Spowoduje to, że nasz wynik zostanie zaktualizowany zgodnie z mnożnikiem! Zapiszmy.", + "pt": "Isso fará com que nossa pontuação seja atualizada de acordo com o multiplicador! Salve.", + "ru": "Это позволит нашему результату обновляться в соответствии с множителем! Давайте сохранить.", + "sl": "To bo omogočilo, da se naš rezultat posodobi glede na množitelj! Shrani.", + "sq": "Kjo do të bëjë që rezultati ynë të azhurnohet sipas multiplikuesit! Të ruajmë.", + "th": "ทีนี้คะแนนของเราจะอัพเดทได้อย่างสอดคล้องแล้ว! มาบันทึกกันเถอะ", + "uk": "Це зробить наш результат оновленим відповідно до множника! Давайте збережемо.", + "zh": "这将使我们的分数根据乘数更新!让我们保存。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#event-1-3-action-0", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "This event here manages the logic when the player hits a *bigger* peg. Let's modify the score action by **double-clicking on it** again.", + "fr": "Cet événement gère la logique lorsque le joueur touche un plot *plus gros*. Modifions l'action de score en **double-cliquant dessus** à nouveau.", + "ar": "هذا الحدث هنا يدير منطق ضرب اللاعبين للعارضات **الكبيرة**، هيّا نقوم بتعديل إجراء النتيجة عن طريق **النقر المزدوج عليه** مجددًا.", + "de": "Dieses Ereignis hier steuert die Logik, wenn der Spieler einen *größeren* Stift trifft. Lassen Sie uns die Punktzahlaktion **durch Doppelklick darauf** erneut ändern.", + "es": "Este evento gestiona la lógica cuando el jugador toca un plot *más grande*. Modifiquemos la acción de puntuación **dando doble clic en ella** nuevamente.", + "fi": "Tämä tapahtuma hallitsee logiikkaa, kun pelaaja osuu isompaan nastaan. Muokataan pistetoimintoa **kaksoisnapsauttamalla sitä** uudelleen.", + "it": "Questo evento gestisce la logica quando il giocatore colpisce un piolo *più grande*. Modifichiamo l'azione del punteggio **facendo doppio clic su di essa** di nuovo.", + "tr": "Bu olay, oyuncunun bir pimi **daha büyük** vurduğunda mantığı yönetir. Skor eylemini **üzerine çift tıklayarak** tekrar değiştirelim.", + "ja": "このイベントは、プレイヤーが**大きな**ピンに当たったときのロジックを管理します。**ダブルクリックして**スコアアクションを再度変更しましょう。", + "ko": "이 이벤트는 플레이어가 *더 큰* 핀을 맞출 때의 로직을 관리합니다. **더블 클릭하여** 점수 액션을 다시 수정해봅시다.", + "pl": "To wydarzenie zarządza logiką, gdy gracz trafia w **większy** kołek. Zmodyfikujmy akcję punktacji **podwójnym kliknięciem na niej** ponownie.", + "pt": "Este evento gerencia a lógica quando o jogador toca um plot *maior*. Vamos modificar a ação de pontuação **clicando duas vezes nela** novamente.", + "ru": "Это событие здесь управляет логикой, когда игрок попадает в *больший* колышек. Давайте изменим действие оценки **двойным щелчком по нему** снова.", + "sl": "To dogodek tukaj upravlja logiko, ko igralec zadene *večji* zatič. Spremenimo akcijo rezultata **z dvojnim klikom nanj** znova.", + "sq": "Ky ngjarje këtu menaxhon logjikën kur lojtari godet një penxhere *më të madhe*. Le të modifikojmë veprimin e rezultatit **duke bërë dy herë klik mbi të** përsëri.", + "th": "อีเวนท์นี้จัดการกับโลจิกเมื่อผู้เล่นชนกับเป๊ก แก้ไขการกระทำของคะแนนโดย **ดับเบิลคลิก** อีกครั้ง", + "uk": "Це подія тут керує логікою, коли гравець влучає в **більший** колодку. Давайте змінимо дію оцінки **подвійним кліком на ньому** знову.", + "zh": "这个事件管理了玩家击中*更大*的钉子时的逻辑。让我们**双击**再次修改分数动作!" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "This event here manages the logic when the player hits a *bigger* peg. Let's modify the score action by **pressing twice on it**.", + "fr": "Cet événement gère la logique lorsque le joueur touche un plot *plus gros*. Modifions l'action de score en **appyant 2 fois dessus**.", + "ar": "هذا الحدث هنا يدير منطق ضرب اللاعبين للعارضات **الكبيرة**، هيّا نقوم بتعديل إجراء النتيجة عن طريق **الضغط عليه مرتين** مجددًا.", + "de": "Dieses Ereignis hier steuert die Logik, wenn der Spieler einen *größeren* Stift trifft. Lassen Sie uns die Punktzahlaktion **durch zweimaliges Drücken darauf** erneut ändern.", + "es": "Este evento gestiona la lógica cuando el jugador toca un plot *más grande*. Modifiquemos la acción de puntuación **presionando 2 veces sobre ella**.", + "fi": "Tämä tapahtuma hallitsee logiikkaa, kun pelaaja osuu isompaan nastaan. Muokataan pistetoimintoa **painamalla sitä 2 kertaa**.", + "it": "Questo evento gestisce la logica quando il giocatore colpisce un piolo *più grande*. Modifichiamo l'azione del punteggio **premendo 2 volte su di essa**.", + "tr": "Bu olay, oyuncunun bir pimi **daha büyük** vurduğunda mantığı yönetir. Skor eylemini **üzerine 2 kez basarak** tekrar değiştirelim.", + "ja": "このイベントは、プレイヤーが**大きな**ピンに当たったときのロジックを管理します。**2回押して**スコアアクションを再度変更しましょう。", + "ko": "이 이벤트는 플레이어가 *더 큰* 핀을 맞출 때의 로직을 관리합니다. **2번 눌러** 점수 액션을 다시 수정해봅시다.", + "pl": "To wydarzenie zarządza logiką, gdy gracz trafia w **większy** kołek. Zmodyfikujmy akcję punktacji **naciskając na niego 2 razy**.", + "pt": "Este evento gerencia a lógica quando o jogador toca um plot *maior*. Vamos modificar a ação de pontuação **pressionando 2 vezes nela**.", + "ru": "Это событие здесь управляет логикой, когда игрок попадает в *больший* колышек. Давайте изменим действие оценки **нажав на него 2 раза** снова.", + "sl": "To dogodek tukaj upravlja logiko, ko igralec zadene *večji* zatič. Spremenimo akcijo rezultata **s pritiskom nanj 2-krat**.", + "sq": "Ky ngjarje këtu menaxhon logjikën kur lojtari godet një penxhere *më të madhe*. Le të modifikojmë veprimin e rezultatit **duke shtypur 2 herë mbi të**.", + "th": "อีเวนท์นี้จัดการกับโลจิกเมื่อผู้เล่นชนกับเป๊ก แก้ไขการกระทำของคะแนนโดย **กด 2 ครั้ง** กันเถอะ!", + "uk": "Це подія тут керує логікою, коли гравець влучає в **більший** колодку. Давайте змінимо дію оцінки **натиснувши на нього 2 рази**!", + "zh": "这个事件管理了玩家击中*更大*的钉子时的逻辑。让我们**按2次**再次修改分数动作!" + } + } + } + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "2*Multi" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now we'll do exactly the same, except that the score given will be 2,\n\nenter `2 * Multi`.", + "fr": "Nous allons faire exactement la même chose, sauf que le score donné sera 2,\n\nentrons `2 * Multi`.", + "ar": "الآن سوف نقوم بنفس الشيء تمامًا، باستثناء أن النتيجة المعطاة ستكون الضعف،\n\nإدخال `2 * Multi`.", + "de": "Jetzt machen wir genau dasselbe, außer dass der gegebene Wert 2 sein wird,\n\ngeben wir `2 * Multi` ein.", + "es": "Ahora vamos a hacer exactamente lo mismo, excepto que la puntuación dada sera 2,\n\ningresamos `2 * Multi`.", + "fi": "Nyt teemme täsmälleen saman, paitsi että annettu pistemäärä on 2,\n\nkirjoitetaan `2 * Multi`.", + "it": "Ora faremo esattamente la stessa cosa, tranne che il punteggio dato sarà 2,\n\ninseriamo `2 * Multi`.", + "tr": "Şimdi aynısını yapacağız, tek fark verilen puan 2 olacak,\n\n`2 * Multi`'yi girelim.", + "ja": "今度は同じことをしますが、与えられるスコアは2になります。\n\n`2 * Multi`を入力します。", + "ko": "이제 우리는 정확히 같은 일을 할 것입니다. 다만 주어진 점수는 2가 될 것입니다.\n\n`2 * Multi`를 입력하세요.", + "pl": "Teraz zrobimy dokładnie to samo, z tym że wynik wyniesie 2,\n\nwprowadźmy `2 * Multi`.", + "pt": "Hora faremos exatamente a mesma coisa, exceto que a pontuação dada sera 2,\n\ndigitar `2 * Multi`.", + "ru": "Теперь мы сделаем точно то же самое, за исключением того, что данное значение будет 2,\n\nвведем `2 * Multi`.", + "sl": "Zdaj bomo naredili natanko isto, razen da bo dana ocena 2,\n\nvnesimo `2 * Multi`.", + "sq": "Tani do të bëjmë saktësisht të njëjtën gjë, përveç se rezultati i dhënë do të jetë 2,\n\nle të futim `2 * Multi`.", + "th": "เราจะทำเหมือนเดิม ยกเว้นอย่างหนึ่ง คะแนนจะใส่เป็น 2\n\nใส่ `2 * Multi`", + "uk": "Тепер ми зробимо точно те саме, за винятком того, що дане значення буде 2,\n\nвведемо `2 * Multi`.", + "zh": "现在我们将做完全相同的事情,只是给出的分数将是2,\n\n输入`2 * Multi`。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's close this!.", + "fr": "Maintenant, fermons ceci !", + "ar": "الآن هيّا نغلق هذا.", + "de": "Lassen Sie uns das jetzt schließen!", + "es": "¡Ahora cerramos esto!", + "fi": "Nyt suljetaan tämä!", + "it": "Ora chiudiamo questo!", + "tr": "Şimdi bunu kapatalım!", + "ja": "さて、これで閉じましょう!", + "ko": "이제 이것을 닫아봅시다!", + "pl": "Teraz zamykamy to!", + "pt": "Agora vamos fechar isso!", + "ru": "Теперь давайте закроем это!", + "sl": "Sedaj zaprimo to!", + "sq": "Tani le të mbyllim këtë!", + "th": "ปิดหน้าต่างได้เลย!", + "uk": "Тепер давайте закриємо це!", + "zh": "现在让我们关闭这个!" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + "fr": "Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.", + "ar": "حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.", + "de": "Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.", + "fi": "Olemme valmiita! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.", + "it": "abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.", + "tr": "Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.", + "ja": "完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。", + "ko": "우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.", + "pl": "Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.", + "pt": "Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.", + "ru": "Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.", + "sl": "Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。" + } + }, + "placement": "bottom" + } + } + ] +} diff --git a/tutorials/in-app/tilemapPlatformer.json b/tutorials/in-app/tilemapPlatformer.json new file mode 100644 index 0000000..c244142 --- /dev/null +++ b/tutorials/in-app/tilemapPlatformer.json @@ -0,0 +1,1165 @@ +{ + "id": "tilemapPlatformer", + "titleByLocale": { + "en": "Let's see how to use the Tilemap object.", + "fr": "Voyons comment utiliser l'objet Tilemap.", + "ar": "لنرى كيفية استخدام كائن Tilemap.", + "de": "Sehen wir uns an, wie man das Tilemap-Objekt verwendet.", + "es": "Veamos cómo usar el objeto Tilemap.", + "fi": "Katsotaan, miten käytetään Tilemap-objektia.", + "it": "Vediamo come usare l'oggetto Tilemap.", + "tr": "Tilemap nesnesini nasıl kullanacağımızı görelim.", + "ja": "タイルマップオブジェクトの使い方を見てみましょう。", + "ko": "타일맵 객체를 사용하는 방법을 살펴보겠습니다.", + "pl": "Zobaczmy, jak używać obiektu Tilemap.", + "pt": "Vamos ver como usar o objeto Tilemap.", + "ru": "Посмотрим, как использовать объект Tilemap.", + "sl": "Poglejmo, kako uporabiti objekt Tilemap.", + "sq": "Le të shohim se si të përdorim objektin Tilemap.", + "th": "มาดูวิธีใช้วัตถุแผนที่ไทล์กัน", + "uk": "Подивімося, як використовувати об'єкт Tilemap.", + "zh": "让我们看看如何使用 Tilemap 对象。" + }, + "bulletPointsByLocale": [ + { + "en": "Use and edit a Tilemap object.", + "fr": "Utiliser et modifier un objet Tilemap.", + "ar": "استخدام وتحرير كائن Tilemap.", + "de": "Verwenden und Bearbeiten eines Tilemap-Objekts.", + "es": "Usar y editar un objeto Tilemap.", + "fi": "Käytä ja muokkaa Tilemap-objektia.", + "it": "Utilizzare e modificare un oggetto Tilemap.", + "tr": "Tilemap nesnesini kullanın ve düzenleyin.", + "ja": "タイルマップオブジェクトを使用して編集します。", + "ko": "타일맵 객체를 사용하고 편집합니다.", + "pl": "Używanie i edytowanie obiektu Tilemap.", + "pt": "Usar e editar um objeto Tilemap.", + "ru": "Использовать и редактировать объект Tilemap.", + "sl": "Uporaba in urejanje objekta Tilemap.", + "sq": "Përdorni dhe modifikoni një objekt Tilemap.", + "th": "ใช้และแก้ไขวัตถุแผนที่ไทล์", + "uk": "Використовувати та редагувати об'єкт Tilemap.", + "zh": "使用和编辑 Tilemap 对象。" + }, + { + "en": "Add collisions to the Tilemap.", + "fr": "Ajouter des collisions à la Tilemap.", + "ar": "إضافة التصادمات إلى كائن Tilemap.", + "de": "Fügen Sie der Tilemap Kollisionen hinzu.", + "es": "Añadir colisiones al Tilemap.", + "fi": "Lisää törmäykset Tilemapiin.", + "it": "Aggiungi collisioni alla Tilemap.", + "tr": "Tilemap'e çarpışmalar ekleyin.", + "ja": "タイルマップに衝突を追加します。", + "ko": "타일맵에 충돌을 추가합니다.", + "pl": "Dodaj kolizje do Tilemap.", + "pt": "Adicionar colisões ao Tilemap.", + "ru": "Добавить столкновения к Tilemap.", + "sl": "Dodajte trke na Tilemap.", + "sq": "Shtoni përplasjet në Tilemap.", + "th": "เพิ่มการชนกันในแผนที่ไทล์", + "uk": "Додайте зіткнення до Tilemap.", + "zh": "向 Tilemap 添加碰撞。" + }, + { + "en": "Use the events to edit the tilemap in real time.", + "fr": "Utilisez les événements pour modifier la Tilemap en temps réel.", + "ar": "استخدم الأحداث لتحرير كائن Tilemap في الوقت الفعلي.", + "de": "Verwenden Sie die Ereignisse, um die Tilemap in Echtzeit zu bearbeiten.", + "es": "Usa los eventos para editar el Tilemap en tiempo real.", + "fi": "Käytä tapahtumia muokataksesi Tilemapia reaaliajassa.", + "it": "Usa gli eventi per modificare la Tilemap in tempo reale.", + "tr": "Olayları kullanarak Tilemap'i gerçek zamanlı olarak düzenleyin.", + "ja": "イベントを使用してタイルマップをリアルタイムで編集します。", + "ko": "이벤트를 사용하여 타일맵을 실시간으로 편집합니다.", + "pl": "Użyj zdarzeń do edycji Tilemap w czasie rzeczywistym.", + "pt": "Use os eventos para editar o Tilemap em tempo real.", + "ru": "Используйте события для редактирования Tilemap в реальном времени.", + "sl": "Uporabite dogodke za urejanje Tilemap v realnem času.", + "sq": "Përdorni ngjarjet për të modifikuar Tilemap në kohë reale.", + "th": "ใช้เหตุการณ์เพื่อแก้ไขแผนที่ไทล์แบบเรียลไทม์", + "uk": "Використовуйте події для редагування Tilemap у реальному часі.", + "zh": "使用事件实时编辑 Tilemap。" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "gameScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "gameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "ru", + "sl", + "sq", + "th", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/tilemapPlatformer/game.json", + "initialProjectData": { + "player": "Slime", + "tilemap": "Tilemap", + "gameScene": "GameScene" + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "In this tutorial, we'll complete the game by editing the terrain and removing the apple from the tree when the Slime is on it.\n\nBut first, launch the game to see the current game state and what we'll need to do next.\n\nClick the **Preview** button to play.", + "fr": "Dans ce tutoriel, nous allons terminer le jeu en modifiant le terrain et en retirant la pomme de l'arbre lorsque le Slime est dessus.\n\nMais d'abord, lancez le jeu pour voir l'état actuel du jeu et ce que nous devrons faire ensuite.\n\nCliquez sur le bouton **Aperçu** pour jouer.", + "ar": "في هذا البرنامج التعليمي، سنكمل اللعبة من خلال تعديل التضاريس وإزالة التفاحة من الشجرة عندما يكون السلايم عليها.\n\nولكن أولاً، قم بتشغيل اللعبة لرؤية حالة اللعبة الحالية وما سنحتاج إلى القيام به بعد ذلك.\n\nاضغط على زر **معاينة** للعب.", + "de": "In diesem Tutorial werden wir das Spiel abschließen, indem wir das Terrain bearbeiten und den Apfel vom Baum entfernen, wenn der Schleim darauf ist.\n\nAber zuerst starten Sie das Spiel, um den aktuellen Spielstatus zu sehen und was wir als Nächstes tun müssen.\n\nKlicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.", + "es": "En este tutorial, completaremos el juego editando el terreno y quitando la manzana del árbol cuando el Slime esté sobre él.\n\nPero primero, inicie el juego para ver el estado actual del juego y lo que necesitaremos hacer a continuación.\n\nHaga clic en el botón **Vista previa** para jugar.", + "fi": "Tässä opetusohjelmassa viimeistelemme pelin muokkaamalla maastoa ja poistamalla omenan puusta, kun Slime on siinä.\n\nMutta ensin käynnistä peli nähdäksesi nykyisen pelitilanteen ja mitä meidän on tehtävä seuraavaksi.\n\nNapsauta **Esikatselu**-painiketta pelataksesi.", + "it": "In questo tutorial, completeremo il gioco modificando il terreno e rimuovendo la mela dall'albero quando lo Slime è su di esso.\n\nMa prima, avvia il gioco per vedere lo stato attuale del gioco e cosa dovremo fare dopo.\n\nFai clic sul pulsante **Anteprima** per giocare.", + "tr": "Bu öğreticide, Slime ağacın üzerindeyken araziyi düzenleyerek ve ağaçtan elmayı kaldırarak oyunu tamamlayacağız.\n\nAncak önce, mevcut oyun durumunu görmek ve ne yapmamız gerektiğini görmek için oyunu başlatın.\n\nOynamak için **Önizleme** düğmesine tıklayın.", + "ja": "このチュートリアルでは、スライムが木の上にいるときに地形を編集して、木からリンゴを取り除くことでゲームを完成させます。\n\nしかしまず、ゲームを起動して現在のゲーム状態と次に何をする必要があるかを確認してください。\n\n**プレビュー**ボタンをクリックしてプレイします。", + "ko": "이 튜토리얼에서는 슬라임이 나무 위에 있을 때 지형을 수정하고 나무에서 사과를 제거하여 게임을 완성합니다.\n\n하지만 먼저 게임을 시작하여 현재 게임 상태와 다음에 해야 할 일을 확인하세요.\n\n플레이하려면 **미리보기** 버튼을 클릭하세요.", + "pl": "W tym samouczku ukończymy grę, edytując teren i usuwając jabłko z drzewa, gdy Slime będzie na nim.\n\nAle najpierw uruchom grę, aby zobaczyć aktualny stan gry i co będziemy musieli zrobić dalej.\n\nKliknij przycisk **Podgląd**, aby grać.", + "pt": "Neste tutorial, vamos completar o jogo editando o terreno e removendo a maçã da árvore quando o Slime estiver nela.\n\nMas primeiro, inicie o jogo para ver o estado atual do jogo e o que precisaremos fazer a seguir.\n\nClique no botão **Pré-visualizar** para jogar.", + "ru": "В этом уроке мы завершим игру, редактируя местность и убирая яблоко с дерева, когда Слизень находится на нем.\n\nНо сначала запустите игру, чтобы увидеть текущее состояние игры и что нам нужно будет сделать дальше.\n\nНажмите кнопку **Предпросмотр**, чтобы играть.", + "sl": "V tem priročniku bomo zaključili igro tako, da bomo uredili teren in odstranili jabolko z drevesa, ko bo Slime na njem.\n\nAmpak najprej zaženite igro, da vidite trenutno stanje igre in kaj bomo morali narediti naprej.\n\nKliknite gumb **Predogled**, da igrate.", + "sq": "Në këtë tutorial, do të përfundojmë lojën duke redaktuar terrenin dhe duke hequr mollën nga pema kur Slime është mbi të.\n\nPor së pari, filloni lojën për të parë gjendjen aktuale të lojës dhe atë që do të na duhet të bëjmë më pas.\n\nKlikoni butonin **Parashikim** për të luajtur.", + "th": "ในบทช่วยสอนนี้ เราจะทำเกมให้เสร็จโดยการแก้ไขภูมิประเทศและเอาแอปเปิ้ลออกจากต้นไม้เมื่อ Slime อยู่บนต้นไม้\n\nแต่ก่อนอื่น ให้เริ่มเกมเพื่อดูสถานะปัจจุบันของเกมและสิ่งที่เราจะต้องทำถัดไป\n\nคลิกปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "uk": "У цьому уроці ми завершимо гру, редагуючи рельєф і видаляючи яблуко з дерева, коли Слизень на ньому.\n\nАле спочатку запустіть гру, щоб побачити поточний стан гри та що нам потрібно буде зробити далі.\n\nНатисніть кнопку **Попередній перегляд**, щоб грати.", + "zh": "在本教程中,我们将通过编辑地形和在史莱姆在上面时从树上移除苹果来完成游戏。\n\n但首先,启动游戏以查看当前的游戏状态以及我们接下来需要做的事情。\n\n点击 **预览** 按钮开始游戏。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "bottom-right", + "inGameMessage": { + "messageByLocale": { + "en": "The **$(player)** cannot jump over the pit!\nWe have to edit the terrain to add a bridge. Let's fix this!\nClose this window and go back to the editor.", + "fr": "Le **$(player)** ne peut pas sauter par-dessus le fossé !\nNous devons modifier le terrain pour ajouter un pont. Réparons ça !\nFermez cette fenêtre et retournez à l’éditeur.", + "ar": "لا يمكن لـ **$(player)** القفز فوق الحفرة!\nعلينا تعديل التضاريس لإضافة جسر. لنصلح هذا!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Der **$(player)** kann nicht über die Grube springen!\nWir müssen das Terrain bearbeiten, um eine Brücke hinzuzufügen. Lassen Sie uns das beheben!\nSchließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "¡El **$(player)** no puede saltar sobre la trinchera!\nTenemos que editar el terreno para agregar un puente. ¡Vamos a arreglarlo!\nCierra esta ventana y vuelve al editor.", + "fi": "**$(player)** ei voi hypätä kuopan yli!\nMeidän täytyy muokata maastoa lisätäksemme sillan. Korjataan tämä!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Il **$(player)** non può saltare oltre il fossato!\nDobbiamo modificare il terreno per aggiungere un ponte. Sistemiamolo!\nChiudi questa finestra e torna all'editor.", + "tr": "**$(player)** hendek üzerinden atlayamaz!\nKöprü eklemek için araziyi düzenlememiz gerekiyor. Hadi bunu düzeltelim!\nBu pencereyi kapatın ve editöre geri dönün.", + "ja": "**$(player)**は穴を飛び越えることができません!\n橋を追加するために地形を編集する必要があります。修正しましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "**$(player)**는 구덩이를 넘을 수 없습니다!\n다리를 추가하기 위해 지형을 수정해야 합니다. 고쳐봅시다!\n이 창을 닫고 편집기로 돌아가세요。", + "pl": "**$(player)** nie może przeskoczyć przez dół!\nMusimy edytować teren, aby dodać most. Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "O **$(player)** não pode pular sobre a cova!\nPrecisamos editar o terreno para adicionar uma ponte. Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "ru": "**$(player)** не может перепрыгнуть через яму!\nНам нужно отредактировать местность, чтобы добавить мост. Давайте это исправим!\nЗакройте это окно и вернитесь в редактор.", + "sl": "**$(player)** ne more skočiti čez jamo!\nUrediti moramo teren, da dodamo most. Popravimo to!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "**$(player)** nuk mund të saltojë mbi gropën!\nDuhet të redaktojmë terrenin për të shtuar një urë. Le ta rregullojmë këtë!\nMbyllni këtë dritare dhe kthehuni te redaktori.", + "th": "**$(player)** ไม่สามารถกระโดดข้ามหลุมได้!\nเราต้องแก้ไขภูมิประเทศเพื่อเพิ่มสะพาน มาแก้ไขกันเถอะ!\nปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "uk": "**$(player)** не може стрибати через яму!\nНам потрібно редагувати рельєф, щоб додати міст. Давайте це виправимо!\nЗакрийте це вікно та поверніться до редактора.", + "zh": "**$(player)**无法跳过坑!\n我们必须编辑地形以添加桥梁。让我们修复它!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-properties-panel-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **instance** properties panel. And click the terrain in the scene.", + "fr": "Ouvrez le panneau des propriétés de l'**instance** et sélectionnez l'instance de $(tilemap) dans la scène.", + "ar": "افتح لوحة خصائص **النسخة** وحدد النسخة من $(tilemap) في المشهد.", + "de": "Öffnen Sie das Eigenschaftenfeld der **Instanz** und wählen Sie die Instanz von $(tilemap) in der Szene aus.", + "es": "Abre el panel de propiedades de la **instancia** y selecciona la instancia de $(tilemap) en la escena.", + "fi": "Avaa **instanssin** ominaisuudet ja valitse $(tilemap) instanssi kohtauksessa.", + "it": "Apri il pannello delle proprietà dell'**istanza** e seleziona l'istanza di $(tilemap) nella scena.", + "tr": "**Örnek** özellikler panelini açın ve sahnede $(tilemap) örneğini seçin.", + "ja": "**インスタンス**のプロパティパネルを開き、シーン内の$(tilemap)のインスタンスを選択します。", + "ko": "**인스턴스** 속성 패널을 열고 장면에서 $(tilemap)의 인스턴스를 선택합니다.", + "pl": "Otwórz panel właściwości **instancji** i wybierz instancję $(tilemap) w scenie.", + "pt": "Abra o painel de propriedades da **instância** e selecione a instância de $(tilemap) na cena.", + "ru": "Откройте панель свойств **экземпляра** и выберите экземпляр $(tilemap) на сцене.", + "sl": "Odprite ploščo lastnosti **instance** in izberite instanco $(tilemap) v prizoru.", + "sq": "Hapni panelin e pronave të **instancës** dhe zgjidhni instancën e $(tilemap) në skenë.", + "th": "เปิดแผงคุณสมบัติของ **อินสแตนซ์** และเลือกอินสแตนซ์ของ $(tilemap) ในฉาก", + "uk": "Відкрийте панель властивостей **екземпляра** та виберіть екземпляр $(tilemap) на сцені.", + "zh": "打开 **实例** 属性面板,并选择场景中的 $(tilemap) 实例。" + } + } + }, + "nextStepTrigger": { + "presenceOfElement": "#paintBrush" + }, + "skippable": true, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "#paintBrush", + "disableBlockingLayer": true, + "tooltip": { + "description": { + "messageByLocale": { + "en": "In the panel, you can see the **paint brush tool**; this tool is used to paint tiles on the terrain.\nClick on it, then click on the bridge, just above the red apple.", + "fr": "Dans le panneau, vous pouvez voir l'**outil pinceau** ; cet outil est utilisé pour peindre des tuiles sur le terrain.\nCliquez dessus, puis cliquez sur le pont, juste au-dessus de la pomme rouge.", + "ar": "في اللوحة، يمكنك رؤية **أداة فرشاة الطلاء**؛ تُستخدم هذه الأداة لرسم البلاط على التضاريس.\nانقر عليها، ثم انقر على الجسر، مباشرة فوق التفاحة الحمراء.", + "de": "Im Panel sehen Sie das **Pinselwerkzeug**; dieses Werkzeug wird verwendet, um Fliesen auf dem Gelände zu malen.\nKlicken Sie darauf und klicken Sie dann auf die Brücke, direkt über dem roten Apfel.", + "es": "En el panel, puedes ver la **herramienta de pincel**; esta herramienta se utiliza para pintar azulejos en el terreno.\nHaz clic en ella, luego haz clic en el puente, justo encima de la manzana roja.", + "fi": "Paneelissa voit nähdä **maalausharjan työkalun**; tätä työkalua käytetään maalaamaan laattoja maastoon.\nKlikkaa sitä ja sitten klikkaa siltaa, juuri punaisen omenan yläpuolella.", + "it": "Nel pannello, puoi vedere lo **strumento pennello**; questo strumento viene utilizzato per dipingere le piastrelle sul terreno.\nClicca su di esso, quindi clicca sul ponte, proprio sopra la mela rossa.", + "tr": "Panoda **boya fırçası aracını** görebilirsiniz; bu araç, arazide kiremitleri boyamak için kullanılır.\nÜzerine tıklayın ve ardından kırmızı elmanın hemen üstündeki köprüye tıklayın.", + "ja": "パネルには**ペイントブラシツール**が表示されます。このツールは地形にタイルを描くために使用されます。\nそれをクリックして、赤いリンゴのすぐ上の橋をクリックします。", + "ko": "패널에서 **페인트 브러시 도구**를 볼 수 있습니다. 이 도구는 지형에 타일을 그리는 데 사용됩니다.\n클릭한 다음 빨간 사과 바로 위의 다리를 클릭하세요.", + "pl": "W panelu możesz zobaczyć **narzędzie pędzla**; narzędzie to służy do malowania kafelków na terenie.\nKliknij na nie, a następnie kliknij na most, tuż nad czerwonym jabłkiem.", + "pt": "No painel, você pode ver a **ferramenta de pincel**; esta ferramenta é usada para pintar azulejos no terreno.\nClique nele e, em seguida, clique na ponte, logo acima da maçã vermelha.", + "ru": "В панели вы можете увидеть **инструмент кисти**; этот инструмент используется для рисования плиток на местности.\nНажмите на него, а затем нажмите на мост, прямо над красным яблоком.", + "sl": "V plošči lahko vidite **orodje za slikanje**; to orodje se uporablja za slikanje ploščic na terenu.\nKliknite nanj in nato kliknite na most, tik nad rdečim jabolkom.", + "sq": "Në panel, mund të shihni **mjetin e furçës së bojës**; ky mjet përdoret për të bojë kafshët në terren.\nKliko mbi të, pastaj kliko mbi urën, menjëherë mbi mollën e kuqe.", + "th": "ในแผงคุณสมบัติคุณสามารถเห็น **เครื่องมือพู่กัน**; เครื่องมือนี้ใช้สำหรับการวาดกระเบื้องบนภูมิประเทศ\nคลิกที่นั้น แล้วคลิกที่สะพาน ที่อยู่เหนือแอปเปิลสีแดง", + "uk": "У панелі ви можете побачити **інструмент кисті**; цей інструмент використовується для малювання плиток на місцевості.\nКлацніть на нього, а потім клацніть на міст, безпосередньо над червоною яблуко.", + "zh": "在面板中,您可以看到**画笔工具**;此工具用于在地形上绘制瓷砖。\n点击它,然后点击桥,就在红苹果上方。" + } + }, + "placement": "top" + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "The bridge is selected. What's next?", + "fr": "Le pont est sélectionné. Quelle est la suite ?", + "ar": "تم تحديد الجسر. ماذا بعد؟", + "de": "Die Brücke ist ausgewählt. Was kommt als Nächstes?", + "es": "El puente está seleccionado. ¿Cuál es el siguiente paso?", + "fi": "Silta on valittu. Mitä seuraavaksi?", + "it": "Il ponte è selezionato. Qual è il prossimo passo?", + "tr": "Köprü seçildi. Sıradaki ne?", + "ja": "橋が選択されました。次は何ですか?", + "ko": "다리가 선택되었습니다. 다음은 무엇인가요?", + "pl": "Most jest wybrany. Co dalej?", + "pt": "A ponte está selecionada. Qual é o próximo passo?", + "ru": "Мост выбран. Что дальше?", + "sl": "Most je izbran. Kaj je naslednje?", + "sq": "Ura është zgjedhur. Çfarë vjen pas?", + "th": "สะพานถูกเลือกแล้ว ถัดไปคืออะไร?", + "uk": "Міст обрано. Що далі?", + "zh": "桥已被选中。接下来是什么?" + } + } + } + }, + { + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "Now that you have the paint tool active and have selected the bridge tile, you can paint the bridge on the terrain to fill the gap over the pit.", + "fr": "Maintenant que vous avez l'outil de peinture actif et que vous avez sélectionné la tuile de pont, vous pouvez peindre le pont sur le terrain pour combler le trou au-dessus du fossé.", + "ar": "الآن بعد أن أصبح لديك أداة الطلاء نشطة وقمت بتحديد بلاطة الجسر، يمكنك طلاء الجسر على التضاريس لملء الفجوة فوق الحفرة.", + "de": "Jetzt, da Sie das Malwerkzeug aktiv haben und die Brückenfliese ausgewählt haben, können Sie die Brücke auf das Gelände malen, um die Lücke über der Grube zu füllen.", + "es": "Ahora que tienes la herramienta de pintura activa y has seleccionado la losa del puente, puedes pintar el puente en el terreno para llenar el hueco sobre la trinchera.", + "fi": "Nyt kun sinulla on maalaustyökalu aktiivisena ja olet valinnut sillan laatan, voit maalata sillan maastoon täyttääksesi kuopan yli.", + "it": "Ora che hai attivo lo strumento pennello e hai selezionato la piastrella del ponte, puoi dipingere il ponte sul terreno per riempire il vuoto sopra il fossato.", + "tr": "Şimdi boya aracını etkinleştirdiniz ve köprü kiremitini seçtiniz, hendek üzerindeki boşluğu doldurmak için köprüyü araziye boyayabilirsiniz.", + "ja": "塗りツールがアクティブになり、橋のタイルが選択されているので、地形に橋を描いて穴を埋めることができます。", + "ko": "이제 페인트 도구가 활성화되고 다리 타일이 선택되었으므로, 지형에 다리를 그려 구덩이 위의 빈 공간을 채울 수 있습니다.", + "pl": "Teraz, gdy masz aktywne narzędzie do malowania i wybraną płytkę mostu, możesz namalować most na terenie, aby wypełnić lukę nad dołem.", + "pt": "Agora que você tem a ferramenta de pintura ativa e selecionou a telha da ponte, você pode pintar a ponte no terreno para preencher a lacuna sobre o buraco.", + "ru": "Теперь, когда у вас активен инструмент рисования и выбрана плитка моста, вы можете нарисовать мост на местности, чтобы заполнить промежуток над ямой.", + "sl": "Zdajati zdaj, ko imate aktivno orodje za slikanje in ste izbrali ploščico mostu, lahko most naslikate na terenu, da zapolnite praznino nad jamo.", + "sq": "Tani që keni aktivizuar instrumentin e bojës dhe keni zgjedhur pllakat e urës, mund të pikturoni urën në terren për të mbushur hapësirën mbi gropën.", + "th": "ตอนนี้คุณมีเครื่องมือทาสีที่เปิดใช้งานและได้เลือกกระเบื้องสะพานแล้ว คุณสามารถทาสะพานบนภูมิประเทศเพื่อเติมช่องว่างเหนือหลุมได้", + "uk": "Тепер, коли у вас активний інструмент малювання і вибрано плитку мосту, ви можете намалювати міст на рельєфі, щоб заповнити прогалину над ямою.", + "zh": "现在您已激活绘图工具并选择了桥块,可以在地形上绘制桥以填补坑上的空隙。" + } + } + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Next", + "fr": "Suivant", + "ar": "التالي", + "de": "Weiter", + "es": "Siguiente", + "fi": "Seuraava", + "it": "Prossimo", + "tr": "Sonraki", + "ja": "次", + "ko": "다음", + "pl": "Dalej", + "pt": "Próximo", + "ru": "Далее", + "sl": "Naslednji", + "sq": "Tjetër", + "th": "ถัดไป", + "uk": "Далі", + "zh": "下一步" + } + } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now that you've painted the bridge, you can launch the preview to see the state of the game. We've probably missed something, so let's run the game and see what happens.", + "fr": "Maintenant que vous avez peint le pont, vous pouvez lancer l'aperçu pour voir l'état du jeu. Nous avons probablement oublié quelque chose, alors lançons le jeu et voyons ce qui se passe.", + "ar": "الآن بعد أن قمتَ بطلاء الجسر، يمكنك تشغيل المعاينة لرؤية حالة اللعبة. من المحتمل أننا قد فاتنا شيء ما، لذا دعونا نشغل اللعبة ونرى ما سيحدث.", + "de": "Jetzt, da Sie die Brücke bemalt haben, können Sie die Vorschau starten, um den Zustand des Spiels zu sehen. Wahrscheinlich haben wir etwas übersehen, also lassen Sie uns das Spiel starten und sehen, was passiert.", + "es": "Ahora que has pintado el puente, puedes lanzar la vista previa para ver el estado del juego. Probablemente hayamos pasado algo por alto, así que ejecutemos el juego y veamos qué sucede.", + "fi": "Nyt kun olet maalannut sillan, voit käynnistää esikatselun nähdäksesi pelin tilan. Olemme luultavasti unohtaneet jotain, joten käynnistetään peli ja katsotaan, mitä tapahtuu.", + "it": "Ora che hai dipinto il ponte, puoi avviare l'anteprima per vedere lo stato del gioco. Probabilmente ci siamo persi qualcosa, quindi avviamo il gioco e vediamo cosa succede.", + "tr": "Köprüyü boyadıktan sonra, oyunun durumunu görmek için önizlemeyi başlatabilirsiniz. Muhtemelen bir şeyi gözden kaçırdık, bu yüzden oyunu çalıştıralım ve ne olacağını görelim.", + "ja": "橋を塗り終えたので、プレビューを起動してゲームの状態を確認できます。おそらく何かを見落としているかもしれません。ゲームを実行して何が起こるか見てみましょう。", + "ko": "이제 다리를 칠했으니 미리보기를 실행하여 게임 상태를 확인할 수 있습니다. 아마도 놓친 것이 있을 수 있으니 게임을 실행하여 확인해 봅시다.", + "pl": "Teraz, gdy pomalowałeś most, możesz uruchomić podgląd, aby zobaczyć stan gry. Prawdopodobnie coś przeoczyliśmy, więc uruchommy grę i zobaczmy, co się stanie.", + "pt": "Agora que você pintou a ponte, pode iniciar a pré-visualização para ver o estado do jogo. Provavelmente esquecemos de algo, então vamos rodar o jogo e ver o que acontece.", + "ru": "Теперь, когда вы покрасили мост, вы можете запустить предварительный просмотр, чтобы увидеть состояние игры. Вероятно, мы что-то упустили, так что давайте запустим игру и посмотрим, что произойдет.", + "sl": "Zdaj, ko ste pobarvali most, lahko zaženete predogled, da vidite stanje igre. Verjetno smo kaj spregledali, zato zaženimo igro in poglejmo, kaj se zgodi.", + "sq": "Tani që keni lyer urën, mund të nisni parapamjen për të parë gjendjen e lojës. Me siguri kemi harruar diçka, ndaj le të ekzekutojmë lojën dhe të shohim çfarë ndodh.", + "th": "ตอนนี้คุณได้ทาสะพานเสร็จแล้ว คุณสามารถเปิดดูตัวอย่างเพื่อดูสถานะของเกม เราอาจพลาดอะไรบางอย่างไป ลองรันเกมดูว่าเกิดอะไรขึ้น", + "uk": "Тепер, коли ви пофарбували міст, можете запустити попередній перегляд, щоб побачити стан гри. Можливо, ми щось пропустили, тож давайте запустимо гру і подивимося, що станеться.", + "zh": "现在你已经涂好桥了,可以启动预览来查看游戏的状态。我们可能遗漏了一些东西,所以让我们运行游戏看看会发生什么。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "bottom-right", + "inGameMessage": { + "messageByLocale": { + "en": "Oh the **$(player)** can pass through the bridge. Let's see how to add a collision to it. Let's fix this!\nClose this window and go back to the editor.", + "fr": "Oh, le **$(player)** peut traverser le pont. Voyons comment y ajouter une collision. Réparons ça !\nFermez cette fenêtre et retournez à l’éditeur.", + "ar": "أوه، يمكن لـ **$(player)** المرور عبر الجسر. دعونا نرى كيف نضيف له تصادمًا. لنصلح هذا!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Oh, der **$(player)** kann durch die Brücke gehen. Schauen wir uns an, wie wir eine Kollision hinzufügen können. Lassen Sie uns das beheben!\nSchließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "Oh, el **$(player)** puede atravesar el puente. Veamos cómo añadirle una colisión. ¡Vamos a arreglarlo!\nCierra esta ventana y vuelve al editor.", + "fi": "Oho, **$(player)** voi kulkea sillan läpi. Katsotaan, kuinka voimme lisätä törmäyksen. Korjataan tämä!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Oh, il **$(player)** può attraversare il ponte. Vediamo come aggiungere una collisione. Sistemiamolo!\nChiudi questa finestra e torna all'editor.", + "tr": "Ah, **$(player)** köprünün içinden geçebiliyor. Ona nasıl çarpışma ekleyeceğimizi görelim. Hadi bunu düzeltelim!\nBu pencereyi kapatın ve editöre geri dönün.", + "ja": "あれ?**$(player)**が橋をすり抜けてしまう!\n衝突判定を追加する方法を見てみましょう。修正しましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "어, **$(player)**가 다리를 통과할 수 있습니다! 충돌을 추가하는 방법을 살펴봅시다. 고쳐봅시다!\n이 창을 닫고 편집기로 돌아가세요。", + "pl": "Ojej, **$(player)** może przejść przez most. Zobaczmy, jak dodać kolizję. Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "Oh, o **$(player)** pode atravessar a ponte. Vamos ver como adicionar uma colisão. Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "ru": "Ой, **$(player)** может пройти сквозь мост! Давайте посмотрим, как добавить столкновение. Давайте это исправим!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Oh, **$(player)** lahko gre skozi most. Poglejmo, kako dodati trk. Popravimo to!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Oh, **$(player)** mund të kalojë përmes urës. Le të shohim si të shtojmë një përplasje. Le ta rregullojmë këtë!\nMbyllni këtë dritare dhe kthehuni te redaktori.", + "th": "โอ้ **$(player)** สามารถเดินผ่านสะพานได้! มาดูกันว่าทำอย่างไรจึงจะเพิ่มการชนได้ มาแก้ไขกันเถอะ!\nปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "uk": "Ой, **$(player)** може проходити крізь міст! Давайте подивимося, як додати зіткнення. Давайте це виправимо!\nЗакрийте це вікно та поверніться до редактора.", + "zh": "哦,**$(player)** 可以穿过桥!我们来看看如何给它添加碰撞。让我们修复它!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **Objets**.", + "ar": "افتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **Objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello degli **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開きます。", + "ko": "**객체** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **Objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odprite ploščo **Predmeti**.", + "sq": "Hapni panelin e **Objekteve**.", + "th": "เปิดแผง **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:tilemap", + "nextStepTrigger": { + "presenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "placement": "left", + "description": { + "messageByLocale": { + "en": "Open the **$(tilemap)** object.\n\nDouble-click on it.", + "fr": "Ouvrez l'objet **$(tilemap)**.\n\nDouble-cliquez dessus.", + "ar": "افتح كائن **$(tilemap)**.\n\nانقر نقرًا مزدوجًا عليه.", + "de": "Öffnen Sie das **$(tilemap)**-Objekt.\n\nDoppelklicken Sie darauf.", + "es": "Abre el objeto **$(tilemap)**.\n\nHaz doble clic en él.", + "fi": "Avaa **$(tilemap)**-objekti.\n\nTuplaklikkaa sitä.", + "it": "Apri l'oggetto **$(tilemap)**.\n\nFai doppio clic su di esso.", + "tr": "**$(tilemap)** nesnesini açın.\n\nÜzerine çift tıklayın.", + "ja": "**$(tilemap)**オブジェクトを開きます。\n\nそれをダブルクリックします。", + "ko": "**$(tilemap)** 개체를 엽니다.\n\n더블 클릭합니다.", + "pl": "Otwórz obiekt **$(tilemap)**.\n\nKliknij dwukrotnie na nim.", + "pt": "Abra o objeto **$(tilemap)**.\n\nClique duas vezes nele.", + "ru": "Откройте объект **$(tilemap)**.\n\nДважды щелкните по нему.", + "sl": "Odprite objekt **$(tilemap)**.\n\nDvakrat kliknite nanj.", + "sq": "Hapni objektin **$(tilemap)**.\n\nKlikoni dy herë mbi të.", + "th": "เปิดวัตถุ **$(tilemap)**\n\nคลิกสองครั้งที่มัน", + "uk": "Відкрийте об'єкт **$(tilemap)**.\n\nДвічі клацніть на ньому.", + "zh": "打开 **$(tilemap)** 对象。\n\n双击它。" + } + } + } + }, + { + "elementToHighlightId": "#object-editor-dialog", + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "To add a collision on the bridge, click on the tile of the bridge that is above the apple.\n\nA red square collision should appear around the tile.", + "fr": "Pour ajouter une collision sur le pont, cliquez sur la tuile du pont qui est au-dessus de la pomme.\n\nUne collision carrée rouge devrait apparaître autour de la tuile.", + "ar": "لإضافة تصادم على الجسر، انقر فوق بلاطة الجسر التي فوق التفاحة.\n\nيجب أن تظهر تصادم مربع أحمر حول البلاطة.", + "de": "Um eine Kollision auf der Brücke hinzuzufügen, klicken Sie auf die Fliese der Brücke, die sich über dem Apfel befindet.\n\nEin rotes quadratisches Kollision sollte um die Fliese erscheinen.", + "es": "Para agregar una colisión en el puente, haz clic en la losa del puente que está encima de la manzana.\n\nUna colisión cuadrada roja debería aparecer alrededor de la losa.", + "fi": "Lisätäksesi törmäyksen sillalle, napsauta sillan laattaa, joka on omenan yläpuolella.\n\nPunainen neliömäinen törmäys pitäisi ilmestyä laatan ympärille.", + "it": "Per aggiungere una collisione sul ponte, fai clic sulla piastrella del ponte che si trova sopra la mela.\n\nUna collisione quadrata rossa dovrebbe apparire attorno alla piastrella.", + "tr": "Köprüye bir çarpışma eklemek için, elmanın üstündeki köprü kiremitine tıklayın.\n\nKiremitin etrafında kırmızı bir kare çarpışma görünmelidir.", + "ja": "橋に衝突を追加するには、リンゴの上にある橋のタイルをクリックします。\n\n赤い正方形の衝突がタイルの周りに表示されるはずです。", + "ko": "다리에 충돌을 추가하려면 사과 위에 있는 다리 타일을 클릭하세요.\n\n타일 주위에 빨간색 사각형 충돌이 나타나야 합니다.", + "pl": "Aby dodać kolizję na moście, kliknij płytkę mostu, która znajduje się nad jabłkiem.\n\nCzerwona kwadratowa kolizja powinna pojawić się wokół płytki.", + "pt": "Para adicionar uma colisão na ponte, clique na telha da ponte que está acima da maçã.\n\nUma colisão quadrada vermelha deve aparecer ao redor da telha.", + "ru": "Чтобы добавить столкновение на мосту, щелкните по плитке моста, которая находится над яблоком.\n\nКрасный квадрат столкновения должен появиться вокруг плитки.", + "sl": "Za dodajanje trčenja na mostu kliknite na ploščico mostu, ki je nad jabolkom.\n\nRdeča kvadratna trčenja naj bi se pojavila okoli ploščice.", + "sq": "Për të shtuar një përplasje në urë, klikoni mbi pllakat e urës që është mbi mollë.\n\nNjë përplasje katrore e kuqe duhet të shfaqet rreth pllakat.", + "th": "เพื่อเพิ่มการชนกันบนสะพาน ให้คลิกที่กระเบื้องของสะพานที่อยู่เหนือแอปเปิ้ล\n\nการชนกันรูปสี่เหลี่ยมสีแดงควรปรากฏรอบ ๆ กระเบื้อง", + "uk": "Щоб додати зіткнення на мосту, клацніть на плитку моста, яка знаходиться над яблуком.\n\nЧервоний квадрат зіткнення має з’явитися навколо плитки.", + "zh": "要在桥上添加碰撞,请单击位于苹果上方的桥砖。\n\n应该在瓷砖周围出现红色方形碰撞。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAABvCAMAAABcrzt+AAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHVQTFRFJSUuoBAUyQkL1gcJ/wkD/ygN8gID/6I45wQF/wIB/woD/AAA/QAAPzQvi18zyoQ28ps3il8zMSwvu3s1/qE4uHk1MiwvQDUv3Y422402PDIvsnY0rnM0RDcv/KA4RTcvmWgz04k214s2p3A0Liou2Is20og2ufJTxwAAAXJJREFUeJzt2UtLw0AUhmFP7KIuClLQ4o16+/+/SPGuKKJCF3bR5liUlqaO04SP2rN431VmmDQPTRsSYhvBs3UDlgVQDaAaQDWAagDVAKoBVAOoBlANoBpANYBqC0BLgs3rz3pydskBMjstrC+KxAd4UdafLcssMH2AzE6LwM3i95rSvP7seAkweYDMTgABAgQIECBAgAABAgQYCNhOPRY2eqrzYR4oPtW1R6n928P6s608UH4uXvUpbhxANYBqANUA/lHHJpdsL0aDmMCu2WDqfAkI7Nn7bLtrj/GAB69zg537cMAje54b9ewmGvD4qTLcu84tXgfwpPqr27+KBtz+rAy3PgA2BJ4+VIbxTnH4P0nfK5cZv4sG3DibvzYfXmbX/vfLxO/O7Xa23S8vmgBX/jr2p93x9GbB/S2/dF0vtDutyffv7k1vt+IFUA2gGkA1gGoA1QCqAVQDqAZQDaAaQDWAagDVAKoBVAOoBlAtPPALIki9fxHwxIQAAAAASUVORK5CYII=" + } + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Next", + "fr": "Suivant", + "ar": "التالي", + "de": "Weiter", + "es": "Siguiente", + "fi": "Seuraava", + "it": "Prossimo", + "tr": "Sonraki", + "ja": "次", + "ko": "다음", + "pl": "Dalej", + "pt": "Próximo", + "ru": "Далее", + "sl": "Naslednji", + "sq": "Tjetër", + "th": "ถัดไป", + "uk": "Далі", + "zh": "下一步" + } + } + } + }, + { + "elementToHighlightId": "#object-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Tip: If you hold the cursor over a tile, a number appears in the tooltip. This is the number of the tile, which is useful for editing the Tilemap object from the event sheet.\n\nClick **Apply** to continue.", + "fr": "Astuce : Si vous survolez une tuile avec le curseur, un numéro apparaît dans l'infobulle. Il s'agit du numéro de la tuile, ce qui est utile pour modifier l'objet Tilemap depuis la feuille d'événements.\n\nCliquez sur **Appliquer** pour continuer.", + "ar": "نصيحة: إذا وضعنا المؤشر فوق بلاطة، يظهر رقم في النص التوضيحي. هذا هو رقم البلاطة، وهو مفيد لتحرير كائن Tilemap من ورقة الأحداث.\n\nانقر فوق **تطبيق** للمتابعة.", + "de": "Tipp: Wenn Sie den Cursor über eine Kachel halten, erscheint eine Zahl im Tooltip. Dies ist die Nummer der Kachel, die zum Bearbeiten des Tilemap-Objekts aus dem Event-Sheet nützlich ist.\n\nKlicken Sie auf **Anwenden**, um fortzufahren.", + "es": "Consejo: Si mantienes el cursor sobre un mosaico, aparece un número en la descripción emergente. Este es el número del mosaico, que es útil para editar el objeto Tilemap desde la hoja de eventos.\n\nHaz clic en **Aplicar** para continuar.", + "fi": "Vinkki: Jos pidät kohdistimen kohdistimen päällä, numero ilmestyy työkaluvihjeeseen. Tämä on laatan numero, joka on hyödyllinen Tilemap-objektin muokkaamiseen tapahtumataulukosta.\n\nKlikkaa **Käytä** jatkaaksesi.", + "it": "Suggerimento: Se tieni il cursore su una piastrella, appare un numero nel suggerimento. Questo è il numero della piastrella, che è utile per modificare l'oggetto Tilemap dalla scheda degli eventi.\n\nFai clic su **Applica** per continuare.", + "tr": "İpucu: Fareyi bir kireliğin üzerinde tutarsanız, bir numara açıklamada görünür. Bu, olay sayfasından Tilemap nesnesini düzenlemek için yararlı olan kireliğin numarasıdır.\n\nDevam etmek için **Uygula**'ya tıklayın.", + "ja": "ヒント: タイルの上にカーソルを置くと、ツールチップに番号が表示されます。これはタイルの番号であり、イベントシートからTilemapオブジェクトを編集する際に便利です。\n\n**適用**をクリックして続行します。", + "ko": "팁: 타일 위에 커서를 올려두면 툴팁에 숫자가 나타납니다. 이는 타일의 번호이며, 이벤트 시트에서 Tilemap 객체를 편집할 때 유용합니다.\n\n**적용**을 클릭하여 계속하세요.", + "pl": "Wskazówka: Jeśli zatrzymasz kursor nad kafelkiem, w podpowiedzi pojawi się liczba. Jest to numer kafelka, który jest przydatny do edycji obiektu Tilemap z arkusza zdarzeń.\n\nKliknij **Zastosuj**, aby kontynuować.", + "pt": "Dica: Se você mantiver o cursor sobre um ladrilho, um número aparecerá na dica de ferramenta. Este é o número do ladrilho, que é útil para editar o objeto Tilemap da folha de eventos.\n\nClique em **Aplicar** para continuar.", + "ru": "Совет: Если вы наведете курсор на плитку, в подсказке появится число. Это номер плитки, который полезен для редактирования объекта Tilemap из листа событий.\n\nНажмите **Применить**, чтобы продолжить.", + "sl": "Namig: Če držite kazalec nad ploščico, se v orodni nasvet prikaže številka. To je številka ploščice, ki je uporabna za urejanje predmeta Tilemap iz lista dogodkov.\n\nKliknite **Uporabi**, da nadaljujete.", + "sq": "Këshillë: Nëse mbani kursorin mbi një tjegull, një numër shfaqet në tooltip. Ky është numri i tjegullit, i cili është i dobishëm për modifikimin e objektit Tilemap nga tabela e ngjarjeve.\n\nKlikoni **Apliko** për të vazhduar.", + "th": "เคล็ดลับ: หากคุณวางเคอร์เซอร์เหนือกระเบื้อง จะมีตัวเลขปรากฏในคำแนะนำเครื่องมือ นี่คือหมายเลขของกระเบื้อง ซึ่งมีประโยชน์สำหรับการแก้ไขวัตถุ Tilemap จากแผ่นงานเหตุการณ์\n\nคลิก **ใช้** เพื่อดำเนินการต่อ", + "uk": "Порада: Якщо ви наведете курсор на плитку, у підказці з'явиться число. Це номер плитки, який корисний для редагування об'єкта Tilemap з аркуша подій.\n\nНатисніть **Застосувати**, щоб продовжити.", + "zh": "提示:如果将光标悬停在磁贴上,工具提示中会出现一个数字。这是磁贴的编号,对于从事件表编辑 Tilemap 对象很有用。\n\n单击 **应用** 以继续。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "Launch the **preview** to see what has changed.\n\nTry to catch the red apple!", + "fr": "Lancez l'**aperçu** pour voir ce qui a changé.\n\nEssayez d'attraper la pomme rouge !", + "ar": "قم بتشغيل **المعاينة** لرؤية ما تغير.\n\nحاول التقاط التفاحة الحمراء!", + "de": "Starten Sie die **Vorschau**, um zu sehen, was sich geändert hat.\n\nVersuchen Sie, den roten Apfel zu fangen!", + "es": "Lanza la **vista previa** para ver qué ha cambiado.\n\n¡Intenta atrapar la manzana roja!", + "fi": "Käynnistä **esikatselu** nähdäksesi, mitä on muuttunut.\n\nYritä napata punainen omena!", + "it": "Avvia l'**anteprima** per vedere cosa è cambiato.\n\nProva a catturare la mela rossa!", + "tr": "**Önizlemeyi** başlatarak nelerin değiştiğini görün.\n\nKırmızı elmayı yakalamayı deneyin!", + "ja": "**プレビュー**を起動して、何が変更されたかを確認します。\n\n赤いリンゴをキャッチしてみてください!", + "ko": "**미리보기**를 실행하여 무엇이 변경되었는지 확인하십시오.\n\n빨간 사과를 잡아보세요!", + "pl": "Uruchom **podgląd**, aby zobaczyć, co się zmieniło.\n\nSpróbuj złapać czerwoną jabłko!", + "pt": "Inicie a **prévia** para ver o que mudou.\n\nTente pegar a maçã vermelha!", + "ru": "Запустите **предпросмотр**, чтобы увидеть, что изменилось.\n\nПопробуйте поймать красное яблоко!", + "sl": "Zaženi **predogled**, da vidiš, kaj se je spremenilo.\n\nPoskusi ujeti rdečo jabolko!", + "sq": "Lanso **paraprakun** për të parë se çfarë ka ndryshuar.\n\nProvoni të kapni mollën e kuqe!", + "th": "เปิด **ดูตัวอย่าง** เพื่อดูว่าอะไรเปลี่ยนไป\n\nลองจับแอปเปิ้ลแดง!", + "uk": "Запустіть **попередній перегляд**, щоб побачити, що змінилося.\n\nСпробуйте зловити червоне яблуко!", + "zh": "启动**预览**以查看发生了什么变化。\n\n试着抓住红苹果!" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "bottom-right", + "inGameMessage": { + "messageByLocale": { + "en": "You can walk on the bridge, but the apple can't be picked up yet.\n\nLet's see how to remove the apple when **$(player)** is on it by adding some game logic. Let's fix this!\nClose this window and return to the editor.", + "fr": "Vous pouvez marcher sur le pont, mais la pomme ne peut pas encore être ramassée.\n\nVoyons comment la supprimer lorsque **$(player)** est dessus en ajoutant un peu de logique de jeu. Réglons cela !\nFermez cette fenêtre et retournez à l'éditeur.", + "ar": "يمكنك المشي على الجسر، لكن لا يمكن التقاط التفاحة بعد.\n\nلنرَ كيفية إزالة التفاحة عندما يكون **$(player)** عليها عن طريق إضافة بعض منطق اللعبة. دعونا نصلح هذا!\nأغلق هذه النافذة وارجع إلى المحرر.", + "de": "Du kannst über die Brücke gehen, aber der Apfel kann noch nicht aufgesammelt werden.\n\nLass uns sehen, wie wir den Apfel entfernen können, wenn **$(player)** darauf steht, indem wir etwas Spiel-Logik hinzufügen. Lassen wir das beheben!\nSchließe dieses Fenster und kehre zum Editor zurück.", + "es": "Puedes caminar sobre el puente, pero la manzana aún no se puede recoger.\n\nVeamos cómo eliminar la manzana cuando **$(player)** esté sobre ella añadiendo algo de lógica del juego. ¡Arreglémoslo!\nCierra esta ventana y regresa al editor.", + "fi": "Voit kävellä sillalla, mutta omenaa ei voi vielä poimia.\n\nKatsotaan, kuinka omena poistetaan, kun **$(player)** on sen päällä lisäämällä hieman pelilogiikkaa. Korjataan tämä!\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Puoi camminare sul ponte, ma la mela non può ancora essere raccolta.\n\nVediamo come rimuoverla quando **$(player)** è sopra di essa aggiungendo un po' di logica di gioco. Risolviamo questo problema!\nChiudi questa finestra e torna all'editor.", + "tr": "Köprüde yürüyebilirsin, ancak elma henüz alınamaz.\n\n**$(player)** üzerindeyken elmayı nasıl kaldıracağımızı görmek için biraz oyun mantığı ekleyelim. Hadi bunu düzeltelim!\nBu pencereyi kapat ve editöre geri dön.", + "ja": "橋の上を歩くことはできますが、リンゴはまだ拾えません。\n\n**$(player)** が上にいるときにリンゴを削除する方法を、ゲームロジックを追加して見てみましょう。これを修正しましょう!\nこのウィンドウを閉じてエディターに戻ってください。", + "ko": "다리를 걸어갈 수는 있지만, 아직 사과를 주울 수 없습니다.\n\n**$(player)** 가 그 위에 있을 때 사과를 제거하는 방법을 게임 로직을 추가하여 살펴봅시다. 이 문제를 해결해 봅시다!\n이 창을 닫고 편집기로 돌아가세요.", + "pl": "Możesz chodzić po moście, ale jabłka nie można jeszcze podnieść.\n\nZobaczmy, jak usunąć jabłko, gdy **$(player)** jest na nim, dodając trochę logiki gry. Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "Você pode andar sobre a ponte, mas a maçã ainda não pode ser coletada.\n\nVamos ver como remover a maçã quando **$(player)** estiver sobre ela, adicionando um pouco de lógica de jogo. Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "ru": "Вы можете ходить по мосту, но яблоко пока нельзя подобрать.\n\nДавайте посмотрим, как удалить яблоко, когда **$(player)** находится на нем, добавив немного игровой логики. Давайте это исправим!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Lahko hodiš po mostu, vendar jabolka še ne moreš pobrati.\n\nPoglejmo, kako odstraniti jabolko, ko je **$(player)** na njem, tako da dodamo nekaj logike igre. Popravimo to!\nZapri to okno in se vrni v urejevalnik.", + "sq": "Mund të ecësh mbi urë, por ende nuk mund të marrësh mollën.\n\nLe të shohim si ta heqim mollën kur **$(player)** është mbi të, duke shtuar pak logjikë lojërash. Le ta rregullojmë këtë!\nMbyll këtë dritare dhe kthehu te redaktori.", + "th": "คุณสามารถเดินบนสะพานได้ แต่ยังไม่สามารถเก็บแอปเปิ้ลได้\n\nลองดูวิธีลบแอปเปิ้ลเมื่อ **$(player)** อยู่บนมันโดยการเพิ่มตรรกะเกม มาปรับปรุงสิ่งนี้กันเถอะ!\nปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "uk": "Ви можете ходити по мосту, але яблуко поки що не можна підібрати.\n\nДавайте подивимося, як видалити яблуко, коли **$(player)** знаходиться на ньому, додавши трохи ігрової логіки. Виправимо це!\nЗакрийте це вікно і поверніться до редактора.", + "zh": "你可以在桥上行走,但苹果还不能被拾取。\n\n让我们看看如何在 **$(player)** 站在上面时,通过添加一些游戏逻辑来移除苹果。让我们修复这个问题!\n关闭此窗口并返回编辑器。" + } + } + } + }, + { + "tooltip": { + "placement": "bottom", + "description": { + "messageByLocale": { + "en": "Open the **event sheet** to edit the game logic.", + "fr": "Ouvrez la **feuille d'événements** pour éditer la logique du jeu.", + "ar": "افتح **ورقة الأحداث** لتحرير منطق اللعبة.", + "de": "Öffnen Sie das **Ereignisblatt**, um die Spiel-Logik zu bearbeiten.", + "es": "Abre la **hoja de eventos** para editar la lógica del juego.", + "fi": "Avaa **tapahtumataulu** muokataksesi pelilogiikkaa.", + "it": "Apri il **foglio eventi** per modificare la logica del gioco.", + "tr": "Oyun mantığını düzenlemek için **olay sayfasını** açın.", + "ja": "**イベントシート**を開いてゲームロジックを編集します。", + "ko": "**이벤트 시트**를 열어 게임 로직을 편집합니다.", + "pl": "Otwórz **arkusz zdarzeń**, aby edytować logikę gry.", + "pt": "Abra a **folha de eventos** para editar a lógica do jogo.", + "ru": "Откройте **лист событий**, чтобы редактировать игровую логику.", + "sl": "Odprite **list dogodkov**, da uredite logiko igre.", + "sq": "Hapni **fletën e ngjarjeve** për të redaktuar logjikën e lojës.", + "th": "เปิด **แผ่นเหตุการณ์** เพื่อแก้ไขตรรกะเกม", + "uk": "Відкрийте **лист подій**, щоб редагувати ігрову логіку.", + "zh": "打开**事件表**以编辑游戏逻辑。" + } + } + }, + "elementToHighlightId": "editorTab:gameScene:EventsSheet", + "nextStepTrigger": { + "editorIsActive": "gameScene:EventsSheet" + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "#toolbar-add-event-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will add a new event that checks what tile is under the player, and if that tile is the apple, then we will remove it.", + "fr": "Nous allons ajouter un nouvel événement qui vérifie quelle tuile se trouve sous le joueur, et si cette tuile est la pomme, alors nous l'enlèverons.", + "ar": "سنضيف حدثًا جديدًا يتحقق من أي بلاطة تحت اللاعب، وإذا كانت تلك البلاطة هي التفاحة، فسنقوم بإزالتها.", + "de": "Wir werden ein neues Ereignis hinzufügen, das überprüft, welche Fliese sich unter dem Spieler befindet, und wenn diese Fliese der Apfel ist, entfernen wir ihn.", + "es": "Agregaremos un nuevo evento que verifica qué losa está debajo del jugador, y si esa losa es la manzana, entonces la eliminaremos.", + "fi": "Lisäämme uuden tapahtuman, joka tarkistaa, mikä laatta on pelaajan alla, ja jos kyseinen laatta on omena, poistamme sen.", + "it": "Aggiungeremo un nuovo evento che controlla quale piastrella si trova sotto il giocatore, e se quella piastrella è la mela, allora la rimuoveremo.", + "tr": "Oyuncunun altında hangi kireliğin olduğunu kontrol eden yeni bir olay ekleyeceğiz ve bu kirelik elma ise onu kaldıracağız.", + "ja": "プレイヤーの下にあるタイルを確認する新しいイベントを追加します。そのタイルがリンゴであれば、リンゴを削除します。", + "ko": "플레이어 아래에 있는 타일을 확인하는 새 이벤트를 추가합니다. 그 타일이 사과라면 우리는 그것을 제거할 것입니다.", + "pl": "Dodamy nowe zdarzenie, które sprawdza, która płytka znajduje się pod graczem, a jeśli ta płytka to jabłko, to je usuniemy.", + "pt": "Vamos adicionar um novo evento que verifica qual telha está sob o jogador e, se essa telha for a maçã, então a removeremos.", + "ru": "Мы добавим новое событие, которое проверяет, какая плитка находится под игроком, и если эта плитка — яблоко, то мы его удалим.", + "sl": "Dodali bomo nov dogodek, ki preveri, katera ploščica je pod igralcem, in če je ta ploščica jabolko, jo bomo odstranili.", + "sq": "Ne do të shtojmë një ngjarje të re që kontrollon se cila pllaka është nën lojtarin, dhe nëse ajo pllaka është molla, atëherë ne do ta heqim atë.", + "th": "เราจะเพิ่มเหตุการณ์ใหม่ที่ตรวจสอบว่ามีกระเบื้องอะไรอยู่ใต้ผู้เล่น และถ้ากระเบื้องนั้นคือแอปเปิ้ล เราจะลบมันออก", + "uk": "Ми додамо нову подію, яка перевіряє, яка плитка під гравцем, і якщо ця плитка — яблуко, то ми її видалимо.", + "zh": "我们将添加一个新事件,检查玩家下面是什么瓷砖,如果那块瓷砖是苹果,那么我们将移除它。" + } + } + }, + "nextStepTrigger": { + "presenceOfElement": "[data-active=\"true\"] #add-condition-button-empty" + }, + "skippable": true, + "disableBlockingLayer": true, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "#events-editor[data-active] #event-5-conditions #add-condition-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Add a **condition**.", + "fr": "Ajoutez une **condition**.", + "ar": "أضف **شرطًا**.", + "de": "Fügen Sie eine **Bedingung** hinzu.", + "es": "Agrega una **condición**.", + "fi": "Lisää **ehto**.", + "it": "Aggiungi una **condizione**.", + "tr": "**Koşul** ekleyin.", + "ja": "**条件**を追加します。", + "ko": "**조건**을 추가하세요.", + "pl": "Dodaj **warunek**.", + "pt": "Adicione uma **condição**.", + "ru": "Добавьте **условие**.", + "sl": "Dodajte **pogoj**.", + "sq": "Shto një **kusht**.", + "th": "เพิ่ม **เงื่อนไข**.", + "uk": "Додайте **умову**.", + "zh": "添加一个**条件**。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:tilemap", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TileMap--SimpleTileMap--TileIdAtPosition" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **$(tilemap)** object.", + "fr": "Sélectionnez l'objet **$(tilemap)**.", + "ar": "حدد الكائن **$(tilemap)**.", + "de": "Wählen Sie das **$(tilemap)**-Objekt aus.", + "es": "Selecciona el objeto **$(tilemap)**.", + "fi": "Valitse **$(tilemap)**-objekti.", + "it": "Seleziona l'oggetto **$(tilemap)**.", + "tr": "**$(tilemap)** nesnesini seçin.", + "ja": "**$(tilemap)**オブジェクトを選択します。", + "ko": "**$(tilemap)** 객체를 선택하세요.", + "pl": "Wybierz obiekt **$(tilemap)**.", + "pt": "Selecione o objeto **$(tilemap)**.", + "ru": "Выберите объект **$(tilemap)**.", + "sl": "Izberite objekt **$(tilemap)**.", + "sq": "Zgjidhni objektin **$(tilemap)**.", + "th": "เลือกวัตถุ **$(tilemap)**.", + "uk": "Виберіть об'єкт **$(tilemap)**.", + "zh": "选择**$(tilemap)**对象。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TileMap--SimpleTileMap--TileIdAtPosition", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the condition **Tile (at position)**.", + "fr": "Sélectionnez la condition **Tuile (à la position)**.", + "ar": "حدد الشرط **بلاطة (في الموضع)**.", + "de": "Wählen Sie die Bedingung **Fliese (an Position)** aus.", + "es": "Selecciona la condición **Azulejo (en posición)**.", + "fi": "Valitse ehto **Laatta (sijainnissa)**.", + "it": "Seleziona la condizione **Piastrella (in posizione)**.", + "tr": "**Pozisyondaki Püskül** koşulunu seçin.", + "ja": "**位置にあるタイル**の条件を選択します。", + "ko": "**위치에 있는 타일** 조건을 선택하세요.", + "pl": "Wybierz warunek **Płytka (na pozycji)**.", + "pt": "Selecione a condição **Azulejo (na posição)**.", + "ru": "Выберите условие **Плитка (в позиции)**.", + "sl": "Izberite pogoj **Ploščica (na položaju)**.", + "sq": "Zgjidhni kushtin **Pllaka (në pozita)**.", + "th": "เลือกเงื่อนไข **กระเบื้อง (ที่ตำแหน่ง)**.", + "uk": "Виберіть умову **Плитка (на позиції)**.", + "zh": "选择条件**瓷砖(在位置)**。" + } + } + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "13" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Here we'll enter the tile id of the apple on our **$(tilemap)** object; the tile id is **13**.", + "fr": "Ici, nous entrerons l'ID de la tuile de la pomme sur notre objet **$(tilemap)** ; l'ID de la tuile est **13**.", + "ar": "هنا سنقوم بإدخال معرف البلاطة للتفاحة على كائن **$(tilemap)** الخاص بنا؛ معرف البلاطة هو **13**.", + "de": "Hier geben wir die Kachel-ID des Apfels auf unserem **$(tilemap)**-Objekt ein; die Kachel-ID ist **13**.", + "es": "Aquí ingresaremos el ID de la losa de la manzana en nuestro objeto **$(tilemap)**; el ID de la losa es **13**.", + "fi": "Tässä kirjoitamme omenan laatan tunnisteen **$(tilemap)**-objektiimme; laatan tunniste on **13**.", + "it": "Qui inseriremo l'ID della piastrella della mela sul nostro oggetto **$(tilemap)**; l'ID della piastrella è **13**.", + "tr": "Burada **$(tilemap)** nesnemizdeki elmanın kireliğini gireceğiz; kireliğin kimliği **13**.", + "ja": "ここでは、私たちの**$(tilemap)**オブジェクトにあるリンゴのタイルIDを入力します。タイルIDは**13**です。", + "ko": "여기에서 우리의 **$(tilemap)** 객체에 있는 사과의 타일 ID를 입력합니다. 타일 ID는 **13**입니다.", + "pl": "Tutaj wpiszemy identyfikator płytki jabłka w naszym obiekcie **$(tilemap)**; identyfikator płytki to **13**.", + "pt": "Aqui vamos inserir o ID da telha da maçã em nosso objeto **$(tilemap)**; o ID da telha é **13**.", + "ru": "Здесь мы введем ID плитки яблока на нашем объекте **$(tilemap)**; ID плитки — **13**.", + "sl": "Tukaj bomo vnesli ID ploščice jabolka na našem objektu **$(tilemap)**; ID ploščice je **13**.", + "sq": "Këtu do të hyjmë ID-në e pllaks së mollës në objektin tonë **$(tilemap)**; ID e pllaks është **13**.", + "th": "ที่นี่เราจะป้อน ID ของกระเบื้องแอปเปิ้ลในวัตถุ **$(tilemap)** ของเรา; ID ของกระเบื้องคือ **13**.", + "uk": "Тут ми введемо ID плитки яблука на нашому об'єкті **$(tilemap)**; ID плитки — **13**.", + "zh": "在这里,我们将输入我们**$(tilemap)**对象中苹果的瓷砖ID;瓷砖ID是**13**。" + } + }, + "placement": "left" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-3-expression-field", + "nextStepTrigger": { + "valueEquals": "Slime.CenterX()" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Here we enter the **$(player)** position on the x-axis.\n\nEnter **Slime.CenterX()**.", + "fr": "Ici, nous entrons la position de **$(player)** sur l'axe des x.\n\nEntrez **Slime.CenterX()**.", + "ar": "هنا ندخل موضع **$(player)** على المحور السيادي.\n\nأدخل **Slime.CenterX()**.", + "de": "Hier geben wir die Position des **$(player)** auf der x-Achse ein.\n\nGeben Sie **Slime.CenterX()** ein.", + "fi": "Tässä kirjoitamme **$(player)** sijainnin x-akselilla.\n\nKirjoita **Slime.CenterX()**.", + "es": "Aquí ingresamos la posición del **$(player)** en el eje x.\n\nIngresa **Slime.CenterX()**.", + "it": "Qui inseriamo la posizione del **$(player)** sull'asse x.\n\nInserisci **Slime.CenterX()**.", + "tr": "Burada **$(player)**'ın x eksenindeki konumunu giriyoruz.\n\n**Slime.CenterX()**'yi girin.", + "ja": "ここでは、x軸上の**$(player)**の位置を入力します。\n\n**Slime.CenterX()**を入力します。", + "ko": "여기에서 x축에서 **$(player)**의 위치를 입력합니다.\n\n**Slime.CenterX()**를 입력하세요.", + "pl": "Tutaj wprowadzamy pozycję **$(player)** na osi x.\n\nWprowadź **Slime.CenterX()**.", + "pt": "Aqui inserimos a posição do **$(player)** no eixo x.\n\nInsira **Slime.CenterX()**.", + "ru": "Здесь мы вводим позицию **$(player)** по оси x.\n\nВведите **Slime.CenterX()**.", + "sl": "Tukaj vnesemo položaj **$(player)** na x osi.\n\nVnesite **Slime.CenterX()**.", + "sq": "Këtu hyjmë pozicionin e **$(player)** në boshtin x.\n\nHyni **Slime.CenterX()**.", + "th": "ที่นี่เราจะป้อนตำแหน่งของ **$(player)** บนแกน x\n\nป้อน **Slime.CenterX()**", + "uk": "Тут ми вводимо позицію **$(player)** на осі x.\n\nВведіть **Slime.CenterX()**.", + "zh": "在这里,我们输入**$(player)**在x轴上的位置。\n\n输入**Slime.CenterX()**。" + } + }, + "placement": "left" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-4-expression-field", + "nextStepTrigger": { + "valueEquals": "Slime.CenterY()" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Then on the y-axis.\n\nEnter **Slime.CenterY()**.", + "fr": "Puis sur l'axe des y.\n\nEntrez **Slime.CenterY()**.", + "ar": "ثم على المحور الصادي.\n\nأدخل **Slime.CenterY()**.", + "de": "Dann auf der y-Achse.\n\nGeben Sie **Slime.CenterY()** ein.", + "es": "Luego en el eje y.\n\nIngresa **Slime.CenterY()**.", + "fi": "Sitten y-akselilla.\n\nKirjoita **Slime.CenterY()**.", + "it": "Poi sull'asse y.\n\nInserisci **Slime.CenterY()**.", + "tr": "Sonra y ekseninde.\n\n**Slime.CenterY()**'yi girin.", + "ja": "次にy軸に。\n\n**Slime.CenterY()**を入力します。", + "ko": "그런 다음 y축에서.\n\n**Slime.CenterY()**를 입력하세요.", + "pl": "Następnie na osi y.\n\nWprowadź **Slime.CenterY()**.", + "pt": "Então no eixo y.\n\nInsira **Slime.CenterY()**.", + "ru": "Затем по оси y.\n\nВведите **Slime.CenterY()**.", + "sl": "Nato na y osi.\n\nVnesite **Slime.CenterY()**.", + "sq": "Pastaj në boshtin y.\n\nHyni **Slime.CenterY()**.", + "th": "จากนั้นบนแกน y\n\nป้อน **Slime.CenterY()**", + "uk": "Потім по осі y.\n\nВведіть **Slime.CenterY()**.", + "zh": "然后在y轴上。\n\n输入**Slime.CenterY()**。" + } + }, + "placement": "left" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's save this.", + "fr": "Maintenant, sauvegardons cela.", + "ar": "الآن دعنا نحفظ هذا.", + "de": "Lass uns das jetzt speichern.", + "es": "Ahora guardemos esto.", + "fi": "Nyt tallennetaan tämä.", + "it": "Ora salviamo questo.", + "tr": "Şimdi bunu kaydedelim.", + "ja": "さあ、これを保存しましょう。", + "ko": "이제 이것을 저장합시다.", + "pl": "Teraz zapiszmy to.", + "pt": "Agora vamos salvar isso.", + "ru": "Теперь давайте это сохраним.", + "sl": "Zdajmo to shraniti.", + "sq": "Tani le ta ruajmë këtë.", + "th": "ตอนนี้เรามาบันทึกสิ่งนี้กันเถอะ", + "uk": "Тепер давайте це збережемо.", + "zh": "现在让我们保存这个。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#events-editor[data-active] #event-5-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We correctly set a condition to check the tile at the player's position.\n\nLet’s **add an action** now to remove the tile at this same position.", + "fr": "Nous avons correctement défini une condition pour vérifier la tuile à la position du joueur.\n\nAjoutons maintenant une **action** pour supprimer la tuile à cette même position.", + "ar": "لقد قمنا بتعيين شرط بشكل صحيح للتحقق من البلاطة في موضع اللاعب.\n\nدعنا **نضيف إجراءً** الآن لإزالة البلاطة في نفس الموضع.", + "de": "Wir haben eine Bedingung korrekt festgelegt, um die Kachel an der Position des Spielers zu überprüfen.\n\nLass uns jetzt eine **Aktion hinzufügen**, um die Kachel an dieser Position zu entfernen.", + "es": "Hemos establecido correctamente una condición para verificar la losa en la posición del jugador.\n\nAhora **agreguemos una acción** para eliminar la losa en esta misma posición.", + "fi": "Asetimme ehdot oikein tarkistaaksemme laatan pelaajan sijainnissa.\n\nLisätään nyt **toiminto**, jolla poistetaan laatta tästä samasta sijainnista.", + "it": "Abbiamo impostato correttamente una condizione per controllare la piastrella nella posizione del giocatore.\n\nAggiungiamo ora un'**azione** per rimuovere la piastrella in questa stessa posizione.", + "tr": "Oyuncunun pozisyonundaki kireliği kontrol etmek için bir koşul doğru bir şekilde ayarladık.\n\nŞimdi bu aynı pozisyondaki kireliği kaldırmak için bir **eylem ekleyelim**.", + "ja": "プレイヤーの位置にあるタイルをチェックする条件を正しく設定しました。\n\n今、同じ位置にあるタイルを削除するために**アクションを追加**しましょう。", + "ko": "플레이어의 위치에 있는 타일을 확인하는 조건을 올바르게 설정했습니다.\n\n이제 이 동일한 위치에서 타일을 제거하기 위해 **액션을 추가**합시다.", + "pl": "Prawidłowo ustawiliśmy warunek, aby sprawdzić płytkę w pozycji gracza.\n\nTeraz **dodajmy akcję**, aby usunąć płytkę w tej samej pozycji.", + "pt": "Definimos corretamente uma condição para verificar a tile na posição do jogador.\n\nAgora vamos **adicionar uma ação** para remover a tile nessa mesma posição.", + "ru": "Мы правильно установили условие для проверки плитки в позиции игрока.\n\nТеперь давайте **добавим действие**, чтобы удалить плитку в этом же месте.", + "sl": "Pravilno smo nastavili pogoj za preverjanje ploščice na položaju igralca.\n\nZdaj dodajmo **ukaz**, da odstranimo ploščico na tej isti poziciji.", + "sq": "Ne kemi vendosur saktësisht një kusht për të kontrolluar pllaken në pozitat e lojtarit.\n\nTani le të **shtojmë një veprim** për të hequr pllaken në këtë pozitë të njëjtë.", + "th": "เราตั้งเงื่อนไขเพื่อตรวจสอบกระเบื้องที่ตำแหน่งของผู้เล่นได้อย่างถูกต้อง\n\nตอนนี้เรามา **เพิ่มการกระทำ** เพื่อลบกระเบื้องที่ตำแหน่งเดียวกันนี้กันเถอะ", + "uk": "Ми правильно встановили умову для перевірки плитки на позиції гравця.\n\nТепер давайте **додамо дію**, щоб видалити плитку в цій самій позиції.", + "zh": "我们正确设置了一个条件,以检查玩家位置上的瓷砖。\n\n现在让我们**添加一个动作**,以删除该位置上的瓷砖。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:tilemap", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TileMap--RemoveTileAtPosition" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **$(tilemap)** object.", + "fr": "Sélectionnez l'objet **$(tilemap)**.", + "ar": "اختر كائن **$(tilemap)**.", + "de": "Wählen Sie das **$(tilemap)**-Objekt aus.", + "es": "Selecciona el objeto **$(tilemap)**.", + "fi": "Valitse **$(tilemap)**-objekti.", + "it": "Seleziona l'oggetto **$(tilemap)**.", + "tr": "**$(tilemap)** nesnesini seçin.", + "ja": "**$(tilemap)**オブジェクトを選択してください。", + "ko": "**$(tilemap)** 객체를 선택하세요.", + "pl": "Wybierz obiekt **$(tilemap)**.", + "pt": "Selecione o objeto **$(tilemap)**.", + "ru": "Выберите объект **$(tilemap)**.", + "sl": "Izberite objekt **$(tilemap)**.", + "sq": "Zgjidhni objektin **$(tilemap)**.", + "th": "เลือกวัตถุ **$(tilemap)**.", + "uk": "Виберіть об'єкт **$(tilemap)**.", + "zh": "选择 **$(tilemap)** 对象。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TileMap--RemoveTileAtPosition", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the action **Remove tile (at position)**.", + "fr": "Sélectionnez l'action **Supprimer la tuile (à la position)**.", + "ar": "اختر الإجراء **إزالة البلاطة (في الموضع)**.", + "de": "Wählen Sie die Aktion **Kachel entfernen (an Position)** aus.", + "es": "Selecciona la acción **Eliminar losa (en la posición)**.", + "fi": "Valitse toiminto **Poista laatta (sijainnissa)**.", + "it": "Seleziona l'azione **Rimuovi piastrella (alla posizione)**.", + "tr": "**Pozisyondaki kireliği kaldır** eylemini seçin.", + "ja": "**位置でタイルを削除**するアクションを選択してください。", + "ko": "**위치에서 타일 제거** 작업을 선택하세요.", + "pl": "Wybierz akcję **Usuń płytkę (na pozycji)**.", + "pt": "Selecione a ação **Remover tile (na posição)**.", + "ru": "Выберите действие **Удалить плитку (в позиции)**.", + "sl": "Izberite dejanje **Odstrani ploščico (na položaju)**.", + "sq": "Zgjidhni veprimin **Hiq pllaken (në pozitë)**.", + "th": "เลือกการกระทำ **ลบกระเบื้อง (ที่ตำแหน่ง)**.", + "uk": "Виберіть дію **Видалити плитку (за позицією)**.", + "zh": "选择操作 **移除瓷砖(在位置)**。" + } + } + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-1-expression-field", + "nextStepTrigger": { + "valueEquals": "Slime.CenterX()" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Here we enter the **$(player)** position on the x-axis.\n\nEnter **Slime.CenterX()**.", + "fr": "Ici, nous entrons la position de **$(player)** sur l'axe des x.\n\nEntrez **Slime.CenterX()**.", + "ar": "هنا ندخل موضع **$(player)** على المحور السيادي.\n\nأدخل **Slime.CenterX()**.", + "de": "Hier geben wir die Position des **$(player)** auf der x-Achse ein.\n\nGeben Sie **Slime.CenterX()** ein.", + "es": "Aquí ingresamos la posición del **$(player)** en el eje x.\n\nIngresa **Slime.CenterX()**.", + "fi": "Tässä kirjoitamme **$(player)** sijainnin x-akselilla.\n\nKirjoita **Slime.CenterX()**.", + "it": "Qui inseriamo la posizione del **$(player)** sull'asse x.\n\nInserisci **Slime.CenterX()**.", + "tr": "Burada **$(player)**'ın x eksenindeki konumunu giriyoruz.\n\n**Slime.CenterX()**'yi girin.", + "ja": "ここでは、x軸上の**$(player)**の位置を入力します。\n\n**Slime.CenterX()**を入力します。", + "ko": "여기에서 x축에서 **$(player)**의 위치를 입력합니다.\n\n**Slime.CenterX()**를 입력하세요.", + "pl": "Tutaj wprowadzamy pozycję **$(player)** na osi x.\n\nWprowadź **Slime.CenterX()**.", + "pt": "Aqui inserimos a posição do **$(player)** no eixo x.\n\nInsira **Slime.CenterX()**.", + "ru": "Здесь мы вводим позицию **$(player)** по оси x.\n\nВведите **Slime.CenterX()**.", + "sl": "Tukaj bomo vnesli položaj **$(player)** na x osi.\n\nVnesite **Slime.CenterX()**.", + "sq": "Këtu hyjmë pozicionin e **$(player)** në boshtin x.\n\nHyni **Slime.CenterX()**.", + "th": "ที่นี่เราจะป้อนตำแหน่งของ **$(player)** บนแกน x\n\nป้อน **Slime.CenterX()**", + "uk": "Тут ми вводимо позицію **$(player)** на осі x.\n\nВведіть **Slime.CenterX()**.", + "zh": "在这里,我们输入**$(player)**在x轴上的位置。\n\n输入**Slime.CenterX()**。" + } + }, + "placement": "left" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-2-expression-field", + "nextStepTrigger": { + "valueEquals": "Slime.CenterY()" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Then on the y-axis.\n\nEnter **Slime.CenterY()**.", + "fr": "Puis sur l'axe des y.\n\nEntrez **Slime.CenterY()**.", + "ar": "ثم على المحور الصادي.\n\nأدخل **Slime.CenterY()**.", + "de": "Dann auf der y-Achse.\n\nGeben Sie **Slime.CenterY()** ein.", + "es": "Luego en el eje y.\n\nIngresa **Slime.CenterY()**.", + "fi": "Sitten y-akselilla.\n\nKirjoita **Slime.CenterY()**.", + "it": "Poi sull'asse y.\n\nInserisci **Slime.CenterY()**.", + "tr": "Sonra y ekseninde.\n\n**Slime.CenterY()**'yi girin.", + "ja": "次にy軸に。\n\n**Slime.CenterY()**を入力します。", + "ko": "그런 다음 y축에서.\n\n**Slime.CenterY()**를 입력하세요.", + "pl": "Następnie na osi y.\n\nWprowadź **Slime.CenterY()**.", + "pt": "Então no eixo y.\n\nInsira **Slime.CenterY()**.", + "ru": "Затем по оси y.\n\nВведите **Slime.CenterY()**.", + "sl": "Nato na y osi.\n\nVnesite **Slime.CenterY()**.", + "sq": "Pastaj në boshtin y.\n\nHyni **Slime.CenterY()**.", + "th": "จากนั้นบนแกน y\n\nป้อน **Slime.CenterY()**", + "uk": "Потім по осі y.\n\nВведіть **Slime.CenterY()**.", + "zh": "然后在y轴上。\n\n输入**Slime.CenterY()**。" + } + }, + "placement": "left" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's save this.", + "fr": "Maintenant, sauvegardons ceci.", + "ar": "الآن دعنا نحفظ هذا.", + "de": "Jetzt lass uns das speichern.", + "es": "Ahora guardemos esto.", + "fi": "Nyt tallennetaan tämä.", + "it": "Ora salviamo questo.", + "tr": "Şimdi bunu kaydedelim.", + "ja": "これを保存しましょう。", + "ko": "이제 이것을 저장하겠습니다.", + "pl": "Teraz zapiszmy to.", + "pt": "Agora vamos salvar isto.", + "ru": "Теперь давайте сохраним это.", + "sl": "Zdaj shranimo to.", + "sq": "Tani ta ruajmë këtë.", + "th": "ตอนนี้มาบันทึกสิ่งนี้กัน", + "uk": "Тепер збережімо це.", + "zh": "现在让我们保存这个。" + } + }, + "placement": "top" + } + }, + { + "tooltip": { + "placement": "bottom", + "description": { + "messageByLocale": { + "en": "We're done!\nLet's test our game and try to pick the apple by passing on it.\n\nLet's click on the **Preview** button to play.", + "fr": "Nous avons terminé !\nTestons notre jeu et essayons de ramasser la pomme en passant dessus.\n\nCliquons sur le bouton **Aperçu** pour jouer.", + "ar": "انتهينا!\nدعنا نختبر لعبتنا ونحاول التقاط التفاحة بالمرور عليها.\n\nفلننقر على زر **معاينة** للعب.", + "de": "Wir sind fertig!\nLassen Sie uns unser Spiel testen und versuchen, den Apfel aufzuheben, indem wir darüber gehen.\n\nKlicken wir auf die **Vorschau**-Schaltfläche zum Spielen.", + "es": "¡Hemos terminado!\nVamos a probar nuestro juego e intentar recoger la manzana pasando sobre ella.\n\nHagamos clic en el botón **Vista previa** para jugar.", + "fi": "Olemme valmiit!\nTestataan peliämme ja yritetään poimia omena menemällä sen päälle.\n\nKlikataan **Esikatselu**-painiketta pelataksesi.", + "it": "Abbiamo finito!\nProviamo il nostro gioco e cerchiamo di raccogliere la mela passandoci sopra.\n\nClicchiamo sul pulsante **Anteprima** per giocare.", + "tr": "Bitti!\nOyunumuzu test edelim ve üzerinden geçerek elma toplamayı deneyelim.\n\nOynamak için **Önizleme** düğmesine tıklayalım.", + "ja": "完了です!\nゲームをテストして、リンゴの上を通って拾ってみましょう。\n\n**プレビュー**ボタンをクリックしてプレイしましょう。", + "ko": "완료되었습니다!\n게임을 테스트하고 사과 위를 지나가서 사과를 집어보겠습니다.\n\n**미리보기** 버튼을 클릭하여 플레이해봅시다.", + "pl": "Gotowe!\nProzetestujmy naszą grę i spróbujmy podnieść jabłko przechodząc po nim.\n\nKliknijmy przycisk **Podgląd**, aby zagrać.", + "pt": "Terminamos!\nVamos testar nosso jogo e tentar pegar a maçã passando por cima dela.\n\nVamos clicar no botão **Visualizar** para jogar.", + "ru": "Готово!\nДавайте протестируем нашу игру и попробуем подобрать яблоко, пройдя по нему.\n\nНажмем на кнопку **Предпросмотр**, чтобы начать игру.", + "sl": "Končali smo!\nPreizkusimo našo igro in poskusimo pobrati jabolko tako, da gremo čezenj.\n\nKliknimo gumb **Predogled** za igranje.", + "sq": "Kemi mbaruar!\nLe të testojmë lojën tonë dhe të përpiqemi të marrim mollën duke kaluar mbi të.\n\nLe të klikojmë butonin **Parapamje** për të luajtur.", + "th": "เสร็จแล้ว!\nมาทดสอบเกมของเราและลองเก็บแอปเปิ้ลโดยการเดินผ่านมัน\n\nคลิกที่ปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "uk": "Готово!\nДавайте протестуємо нашу гру і спробуємо підібрати яблуко, пройшовши по ньому.\n\nНатиснемо кнопку **Попередній перегляд**, щоб почати гру.", + "zh": "我们完成了!\n让我们测试游戏,尝试通过走过苹果来捡起它。\n\n点击**预览**按钮开始游戏。" + } + } + }, + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true + } + } + ], + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد انتهيت من هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai completato questa lezione!", + "tr": "# Bu dersi tamamladınız!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 마쳤습니다!", + "pl": "# Zakończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณได้เสร็จสิ้นบทเรียนนี้แล้ว!", + "ru": "# Вы завершили это урок!", + "sl": "# Dokončali ste ta pouk!", + "sq": "# Keni përfunduar këtë mësim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你已完成本课程!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, dans ce tutoriel vous avez appris comment :", + "ar": "أحسنت، في هذا الدرس التعليمي تعلمت كيفية :", + "de": "Gut gemacht, in diesem Tutorial haben Sie gelernt, wie Sie:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derste şunları öğrendiniz:", + "ja": "お疲れ様です、このチュートリアルでは以下の方法を学びました:", + "ko": "잘 했어요, 이 튜토리얼에서는 다음을 배웠습니다:", + "pl": "Dobrze wykonane, w tym samouczku nauczyłeś się, jak:", + "pt": "Bem feito, neste tutorial você aprendeu como:", + "th": "เก่งมาก เรียนรู้วิธีทำดังนี้ในบทแนะนำนี้", + "ru": "Отлично сработано, в этом учебнике вы узнали, как:", + "sl": "Dobro opravljeno, v tem vadnem programu ste se naučili, kako:", + "sq": "Mirë, në këtë udhëzues keni mësuar si të:", + "uk": "Добре зроблено, у цьому підручнику ви вивчили, як:", + "zh": "干得好,在这个教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to paint on a Tilemap object\n- How to edit the collisions on a Tilemap object\n- How to use the events to act on the Tilemap object", + "fr": "- Comment peindre sur un objet Tilemap\n- Comment modifier les collisions sur un objet Tilemap\n- Comment utiliser les événements pour agir sur un objet Tilemap", + "ar": "- كيفية الطلاء على كائن Tilemap\n- كيفية تحرير التصادمات على كائن Tilemap\n- كيفية استخدام الأحداث للتأثير على كائن Tilemap", + "de": "- Wie man auf einem Tilemap-Objekt malt\n- Wie man die Kollisionen auf einem Tilemap-Objekt bearbeitet\n- Wie man Ereignisse verwendet, um auf ein Tilemap-Objekt einzuwirken", + "es": "- Cómo pintar en un objeto Tilemap\n- Cómo editar las colisiones en un objeto Tilemap\n- Cómo usar los eventos para actuar sobre un objeto Tilemap", + "fi": "- Miten maalataan Tilemap-objektiin\n- Miten muokataan törmäykset Tilemap-objektissa\n- Miten käytetään tapahtumia vaikuttamaan Tilemap-objektiin", + "it": "- Come dipingere su un oggetto Tilemap\n- Come modificare le collisioni su un oggetto Tilemap\n- Come usare gli eventi per agire su un oggetto Tilemap", + "tr": "- Bir Tilemap nesnesine nasıl boyanır\n- Bir Tilemap nesnesindeki çarpışmaları nasıl düzenlenir\n- Bir Tilemap nesnesinde etki etmek için olayların nasıl kullanılacağı", + "ja": "- Tilemapオブジェクトにペイントする方法\n- Tilemapオブジェクトの衝突を編集する方法\n- イベントを使用してTilemapオブジェクトに作用する方法", + "ko": "- Tilemap 객체에 페인트하는 방법\n- Tilemap 객체의 충돌을 편집하는 방법\n- 이벤트를 사용하여 Tilemap 객체에 작용하는 방법", + "pl": "- Jak malować na obiekcie Tilemap\n- Jak edytować kolizje na obiekcie Tilemap\n- Jak używać zdarzeń, aby działać na obiekcie Tilemap", + "pt": "- Como pintar em um objeto Tilemap\n- Como editar as colisões em um objeto Tilemap\n- Como usar os eventos para agir no objeto Tilemap", + "ru": "- Как рисовать на объекте Tilemap\n- Как редактировать коллизии на объекте Tilemap\n- Как использовать события для воздействия на объект Tilemap", + "sl": "- Kako slikati na Tilemap objektu\n- Kako urediti trke na Tilemap objektu\n- Kako uporabiti dogodke za delovanje na Tilemap objektu", + "sq": "- Si pikturoj në një objekt Tilemap\n- Si modifikoj përplasjet në një objekt Tilemap\n- Si të përdorim ngjarjet për të vepruar mbi një objekt Tilemap", + "th": "- วิธีการวาดบนวัตถุ Tilemap\n- วิธีการแก้ไขการชนบนวัตถุ Tilemap\n- วิธีการใช้อีเวนต์เพื่อกระทำต่อวัตถุ Tilemap", + "uk": "- Як малювати на об'єкті Tilemap\n- Як редагувати зіткнення на об'єкті Tilemap\n- Як використовувати події для впливу на об'єкт Tilemap", + "zh": "- 如何在 Tilemap 对象上绘画\n- 如何编辑 Tilemap 对象上的碰撞\n- 如何使用事件来作用于 Tilemap 对象" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des éléments à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir añadiendo cosas a este juego o publicarlo!", + "fi": "Voit jatkaa tämän pelin lisäämistä tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、それを公開することができます!", + "ko": "이 게임에 계속해서 새로운 요소를 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "th": "คุณสามารถเพิ่มสิ่งต่างๆในเกมนี้ต่อได้หรือตีพิมพ์!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni atë!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续添加内容到这个游戏中或发布它!" + } + } + ] + } +} \ No newline at end of file diff --git a/tutorials/in-app/timer.json b/tutorials/in-app/timer.json new file mode 100644 index 0000000..a104fe6 --- /dev/null +++ b/tutorials/in-app/timer.json @@ -0,0 +1,1323 @@ +{ + "id": "timer", + "titleByLocale": { + "en": "Let's use time to measure a score", + "fr": "Utilisons le temps pour mesurer un score", + "ar": "لنستخدم الوقت لقياس النتيجة", + "de": "Lass uns die Zeit nutzen, um eine Punktzahl zu messen", + "es": "Usemos el tiempo para medir una puntuación", + "fi": "Käytetään aikaa pistemäärän mittaamiseen", + "it": "Usiamo il tempo per misurare un punteggio", + "tr": "Bir puanı ölçmek için zamanı kullanalım", + "ja": "スコアを測定するために時間を使いましょう", + "ko": "시간을 사용하여 점수를 측정합시다", + "pl": "Użyjmy czasu do pomiaru wyniku", + "pt": "Vamos usar o tempo para medir uma pontuação", + "th": "มาใช้เวลาในการวัดคะแนนกันเถอะ", + "ru": "Используем время для измерения счета", + "sl": "Uporabimo čas za merjenje rezultata", + "sq": "Le të përdorim kohën për të matur një rezultat", + "uk": "Використаймо час для вимірювання результату", + "zh": "让我们用时间来衡量分数" + }, + "bulletPointsByLocale": [ + { + "en": "Create and modify a text", + "fr": "Créer et modifier un texte", + "ar": "إنشاء نص وتعديله", + "de": "Einen Text erstellen und ändern", + "es": "Crear y modificar un texto", + "fi": "Luo ja muokkaa tekstiä", + "it": "Creare e modificare un testo", + "tr": "Bir metin oluşturun ve değiştirin", + "ja": "テキストを作成および変更する", + "ko": "텍스트를 생성하고 수정하기", + "pl": "Utwórz i zmodyfikuj tekst", + "pt": "Criar e modificar um texto", + "th": "สร้างและแก้ไขข้อความ", + "ru": "Создавать и изменять текст", + "sl": "Ustvarite in spremenite besedilo", + "sq": "Krijoni dhe modifikoni një tekst", + "uk": "Створювати та змінювати текст", + "zh": "创建和修改文本" + }, + { + "en": "Start a timer", + "fr": "Démarrer un minuteur", + "ar": "بدء مؤقت", + "de": "Einen Timer starten", + "es": "Iniciar un temporizador", + "fi": "Käynnistä ajastin", + "it": "Avviare un timer", + "tr": "Bir zamanlayıcı başlatın", + "ja": "タイマーを開始する", + "ko": "타이머 시작하기", + "pl": "Uruchom minutnik", + "pt": "Iniciar um temporizador", + "th": "เริ่มจับเวลา", + "ru": "Запустить таймер", + "sl": "Začnite časovnik", + "sq": "Nisni një kronometër", + "uk": "Запустити таймер", + "zh": "启动计时器" + }, + { + "en": "Use the timer to display a score", + "fr": "Utiliser le minuteur pour afficher un score", + "ar": "استخدم المؤقت لعرض النتيجة", + "de": "Verwenden Sie den Timer, um eine Punktzahl anzuzeigen", + "es": "Usar el temporizador para mostrar una puntuación", + "fi": "Käytä ajastinta näyttämään pistemäärä", + "it": "Usa il timer per visualizzare un punteggio", + "tr": "Zamanlayıcıyı bir puanı göstermek için kullanın", + "ja": "タイマーを使用してスコアを表示する", + "ko": "타이머를 사용하여 점수 표시하기", + "pl": "Użyj minutnika do wyświetlania wyniku", + "pt": "Usar o temporizador para exibir uma pontuação", + "th": "ใช้ตัวจับเวลาเพื่อแสดงคะแนน", + "ru": "Используйте таймер для отображения счета", + "sl": "Uporabite časovnik za prikaz rezultata", + "sq": "Përdorni kronometrin për të shfaqur një rezultat", + "uk": "Використовуйте таймер для відображення рахунку", + "zh": "使用计时器显示分数" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene": "gameScene" + }, + "SwitchToEvents1": { + "editor": "EventsSheet", + "scene": "gameScene" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/timer/game.json", + "initialProjectData": { + "gameScene": "GameScene" + }, + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد أنهيت هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai finito questa lezione!", + "tr": "# Bu dersi bitirdiniz!", + "ja": "# このレッスンは終了です!", + "ko": "# 이 레슨을 완료했습니다!", + "pl": "# Ukończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "ru": "# Вы завершили этот урок!", + "sl": "# Končali ste to lekcijo!", + "sq": "# Keni përfunduar këtë mësim!", + "th": "# คุณเรียนบทเรียนนี้จบแล้ว!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你完成了这节课!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned:", + "fr": "Bien joué, dans ce tutoriel vous avez appris :", + "ar": "أحسنت، تعلمنا في هذا البرنامج التعليمي كيفية:", + "de": "Gut gemacht, in diesem Tutorial hast du gelernt:", + "es": "¡Bien hecho, en este tutorial aprendiste:", + "fi": "Hyvin tehty, tässä oppitunnissa opit:", + "it": "Ben fatto, in questo tutorial hai imparato:", + "tr": "Tebrikler, bu derste öğrendikleriniz:", + "ja": "このチュートリアルでは、次のことを学びました:", + "ko": "이 튜토리얼에서 다음을 배웠습니다:", + "pl": "Dobrze zrobiłeś, w tym samouczku nauczyłeś się:", + "pt": "Bem feito, neste tutorial você aprendeu:", + "ru": "Молодец, в этом уроке вы узнали:", + "sl": "Bravo, v tem vadnici ste se naučili:", + "sq": "Mirë, në këtë tutorial ju keni mësuar:", + "th": "ทำได้ดีเยี่ยม, สิ่งที่คุณได้เรียนรู้จากบทเรียนนี้:", + "uk": "Молодець, в цьому уроці ви дізналися:", + "zh": "做得好,通过这个教程,你学到了:" + } + }, + { + "messageByLocale": { + "en": "- Create a text\n\n- Create and start a timer\n\n- Use a timer's value to update a text", + "fr": "- Créer un texte\n\n- Créer et démarrer un chronomètre\n\n- Utiliser la valeur d'un chronomètre pour mettre à jour un texte", + "ar": "- إنشاء نص\n\n- إنشاء وتشغيل مؤقت\n\n- استخدام قيمة المؤقت لتحديث النص", + "de": "- Erstellen Sie einen Text\n\n- Erstellen und starten Sie einen Timer\n\n- Verwenden Sie den Wert eines Timers, um einen Text zu aktualisieren", + "es": "- Crear un texto\n\n- Crear y comenzar un temporizador\n\n- Utilizar el valor de un temporizador para actualizar un texto", + "fi": "- Luo teksti\n\n- Luo ja käynnistä ajastin\n\n- Käytä ajastimen arvoa päivittääksesi tekstiä", + "it": "- Creare un testo\n\n- Creare e avviare un timer\n\n- Utilizzare il valore di un timer per aggiornare un testo", + "tr": "- Bir metin oluşturun\n\n- Bir zamanlayıcı oluşturun ve başlatın\n\n- Bir zamanlayıcının değerini bir metni güncellemek için kullanın", + "ja": "- テキストを作成する\n\n- タイマーを作成して開始する\n\n- タイマーの値を使用してテキストを更新する", + "ko": "- 텍스트 만들기\n\n- 타이머 만들고 시작하기\n\n- 타이머의 값 사용하여 텍스트 업데이트하기", + "pl": "- Utwórz tekst\n\n- Utwórz i uruchom minutnik\n\n- Użyj wartości minutnika do aktualizacji tekstu", + "pt": "- Crie um texto\n\n- Crie e inicie um cronômetro\n\n- Use o valor de um cronômetro para atualizar um texto", + "ru": "- Создать текст\n\n- Создать и запустить таймер\n\n- Использовать значение таймера для обновления текста", + "sl": "- Ustvarite besedilo\n\n- Ustvarite in začnite štoparico\n\n- Uporabite vrednost štoparice za posodobitev besedila", + "sq": "- Krijo një tekst\n\n- Krijo dhe fillo një kohëmatës\n\n- Përdor vlerën e një kohëmatësi për të përditësuar një tekst", + "th": "- สร้างข้อความ\n\n- สร้างและเริ่มต้นตัวจับเวลา\n\n- ใช้ค่าของตัวจับเวลาเพื่ออัปเดตข้อความ", + "uk": "- Створити текст\n\n- Створити та запустити таймер\n\n- Використовувати значення таймера для оновлення тексту", + "zh": "- 创建文本\n\n- 创建并启动计时器\n\n- 使用计时器的值更新文本" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des choses à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir agregando cosas a este juego o publicarlo !", + "fi": "Voit jatkaa asioiden lisäämistä tähän peliin tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye veya yayınlamaya devam edebilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、公開することができます!", + "ko": "이 게임에 계속해서 새로운 것을 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "ru": "Вы можете продолжать добавлять в эту игру новые элементы или опубликовать её!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni!", + "th": "คุณสามารถพัฒนาเกมนี้ต่อไปหรือจะเผยแพร่เลยก็ได้!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续为这个游戏添加东西,或者发布它!" + } + } + ] + }, + "flow": [ + { + "id": "Start", + "elementToHighlightId": "#toolbar-preview-button", + "tooltip": { + "description": { + "messageByLocale": { + "en": "This game is a speed game, but it's missing a timer!\n\nLet's see the current state of the game, click on the **preview** button to try it out.", + "fr": "Ce jeu est un jeu de rapidité, mais il lui manque un chronomètre !\n\nVoyons l'état actuel du jeu, cliquez sur le bouton **aperçu** pour l'essayer.", + "ar": "هذه لعبة سرعة، لكنها تفتقر إلى المؤقت!\n\nدعونا نرى الحالة الحالية للعبة، اضغط على زر **المعاينة** لتجربتها.", + "de": "Dieses Spiel ist ein Geschwindigkeitsspiel, aber es fehlt ein Timer!\n\nSehen wir uns den aktuellen Stand des Spiels an, klicken Sie auf die **Vorschau**-Schaltfläche, um es auszuprobieren.", + "es": "¡Este juego es de velocidad, pero le falta un temporizador!\n\nVeamos el estado actual del juego, haz clic en el botón **previsualización** para probarlo.", + "fi": "Tämä on nopeuspeli, mutta siitä puuttuu ajastin!\n\nKatsotaan pelin nykyinen tila, napsauta **esikatselu**-painiketta kokeillaksesi sitä.", + "it": "Questo è un gioco di velocità, ma manca un timer!\n\nVediamo lo stato attuale del gioco, clicca sul pulsante **anteprima** per provarlo.", + "tr": "Bu bir hız oyunu, ancak bir zamanlayıcı eksik!\n\nOyunun mevcut durumunu görelim, denemek için **önizleme** düğmesine tıklayın.", + "ja": "このゲームはスピードゲームですが、タイマーがありません!\n\nゲームの現在の状態を見てみましょう。**プレビュー** ボタンをクリックして試してみてください。", + "ko": "이 게임은 속도 게임이지만 타이머가 없습니다!\n\n게임의 현재 상태를 확인해 보세요. **미리보기** 버튼을 클릭하여 시도해보세요.", + "pl": "Ta gra to gra na szybkość, ale brakuje jej timera!\n\nZobaczmy aktualny stan gry, kliknij przycisk **podgląd**, aby ją wypróbować.", + "pt": "Este é um jogo de velocidade, mas está faltando um cronômetro!\n\nVamos ver o estado atual do jogo, clique no botão **pré-visualização** para experimentá-lo.", + "ru": "Эта игра на скорость, но в ней отсутствует таймер!\n\nДавайте посмотрим на текущее состояние игры, нажмите кнопку **предпросмотр**, чтобы попробовать.", + "sl": "Ta igra je hitrostna igra, vendar ji manjka časovnik!\n\nPoglejmo si trenutno stanje igre, kliknite gumb **predogled**, da jo preizkusite.", + "sq": "Kjo është një lojë shpejtësie, por i mungon një kohëmatës!\n\nLe të shohim gjendjen aktuale të lojës, klikoni butonin **parashikim** për ta provuar.", + "th": "นี่เป็นเกมที่เน้นความเร็ว แต่ยังขาดตัวจับเวลา!\n\nลองดูสถานะปัจจุบันของเกม คลิกที่ปุ่ม **ดูตัวอย่าง** เพื่อลองเล่น", + "uk": "Це гра на швидкість, але їй не вистачає таймера!\n\nДавайте подивимося на поточний стан гри, натисніть кнопку **попередній перегляд**, щоб спробувати.", + "zh": "这个游戏是一个速度游戏,但缺少计时器!\n\n让我们看看游戏的当前状态,点击 **预览** 按钮试试看。" + } + } + }, + "nextStepTrigger": { + "previewLaunched": true, + "inGameMessagePosition": "top-right", + "inGameMessage": { + "messageByLocale": { + "en": "Use your mouse or finger to slide the key to the keyhole, while staying inside the path!\n\nWhen you've tried it out, close this window and return to the editor to start adding a timer.", + "fr": "Utilisez votre souris ou votre doigt pour faire glisser la clé vers la serrure, tout en restant à l'intérieur du chemin !\n\nUne fois que vous avez essayé, fermez cette fenêtre et revenez à l'éditeur pour commencer à ajouter un minuteur.", + "ar": "استخدم الماوس أو إصبعك لتحريك المفتاح إلى ثقب المفتاح، مع البقاء داخل المسار!\n\nعندما تجرب ذلك، أغلق هذه النافذة وعد إلى المحرر لبدء إضافة مؤقت.", + "de": "Benutze deine Maus oder deinen Finger, um den Schlüssel in das Schlüsselloch zu schieben, während du innerhalb des Pfades bleibst!\n\nWenn du es ausprobiert hast, schließe dieses Fenster und kehre zum Editor zurück, um mit dem Hinzufügen eines Timers zu beginnen.", + "es": "Usa el ratón o el dedo para deslizar la llave hacia el ojo de la cerradura, ¡manteniéndote dentro del camino!\n\nCuando lo hayas probado, cierra esta ventana y regresa al editor para empezar a añadir un temporizador.", + "fi": "Käytä hiirtä tai sormeasi liu'uttaaksesi avaimen avaimenreikään pysyen polun sisällä!\n\nKun olet kokeillut sitä, sulje tämä ikkuna ja palaa editoriin aloittaaksesi ajastimen lisäämisen.", + "it": "Usa il mouse o il dito per far scorrere la chiave nella serratura, rimanendo all'interno del percorso!\n\nDopo averlo provato, chiudi questa finestra e torna all'editor per iniziare ad aggiungere un timer.", + "tr": "Yolu takip ederek anahtarı anahtar deliğine kaydırmak için farenizi veya parmağınızı kullanın!\n\nDenedikten sonra, bu pencereyi kapatın ve bir zamanlayıcı eklemeye başlamak için düzenleyiciye geri dönün.", + "ja": "マウスまたは指を使って、パスの内側にとどまりながら、鍵を鍵穴にスライドさせてください!\n\n試したら、このウィンドウを閉じてエディターに戻り、タイマーの追加を開始してください。", + "ko": "마우스나 손가락을 사용하여 경로 안쪽에 머물면서 열쇠를 열쇠 구멍으로 밀어 넣으세요!\n\n시도해 보셨으면 이 창을 닫고 편집기로 돌아가 타이머 추가를 시작하세요.", + "pl": "Użyj myszy lub palca, aby przesunąć klucz do dziurki od klucza, pozostając na ścieżce!\n\nPo wypróbowaniu zamknij to okno i wróć do edytora, aby rozpocząć dodawanie timera.", + "pt": "Use o mouse ou o dedo para deslizar a chave para o buraco da fechadura, mantendo-se dentro do caminho!\n\nDepois de experimentar, feche esta janela e volte para o editor para começar a adicionar um cronômetro.", + "ru": "Используйте мышь или палец, чтобы вставить ключ в замочную скважину, оставаясь внутри пути!\n\nПопробовав, закройте это окно и вернитесь в редактор, чтобы начать добавлять таймер.", + "sl": "Uporabi miško ali prst, da potisneš ključ v ključavnico, pri tem pa ostani znotraj poti!\n\nKo preizkusiš, zapri to okno in se vrni v urejevalnik, da začneš dodajati časovnik.", + "sq": "Përdorni miun ose gishtin për të rrëshqitur çelësin në vrimën e çelësit, duke qëndruar brenda shtegut!\n\nPasi ta provoni, mbyllni këtë dritare dhe kthehuni te redaktori për të filluar shtimin e një kohëmatësi.", + "th": "ใช้เมาส์หรือนิ้วของคุณเลื่อนกุญแจไปยังรูกุญแจ โดยอยู่ในเส้นทาง!\n\nเมื่อคุณลองแล้ว ให้ปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไขเพื่อเริ่มเพิ่มตัวจับเวลา", + "uk": "Використовуйте мишу або палець, щоб вставити ключ у замкову щілину, залишаючись у межах шляху!\n\nСпробувавши, закрийте це вікно та поверніться до редактора, щоб почати додавати таймер.", + "zh": "使用鼠标或手指将钥匙滑动到钥匙孔中,同时保持在路径内!\n\n尝试后,关闭此窗口并返回编辑器以开始添加计时器。" + } + } + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト** パネルを開きます。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开 **对象** 面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "#add-new-object-button", + "nextStepTrigger": { + "presenceOfElement": "#new-object-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "First, let's create some text to display the time spent playing the level. Click on the **Add new object** button.", + "fr": "Tout d'abord, créons du texte pour afficher le temps passé à jouer au niveau. Cliquez sur le bouton **Ajouter un nouvel objet**.", + "ar": "أولًا، هيّا نقوم بإنشاء بعض النصوص لعرض الوقت المنقضي في لعب هذه المرحلة. الضغط على الزر **إضافة كائن جديد**. ", + "de": "Zuerst erstellen wir einen Text, um die verbrachte Zeit beim Spielen des Levels anzuzeigen. Klicken Sie auf die Schaltfläche **Neues Objekt hinzufügen**.", + "es": "Primero, creemos un texto para mostrar el tiempo que se ha pasado jugando al nivel. Haga clic en el botón **Agregar nuevo objeto**.", + "fi": "Ensinnäkin luodaan teksti näyttämään aikaa, joka on kulunut tason pelaamiseen. Klikkaa **Lisää uusi objekti** -painiketta.", + "it": "Innanzitutto, creiamo un testo per visualizzare il tempo trascorso a giocare al livello. Clicca sul pulsante **Aggiungi nuovo oggetto**.", + "tr": "Öncelikle, seviyeyi oynarken geçirilen süreyi göstermek için bir metin oluşturalım. **Yeni nesne ekle** düğmesine tıklayın.", + "ja": "まず、レベルをプレイした時間を表示するためのテキストを作成しましょう。 **新しいオブジェクトを追加** ボタンをクリックします。", + "ko": "먼저, 레벨을 플레이한 시간을 표시할 텍스트를 만들어 보겠습니다. **새 오브젝트 추가** 버튼을 클릭하세요.", + "pl": "Najpierw stwórzmy jakiś tekst, aby wyświetlić czas spędzony na graniu w poziomie. Kliknij przycisk **Dodaj nowy obiekt**.", + "pt": "Primeiro, vamos criar um texto para exibir o tempo gasto jogando o nível. Clique no botão **Adicionar novo objeto**.", + "ru": "Сначала создадим текст для отображения времени, проведенного в игре. Нажмите на кнопку **Добавить новый объект**.", + "sl": "Najprej ustvarimo nekaj besedila, da prikažemo preživeti čas igranja ravni. Kliknite na gumb **Dodaj nov predmet**.", + "sq": "Fillimisht, le të krijojmë disa tekst për të shfaqur kohën e kaluar duke luajtur nivelin. Klikoni në butonin **Shto një objekt të ri**.", + "th": "เริ่มต้นกันด้วยการสร้างข้อความเพื่อแสดงเวลาที่ใช้ในการเล่นเกม คลิกที่ปุ่ม **เพิ่มวัตถุใหม่**", + "uk": "Спочатку створимо деякий текст для відображення часу, проведеного в грі. Натисніть на кнопку **Додати новий об'єкт**.", + "zh": "首先,让我们创建一些文本来显示在游戏中花费的时间。 点击 **添加新对象** 按钮。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#new-object-from-scratch-tab", + "nextStepTrigger": { + "presenceOfElement": "#object-category-TextObject--Text" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We'll create a text from scratch.", + "fr": "Nous allons créer un texte à partir de zéro.", + "ar": "سوف نقوم بإنشاء نص من الصفر.", + "de": "Wir erstellen einen Text von Grund auf.", + "es": "Vamos a crear un texto desde cero.", + "fi": "Luodaan teksti alusta alkaen.", + "it": "Creeremo un testo da zero.", + "tr": "Sıfırdan bir metin oluşturacağız.", + "ja": "ゼロからテキストを作成します。", + "ko": "처음부터 텍스트를 만들어 보겠습니다.", + "pl": "Stworzymy tekst od zera.", + "pt": "Vamos criar um texto do zero.", + "ru": "Мы создадим текст с нуля.", + "sl": "Ustvarili bomo besedilo od začetka.", + "sq": "Do të krijojmë një tekst nga e para.", + "th": "เราจะสร้างข้อความใหม่", + "uk": "Ми створимо текст з нуля.", + "zh": "我们将从头开始创建一个文本。" + } + }, + "placement": "bottom" + }, + "skippable": true, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#object-category-TextObject--Text", + "nextStepTrigger": { + "presenceOfElement": "#object-name" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **Text** object", + "fr": "Sélectionnez l'objet **Texte**", + "ar": "تحديد الكائن **نص**", + "de": "Wählen Sie das **Text**-Objekt aus", + "es": "Seleccione el objeto **Texto**", + "fi": "Valitse **Teksti**-objekti", + "it": "Seleziona l'oggetto **Testo**", + "tr": "**Metin** nesnesini seçin", + "ja": "**テキスト** オブジェクトを選択します", + "ko": "**텍스트** 오브젝트를 선택하세요", + "pl": "Wybierz obiekt **Tekst**", + "pt": "Selecione o objeto **Texto**", + "ru": "Выберите объект **Текст**", + "sl": "Izberite **Besedilo** predmet", + "sq": "Zgjidh **Tekstin** objekt", + "th": "เลือกวัตถุ **ข้อความ**", + "uk": "Виберіть об'єкт **Текст**", + "zh": "选择 **文本** 对象" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#object-name", + "nextStepTrigger": { + "valueEquals": "Score" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Change the object name to **Score**.", + "fr": "Utilisez **Score** comme nom d'objet.", + "ar": "تغيير اسم الكائن إلى **Score**.", + "de": "Ändern Sie den Objektnamen in **Score**.", + "es": "Cambie el nombre del objeto a **Score**.", + "fi": "Vaihda objektin nimi **Score**.", + "it": "Cambia il nome dell'oggetto in **Punteggio**.", + "tr": "Nesne adını **Puan** olarak değiştirin.", + "ja": "オブジェクト名を **スコア** に変更します。", + "ko": "객체 이름을 **점수**로 변경하세요.", + "pl": "Zmień nazwę obiektu na **Wynik**.", + "pt": "Mude o nome do objeto para **Score**.", + "ru": "Измените имя объекта на **Счет**.", + "sl": "Spremenite ime predmeta v **Rezultat**.", + "sq": "Ndryshoni emrin e objektit në **Pikë**.", + "th": "เปลี่ยนชื่อวัตถุเป็น **Score**", + "uk": "Змініть назву об'єкта на **Рахунок**.", + "zh": "将对象名称更改为 **分数**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#text-object-font-size", + "nextStepTrigger": { + "valueEquals": "50" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Change the font size to **50**.", + "fr": "Utilisez une taille de **50**.", + "ar": "تغيير حجم الخط إلى **50**.", + "de": "Ändern Sie die Schriftgröße auf **50**.", + "es": "Cambie el tamaño de fuente a **50**.", + "fi": "Vaihda fontin koko **50**.", + "it": "Cambia la dimensione del carattere in **50**.", + "tr": "Yazı tipi boyutunu **50** olarak değiştirin.", + "ja": "フォントサイズを **50** に変更します。", + "ko": "글꼴 크기를 **50**으로 변경하세요.", + "pl": "Zmień rozmiar czcionki na **50**.", + "pt": "Mude o tamanho da fonte para **50**.", + "ru": "Измените размер шрифта на **50**.", + "sl": "Spremenite velikost pisave v **50**.", + "sq": "Ndryshoni madhësinë e shkronjave në **50**.", + "th": "เปลี่ยนขนาดตัวอักษรเป็น **50**", + "uk": "Змініть розмір шрифту на **50**.", + "zh": "将字体大小更改为 **50**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#text-object-initial-text", + "nextStepTrigger": { + "valueEquals": "0" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Change the initial text to **0**, and we'll update it later!", + "fr": "Changeons la valeur initiale à **0**, et nous allons le mettre à jour ensuite !", + "ar": "تغيير حالة النص إلى **0**، وسنقوم بتحديثها لاحقًا!", + "de": "Ändern Sie den Anfangstext in **0**, und wir werden ihn später aktualisieren!", + "es": "Cambie el texto inicial a **0**, ¡y lo actualizaremos más tarde!", + "fi": "Vaihda alkuteksti **0**:ksi, ja päivitämme sen myöhemmin!", + "it": "Cambia il testo iniziale in **0**, e lo aggiorneremo più tardi!", + "tr": "Başlangıç metnini **0** olarak değiştirin ve daha sonra güncelleyeceğiz!", + "ja": "初期テキストを **0** に変更し、後で更新します!", + "ko": "초기 텍스트를 **0**으로 변경하고 나중에 업데이트하겠습니다!", + "pl": "Zmień początkowy tekst na **0**, a my go później zaktualizujemy!", + "pt": "Mude o texto inicial para **0**, e atualizaremos mais tarde!", + "ru": "Измените начальный текст на **0**, и мы обновим его позже!", + "sl": "Spremenite začetno besedilo v **0**, in ga bomo kasneje posodobili!", + "sq": "Ndryshoni tekstin fillestar në **0**, dhe ne do ta përditësojmë më vonë!", + "th": "เปลี่ยนข้อความเริ่มต้นเป็น **0** และเราจะอัปเดตมันในภายหลัง!", + "uk": "Змініть початковий текст на **0**, і ми оновимо його пізніше!", + "zh": "将初始文本更改为 **0**,我们稍后会更新它!" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#object-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#object-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done.", + "fr": "Nous avons terminé.", + "ar": "انتهينا.", + "de": "Wir sind fertig.", + "es": "Hemos terminado.", + "fi": "Olemme valmiit.", + "it": "Abbiamo finito.", + "tr": "Bitti.", + "ja": "完了です。", + "ko": "끝났습니다.", + "pl": "Skończyliśmy.", + "pt": "Terminamos.", + "ru": "Мы закончили.", + "sl": "Končali smo.", + "sq": "Kemi përfunduar.", + "th": "เราเสร็จแล้ว", + "uk": "Ми закінчили.", + "zh": "我们完成了。" + } + } + }, + "mapProjectData": { + "scoreText": "sceneLastObjectName:gameScene" + } + }, + { + "elementToHighlightId": "#toolbar-open-objects-panel-button", + "nextStepTrigger": { + "presenceOfElement": "#add-new-object-button" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Open the **Objects** panel.", + "fr": "Ouvrez le panneau des **objets**.", + "ar": "فتح لوحة **الكائنات**.", + "de": "Öffnen Sie das **Objekte**-Panel.", + "es": "Abre el panel de **objetos**.", + "fi": "Avaa **Objektit**-paneeli.", + "it": "Apri il pannello **Oggetti**.", + "tr": "**Nesneler** panelini açın.", + "ja": "**オブジェクト**パネルを開いてください。", + "ko": "**오브젝트** 패널을 엽니다.", + "pl": "Otwórz panel **Obiekty**.", + "pt": "Abra o painel de **objetos**.", + "ru": "Откройте панель **Объекты**.", + "sl": "Odpri panel **Predmeti**.", + "sq": "Hapni panelin e **objekteve**.", + "th": "เปิดแผงควบคุม **วัตถุ**", + "uk": "Відкрийте панель **Об'єкти**.", + "zh": "打开**对象**面板。" + } + }, + "placement": "bottom" + }, + "skippable": true + }, + { + "elementToHighlightId": "objectInObjectsList:scoreText", + "nextStepTrigger": { + "instanceAddedOnScene": "scoreText" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Drag $(scoreText) into the **scene**.", + "fr": "Faites glisser $(scoreText) du menu au canvas.", + "ar": "سحب $(scoreText) إلى **المشهد**.", + "de": "Ziehen Sie $(scoreText) in die **Szene**.", + "es": "Arrastre $(scoreText) al **escenario**.", + "fi": "Vedä $(scoreText) **kenttään**.", + "it": "Trascina $(scoreText) nella **scena**.", + "tr": "$(scoreText)'i **sahne**ye sürükleyin.", + "ja": "$(scoreText) を **シーン** にドラッグします。", + "ko": "$(scoreText)를 **씬**으로 드래그하세요.", + "pl": "Przeciągnij $(scoreText) na **poziom**.", + "pt": "Arraste $(scoreText) para a **cena**.", + "ru": "Перетащите $(scoreText) в **сцену**.", + "sl": "Povlecite $(scoreText) v **prizorišče**.", + "sq": "Tërhiqni $(scoreText) në **skenë**.", + "th": "ลาก $(scoreText) ไปยัง **ฉาก**", + "uk": "Перетягніть $(scoreText) в **сцену**.", + "zh": "将 $(scoreText) 拖到 **场景** 中。" + } + }, + "touchDescription": { + "messageByLocale": { + "en": "**Select** then **drag** $(scoreText) into the **scene**.", + "fr": "**Sélectionnez** puis **faites glisser** $(scoreText) du menu au canvas.", + "ar": "**تحديد** ثم **سحب** الـ $(scoreText) إلى **المشهد**.", + "de": "**Wählen** und **ziehen** Sie $(scoreText) in die **Szene**.", + "es": "**Seleccione** y **arrastrar** $(scoreText) al **escenario**.", + "fi": "**Valitse** ja **vedä** $(scoreText) **kenttään**.", + "it": "**Seleziona** e **trascina** $(scoreText) nella **scena**.", + "tr": "**Seç** ve ardından $(scoreText)'i **sahne**ye **sürükleyin**.", + "ja": "**$(scoreText)** を **シーン** に **選択** して **ドラッグ** します。", + "ko": "**$(scoreText)**를 **씬**으로 **선택**한 후 **드래그**하세요.", + "pl": "**Wybierz** a następnie **przeciągnij** $(scoreText) na **poziom**.", + "pt": "**Selecione** e **arraste** $(scoreText) para a **cena**.", + "ru": "**Выберите** и **перетащите** $(scoreText) в **сцену**.", + "sl": "**Izberite** in **povlecite** $(scoreText) v **prizorišče**.", + "sq": "**Zgjidhni** dhe **tërhiqni** $(scoreText) në **skenë**.", + "th": "**เลือก** แล้ว **ลาก** $(scoreText) ไปยัง **ฉาก**", + "uk": "**Виберіть** та **перетягніть** $(scoreText) в **сцену**.", + "zh": "**选择** 然后 **拖动** $(scoreText) 到 **场景** 中。" + } + }, + "placement": "top" + }, + "interactsWithCanvas": true, + "disableBlockingLayer": true + }, + { + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "I'm done", + "fr": "J'ai terminé", + "ar": "انتهيت", + "de": "Ich bin fertig", + "es": "He terminado", + "fi": "Olen valmis", + "it": "Ho finito", + "tr": "Bitti", + "ja": "完了", + "ko": "완료", + "pl": "Skończyłem", + "pt": "Terminei", + "ru": "Я закончил", + "sl": "Končal sem", + "sq": "Përfundova", + "th": "เสร็จแล้ว", + "uk": "Я закінчив", + "zh": "我完成了" + } + } + }, + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "Place the $(scoreText) at the top right of the screen, so that the player can see their score while they play.\n\nWhen you're done, click on the button below.", + "fr": "Placez $(scoreText) en haut à droite de l'écran, de sorte que le joueur puisse voir son score pendant qu'il joue.\n\nQuand vous avez terminé, cliquez sur le bouton ci-dessous.", + "ar": "إدراج الـ $(scoreText) في أعلى يمين الشاشة، حتى يتمكن اللاعبون من رؤية وقتهم الذي قضوه في اللعب. \n\nعند الانتهاء، الضغط على الزر أدناه.", + "de": "Platzieren Sie $(scoreText) oben rechts auf dem Bildschirm, damit der Spieler seine Punktzahl sehen kann, während er spielt.\n\nWenn Sie fertig sind, klicken Sie auf die Schaltfläche unten.", + "es": "Coloque $(scoreText) en la parte superior derecha de la pantalla, para que el jugador pueda ver su puntuación mientras juega.\n\nCuando hayas terminado, haz clic en el botón de abajo.", + "fi": "Aseta $(scoreText) näytön oikeaan yläkulmaan, jotta pelaaja voi nähdä pistemääränsä pelatessaan.\n\nKun olet valmis, napsauta alla olevaa painiketta.", + "it": "Posiziona $(scoreText) in alto a destra dello schermo, in modo che il giocatore possa vedere il suo punteggio mentre gioca.\n\nQuando hai finito, clicca sul pulsante qui sotto.", + "tr": "$(scoreText)'i ekranın sağ üst köşesine yerleştirin, böylece oyuncu oynarken puanını görebilsin.\n\nBittiğinizde, aşağıdaki düğmeye tıklayın.", + "ja": "$(scoreText) を画面の右上に配置して、プレイヤーがプレイ中にスコアを見ることができるようにします。\n\n完了したら、下のボタンをクリックします。", + "ko": "화면 오른쪽 상단에 $(scoreText)를 배치하여 플레이어가 플레이하는 동안 점수를 볼 수 있도록합니다.\n\n완료되면 아래 버튼을 클릭하세요.", + "pl": "Umieść $(scoreText) w prawym górnym rogu ekranu, aby gracz mógł zobaczyć swój wynik podczas gry.\n\nGdy skończysz, kliknij przycisk poniżej.", + "pt": "Coloque $(scoreText) no canto superior direito da tela, para que o jogador possa ver sua pontuação enquanto joga.\n\nQuando terminar, clique no botão abaixo.", + "ru": "Разместите $(scoreText) в верхнем правом углу экрана, чтобы игрок мог видеть свой счет во время игры.\n\nКогда закончите, нажмите на кнопку ниже.", + "sl": "Postavite $(scoreText) v zgornjem desnem kotu zaslona, tako da lahko igralec vidi svoj rezultat med igranjem.\n\nKo končate, kliknite na spodnji gumb.", + "sq": "Vendosni $(scoreText) në këndin e djathtë të ekranit, që lojtari të mund të shohë pikët e tyre gjatë lojës.\n\nKur të keni përfunduar, klikoni në butonin më poshtë.", + "th": "วาง $(scoreText) ที่ด้านบนขวาของหน้าจอ เพื่อให้ผู้เล่นสามารถเห็นคะแนนของตนเองขณะเล่นได้\n\nเมื่อคุณเสร็จแล้ว ให้คลิกที่ปุ่มด้านล่าง", + "uk": "Розмістіть $(scoreText) в правому верхньому куті екрану, щоб гравець міг бачити свій рахунок під час гри.\n\nКоли закінчите, натисніть на кнопку нижче.", + "zh": "将 $(scoreText) 放在屏幕的右上角,这样玩家在游戏时就可以看到他们的分数。\n\n完成后,点击下面的按钮。" + } + }, + "placement": "top", + "image": { + "dataUrl": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2aWV3Qm94PSIxNC43MTQgMzEuMjkyIDQ3Mi43MTEgMzMwLjAzMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cmVjdCB4PSIxNC43MTQiIHk9IjMxLjI5MiIgd2lkdGg9IjQ3Mi43MTEiIGhlaWdodD0iMzMwLjAzMyIgc3R5bGU9ImZpbGw6IHJnYigyMTYsIDIxNiwgMjE2KTsgc3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGwtb3BhY2l0eTogMDsiLz4KICA8cmVjdCB4PSI0Mi40ODIiIHk9Ijg3LjA4MSIgd2lkdGg9IjQwMS40MDIiIGhlaWdodD0iMTkwLjYxMiIgc3R5bGU9ImZpbGw6IHJnYigyMTYsIDIxNiwgMjE2KTsgc3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGwtb3BhY2l0eTogMDsiLz4KICA8cmVjdCB4PSI4Mi4zMTgiIHk9IjEyMy41NTIiIHdpZHRoPSIzMjkuMDgxIiBoZWlnaHQ9IjE1LjE4MiIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMTA0LCAxNjEsIDIxMCk7Ii8+CiAgPHJlY3QgeD0iMzk2LjcxMSIgeT0iMTI0LjAxMSIgd2lkdGg9IjE1LjE2NSIgaGVpZ2h0PSI0My4zNTEiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEwNCwgMTYxLCAyMTApOyIvPgogIDxyZWN0IHg9IjI0NC41ODIiIHk9IjE1My40NDgiIHdpZHRoPSIxNjcuMzUzIiBoZWlnaHQ9IjE1LjE0OSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMTA0LCAxNjEsIDIxMCk7Ii8+CiAgPHJlY3QgeD0iMjI5LjEwMiIgeT0iMTUzLjU3IiB3aWR0aD0iMTQuOTM5IiBoZWlnaHQ9IjM1LjMwMyIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMTA0LCAxNjEsIDIxMCk7Ii8+CiAgPHJlY3QgeD0iODMuMzc2IiB5PSIxODkuNDk0IiB3aWR0aD0iMTYwLjA4NCIgaGVpZ2h0PSIxMi4wMDkiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEwNCwgMTYxLCAyMTApOyIvPgogIDxyZWN0IHg9IjgyLjk1OCIgeT0iMjAxLjgxMSIgd2lkdGg9IjEzLjQ4OCIgaGVpZ2h0PSIyMi41IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigxMDQsIDE2MSwgMjEwKTsiLz4KICA8cmVjdCB4PSI5Ni40NzQiIHk9IjIxMC4wNDIiIHdpZHRoPSIxNDcuOTE4IiBoZWlnaHQ9IjE0LjM1IiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigxMDQsIDE2MSwgMjEwKTsiLz4KICA8cmVjdCB4PSIyMjkuNjQ1IiB5PSIyMjQuNDg2IiB3aWR0aD0iMTQuMzI2IiBoZWlnaHQ9IjE5Ljc1OSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoMTA0LCAxNjEsIDIxMCk7Ii8+CiAgPHJlY3QgeD0iMjQ0LjE2NiIgeT0iMjMyLjI1NSIgd2lkdGg9IjE1MS43MSIgaGVpZ2h0PSIxMi4wODEiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEwNCwgMTYxLCAyMTApOyIvPgogIDxyZWN0IHg9IjM4My43NzUiIHk9IjIwOC41NDgiIHdpZHRoPSIxMi44MiIgaGVpZ2h0PSIyMy43NzUiIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDEwNCwgMTYxLCAyMTApOyIvPgogIDxlbGxpcHNlIHN0eWxlPSJzdHJva2U6IHJnYigwLCAwLCAwKTsgZmlsbDogcmdiKDIxMCwgMTYxLCAxMDQpOyIgY3g9IjM5MC4xNiIgY3k9IjIwMS41MzUiIHJ4PSIxNC40MjIiIHJ5PSIxNC4yNjIiLz4KICA8ZWxsaXBzZSBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7IGZpbGw6IHJnYigyMTAsIDE2MSwgMTA0KTsiIGN4PSI3Ni41MDQiIGN5PSIxMjkuNzA3IiByeD0iMTUuNjY0IiByeT0iMTUuNTM4Ii8+CiAgPHJlY3QgeD0iMzkwLjQ1OCIgeT0iOTAuNzk0IiB3aWR0aD0iNDguMzY1IiBoZWlnaHQ9IjI2LjA4NSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyBmaWxsOiByZ2IoNiwgMjMyLCAzNik7Ii8+Cjwvc3ZnPg==" + } + }, + "interactsWithCanvas": true + }, + { + "elementToHighlightId": "editorTab:gameScene:EventsSheet", + "nextStepTrigger": { + "presenceOfElement": "#events-editor[data-active]" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's **update this text with a timer**! Let's **open the Events Sheet** of your scene $(gameScene).", + "fr": "Maintenant, **mettons à jour ce texte avec un chronomètre** ! **Ouvrons la feuille d'événements** de votre scène $(gameScene).", + "ar": "الآن هيّا نقوم ب**تحديث هذا النص مع المؤقت**! هيّا نقوم ب**فتح صفحة الأحداث** لمشهدك $(gameScene).", + "de": "Lassen Sie uns diesen Text jetzt mit einem Timer **aktualisieren**! Öffnen Sie das **Ereignisblatt** Ihrer Szene $(gameScene).", + "es": "¡Ahora, **actualicemos este texto con un temporizador**! **Abramos la hoja de eventos** de su escena $(gameScene).", + "fi": "Nyt **päivitetään tämä teksti ajastimella**! **Avataan tapahtumataulukko** $(gameScene)-kohtauksestasi.", + "it": "Ora **aggiorniamo questo testo con un timer**! **Apriamo il foglio eventi** della tua scena $(gameScene).", + "tr": "Şimdi **bu metni bir zamanlayıcı ile güncelleyelim**! $(gameScene) sahnenizin **Olaylar Sayfasını açalım**.", + "ja": "今度は **タイマーを使ってこのテキストを更新しましょう**! **$(gameScene) シーン** の **イベントシート** を開きます。", + "ko": "이제 **타이머로 이 텍스트를 업데이트**해 보겠습니다! **$(gameScene) 씬**의 **이벤트 시트**를 엽니다.", + "pl": "Teraz **zaktualizujmy ten tekst za pomocą stopera**! **Otwórzmy Arkusz Zdarzeń** twojej sceny $(gameScene).", + "pt": "Agora, **atualizemos este texto com um temporizador**! **Abra a Planilha de Eventos** de sua cena $(gameScene).", + "ru": "Теперь давайте **обновим этот текст с помощью таймера**! **Откроем Лист событий** вашей сцены $(gameScene).", + "sl": "Zdaj **posodobimo ta besedilo s časovnikom**! **Odpri list dogodkov** svoje scene $(gameScene).", + "sq": "Tani le të **përditësojmë këtë tekst me një kohëmatës**! **Hapim fletën e ngjarjeve** të skenës suaj $(gameScene).", + "th": "ตอนนี้ **อัปเดตข้อความนี้ด้วยตัวจับเวลา**! **เปิดแผ่นงานเหตุการณ์** ของฉากของคุณ $(gameScene)", + "uk": "Тепер давайте **оновимо цей текст за допомогою таймера**! **Відкриємо Лист подій** вашої сцени $(gameScene).", + "zh": "现在让我们用一个计时器**更新这个文本**!让我们**打开你的场景 $(gameScene) 的事件表**。" + } + }, + "placement": "bottom" + } + }, + { + "id": "SwitchToEvents1", + "elementToHighlightId": "#events-editor[data-active] #event-1-conditions #add-condition-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's **add a condition** to detect when the game starts.", + "fr": "Ajoutons une **condition** pour détecter quand le jeu commence.", + "ar": "هيّا نقوم ب**إضافة شرط** لكشف وقت بدء اللعبة.", + "de": "Lassen Sie uns eine **Bedingung hinzufügen**, um zu erkennen, wann das Spiel beginnt.", + "es": "Agreguemos una **condición** para detectar cuando comienza el juego.", + "fi": "Lisätään **ehto**, jotta voimme havaita, milloin peli alkaa.", + "it": "Aggiungiamo una **condizione** per rilevare quando inizia il gioco.", + "tr": "Oyunun ne zaman başladığını algılamak için bir **koşul ekleyelim**.", + "ja": "ゲームが開始されたときを検出するために **条件を追加**しましょう。", + "ko": "게임이 시작될 때를 감지하기 위해 **조건을 추가**해 보겠습니다.", + "pl": "Dodajmy **warunek**, aby wykryć, kiedy gra się zaczyna.", + "pt": "Vamos **adicionar uma condição** para detectar quando o jogo começa.", + "ru": "Добавим **условие** для определения начала игры.", + "sl": "Dodajmo **pogoj**, da ugotovimo, kdaj se igra začne.", + "sq": "Le të **shtojmë një kusht** për të zbuluar kur fillon loja.", + "th": "เพิ่ม **เงื่อนไข** เพื่อตรวจสอบเมื่อเกมเริ่มต้น", + "uk": "Давайте **додамо умову**, щоб виявити, коли гра починається.", + "zh": "让我们**添加一个条件**来检测游戏何时开始。" + } + } + } + }, + { + "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-DepartScene" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Search for **Scene**.", + "fr": "Cherchez **Scène**.", + "ar": "البحث عن **مشهد**.", + "de": "Suchen Sie nach **Szene**.", + "es": "Busque **Escena**.", + "fi": "Etsi **Kohtaus**.", + "it": "Cerca **Scena**.", + "tr": "**Sahne**'yi arayın.", + "ja": "**シーン** を検索します。", + "ko": "**씬**을 검색합니다.", + "pl": "Wyszukaj **Poziom**.", + "pt": "Procure por **Cena**.", + "ru": "Ищите **Сцена**.", + "sl": "Iščite **Prizorišče**.", + "sq": "Kërkoni **Skenë**.", + "th": "ค้นหา **ฉาก**", + "uk": "Шукайте **Сцена**.", + "zh": "搜索 **场景**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-DepartScene", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will start our timer when the scene starts, thanks to the **At the beginning of the scene** condition.", + "fr": "Nous allons démarrer notre chronomètre quand la scène commence, grâce à la condition **Au début de la scène**.", + "ar": "سوف يبدأ مؤقتنا عندما يبدأ المشهد، بفضل الشرط **في بداية المشهد**.", + "de": "Wir starten unseren Timer, wenn die Szene beginnt, dank der Bedingung **Am Anfang der Szene**.", + "es": "Comenzaremos nuestro temporizador cuando comience la escena, gracias a la condición **Al comienzo de la escena**.", + "fi": "Aloitamme ajastimen, kun kohtaus alkaa, kiitos **Kohtauksen alussa** -ehdon.", + "it": "Inizieremo il nostro timer quando la scena inizia, grazie alla condizione **All'inizio della scena**.", + "tr": "Sahne başladığında **Sahnenin başlangıcında** koşulu sayesinde zamanlayıcımızı başlatacağız.", + "ja": "シーンが開始されたときに **シーンの開始時** 条件によってタイマーを開始します。", + "ko": "씬이 시작될 때 **씬 시작 시** 조건으로 타이머를 시작합니다.", + "pl": "Uruchomimy nasz stoper, gdy poziom się zacznie, dzięki warunkowi **Na początku poziomu**.", + "pt": "Vamos iniciar nosso temporizador quando a cena começar, graças à condição **No início da cena**.", + "ru": "Мы начнем наш таймер, когда сцена начнется, благодаря условию **В начале сцены**.", + "sl": "Zagnali bomo naš štopar, ko se prizorišče začne, zahvaljujoč pogoj **Na začetku prizorišča**.", + "sq": "Do të fillojmë kohëmatësin tonë kur skena fillon, falë kushtit **Në fillim të skenës**.", + "th": "เราจะเริ่มต้นตัวจับเวลาเมื่อฉากเริ่มต้น โดยขอบคุณเงื่อนไข **เริ่มต้นฉาก**", + "uk": "Ми почнемо наш таймер, коли сцена почнеться, завдяки умові **На початку сцени**.", + "zh": "我们将在场景开始时启动我们的计时器,这要归功于 **在场景开始时** 条件。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Let's create the timer now.", + "fr": "Nous allons maintenant créer le chronomètre.", + "ar": "سوف نقوم بإنشاء المؤقت الآن.", + "de": "Lassen Sie uns den Timer jetzt erstellen.", + "es": "Ahora creemos el temporizador.", + "fi": "Luodaan ajastin nyt.", + "it": "Creiamo il timer ora.", + "tr": "Şimdi zamanlayıcıyı oluşturalım.", + "ja": "タイマーを作成しましょう。", + "ko": "이제 타이머를 만들어 보겠습니다.", + "pl": "Teraz utwórzmy stoper.", + "pt": "Vamos criar o temporizador agora.", + "ru": "Давайте создадим таймер сейчас.", + "sl": "Sedaj bomo ustvarili štopar.", + "sq": "Le të krijojmë kohëmatësin tani.", + "th": "เราจะสร้างตัวจับเวลาตอนนี้", + "uk": "Давайте створимо таймер зараз.", + "zh": "现在让我们创建计时器。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "[data-active=\"true\"] #event-1-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Create an **action**.", + "fr": "Créez une **action**.", + "ar": "إضافة **إجراء**.", + "de": "Erstellen Sie eine **Aktion**.", + "es": "Crea una **acción**.", + "fi": "Luo **toiminto**.", + "it": "Crea un'**azione**.", + "tr": "**Eylem** oluşturun.", + "ja": "**アクション** を作成します。", + "ko": "**액션**을 만듭니다.", + "pl": "Utwórz **akcję**.", + "pt": "Crie uma **ação**.", + "ru": "Создайте **действие**.", + "sl": "Ustvarite **dejanje**.", + "sq": "Krijo një **veprim**.", + "th": "สร้าง **การกระทำ**", + "uk": "Створіть **дію**.", + "zh": "创建一个**动作**。" + } + } + } + }, + { + "elementToHighlightId": "#instruction-editor-dialog #search-bar", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-ResetTimer" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Search for **Scene timer**.", + "fr": "Cherchez **chrono**.", + "ar": "البحث عن **مؤقت المشهد**.", + "de": "Suchen Sie nach **Szene-Timer**.", + "es": "Busque **temporizador**.", + "fi": "Etsi **ajastin**.", + "it": "Cerca **timer di scena**.", + "tr": "**Sahne zamanlayıcısı**'nı arayın.", + "ja": "**シーンタイマー** を検索します。", + "ko": "**씬 타이머**를 검색합니다.", + "pl": "Wyszukaj **stoper poziomu**.", + "pt": "Procure por **Cronômetro**.", + "ru": "Ищите **таймер сцены**.", + "sl": "Iščite **časovnik prizorišča**.", + "sq": "Kërkoni **kohëmatës skene**.", + "th": "ค้นหา **ตัวจับเวลาฉาก**", + "uk": "Шукайте **таймер сцени**.", + "zh": "搜索 **场景计时器**。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-ResetTimer", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the **Start (or reset) a scene timer** action.", + "fr": "Cliquez sur l'action **Démarrer (ou réinitialiser) un chronomètre de scène**.", + "ar": "تحديد الإجراء **بدء (أو إعادة تعيين) مؤقت المشهد**.", + "de": "Wählen Sie die **Szene-Timer starten (oder zurücksetzen)**-Aktion.", + "es": "Seleccione la acción **Iniciar (o reiniciar) un temporizador de escena**.", + "fi": "Valitse **Käynnistä (tai nollaa) kohtauksen ajastin** -toiminto.", + "it": "Seleziona l'azione **Avvia (o reimposta) un timer di scena**.", + "tr": "**Sahne zamanlayıcısını başlat (veya sıfırla)** eylemini seçin.", + "ja": "**シーンタイマーを開始(またはリセット)**するアクションを選択します。", + "ko": "**씬 타이머 시작 (또는 재설정)** 액션을 선택합니다.", + "pl": "Wybierz **Uruchom (lub zresetuj) stoper poziomu**.", + "pt": "Selecione a ação **Iniciar (ou reiniciar) um cronômetro de cena**.", + "ru": "Выберите действие **Запустить (или сбросить) таймер сцены**.", + "sl": "Izberite **Začni (ali ponastavi) časovnik prizorišča**.", + "sq": "Zgjidh veprimin **Fillo (ose rivendos) një kohëmatës skene**.", + "th": "เลือก **เริ่มต้น (หรือรีเซ็ต) ตัวจับเวลาฉาก**", + "uk": "Виберіть дію **Запустити (або скинути) таймер сцени**.", + "zh": "选择 **开始(或重置)场景计时器** 动作。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-parameters-container textarea", + "nextStepTrigger": { + "valueEquals": "\"GameTimer\"" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "This timer will be created, let's name it **\"GameTimer\"** (in quotations).", + "fr": "Ce chronomètre sera créé, nommons-le **\"GameTimer\"** (entre guillemets).", + "ar": "سوف يتم إنشاء المؤقت، فلنسميه **\"GameTimer\"** (داخل علامتا تنصيص).", + "de": "Dieser Timer wird erstellt, nennen wir ihn **\"GameTimer\"** (in Anführungszeichen).", + "es": "Este temporizador se creará, llamémoslo **\"GameTimer\"** (entre comillas).", + "fi": "Tämä ajastin luodaan, nimeä se **\"GameTimer\"** (lainausmerkeissä).", + "it": "Questo timer verrà creato, chiamiamolo **\"GameTimer\"** (tra virgolette).", + "tr": "Bu zamanlayıcı oluşturulacak, adını **\"GameTimer\"** (tırnak içinde) koyalım.", + "ja": "このタイマーは作成されます。**\"GameTimer\"**(引用符内)と名前を付けましょう。", + "ko": "이 타이머가 생성될 것입니다. **\"GameTimer\"** (따옴표 안)이라고 이름을 지어 보겠습니다.", + "pl": "Ten stoper zostanie utworzony, nazwijmy go **\"GameTimer\"** (w cudzysłowie).", + "pt": "Este cronômetro será criado, vamos chamá-lo de **\"GameTimer\"** (entre aspas).", + "ru": "Этот таймер будет создан, давайте назовем его **\"GameTimer\"** (в кавычках).", + "sl": "Ta časovnik bo ustvarjen, poimenujmo ga **\"GameTimer\"** (v narekovajih).", + "sq": "Kjo kohëmatës do të krijohet, le të quajmë **\"GameTimer\"** (në thonjza).", + "th": "ตัวจับเวลานี้จะถูกสร้าง ให้เราตั้งชื่อว่า **\"GameTimer\"** (ในเครื่องหมายคำพูด)", + "uk": "Цей таймер буде створений, давайте назвемо його **\"GameTimer\"** (у лапках).", + "zh": "这个计时器将被创建,让我们给它命名为 **\"GameTimer\"**(在引号内)。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Our timer will start when the scene starts.", + "fr": "Nous avons terminé ! Notre chronomètre démarrera lorsque la scène commencera.", + "ar": "انتهينا! مؤقتنا سوف يبدأ وقتما يبدأ المشهد.", + "de": "Wir sind fertig! Unser Timer wird starten, wenn die Szene beginnt.", + "es": "¡Hemos terminado! Nuestro temporizador comenzará cuando comience la escena.", + "fi": "Olemme valmiit! Ajastimemme käynnistyy, kun kohtaus alkaa.", + "it": "Abbiamo finito! Il nostro timer inizierà quando la scena inizia.", + "tr": "Tamamlandık! Zamanlayıcımız, sahne başladığında başlayacak.", + "ja": "完了です!シーンが開始されたときにタイマーが開始します。", + "ko": "완료되었습니다! 씬이 시작될 때 타이머가 시작됩니다.", + "pl": "Skończone! Nasz stoper rozpocznie się, gdy poziom się zacznie.", + "pt": "Terminamos! Nosso cronômetro começará quando a cena começar.", + "ru": "Мы закончили! Наш таймер начнется, когда сцена начнется.", + "sl": "Končali smo! Naš štopar se bo začel, ko se prizorišče začne.", + "sq": "Kemi përfunduar! Kohëmatësi ynë do të fillojë kur skena fillon.", + "th": "เราจบแล้ว! ตัวจับเวลาของเราจะเริ่มต้นเมื่อฉากเริ่มต้น", + "uk": "Ми закінчили! Наш таймер почнеться, коли сцена почнеться.", + "zh": "我们完成了!我们的计时器将在场景开始时启动。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "[data-active=\"true\"] #event-3-actions #add-action-button-empty", + "nextStepTrigger": { + "presenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now let's update the score thanks to the timer.", + "fr": "Maintenant, mettons à jour le score grâce au chronomètre.", + "ar": "الآن هيّا نقوم بتحديث النص بفضل المؤقت.", + "de": "Lassen Sie uns den Timer verwenden, um die Punktzahl zu aktualisieren.", + "es": "Ahora actualicemos la puntuación gracias al temporizador.", + "fi": "Nyt päivitetään pisteet ajastimen avulla.", + "it": "Ora aggiorniamo il punteggio grazie al timer.", + "tr": "Şimdi zamanlayıcı sayesinde skoru güncelleyelim.", + "ja": "今度はタイマーを使ってスコアを更新しましょう。", + "ko": "이제 타이머로 점수를 업데이트해 보겠습니다.", + "pl": "Teraz zaktualizujmy wynik za pomocą stopera.", + "pt": "Agora vamos atualizar a pontuação graças ao cronômetro.", + "ru": "Теперь давайте обновим счет благодаря таймеру.", + "sl": "Zdaj bomo posodobili rezultat zahvaljujoč časovniku.", + "sq": "Tani le të përditësojmë rezultatin falë kohëmatësit.", + "th": "ตอนนี้เราจะอัปเดตคะแนนของเราโดยใช้ตัวจับเวลา", + "uk": "Тепер давайте оновимо рахунок завдяки таймеру.", + "zh": "现在让我们用计时器更新分数。" + } + } + } + }, + { + "elementToHighlightId": "objectInObjectOrResourceSelector:scoreText", + "nextStepTrigger": { + "presenceOfElement": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select $(scoreText).", + "fr": "Cliquez sur $(scoreText).", + "ar": "تحديد $(scoreText).", + "de": "Wählen Sie $(scoreText).", + "es": "Seleccione $(scoreText).", + "fi": "Valitse $(scoreText).", + "it": "Seleziona $(scoreText).", + "tr": "$(scoreText)'i seçin.", + "ja": "$(scoreText) を選択します。", + "ko": "$(scoreText)를 선택합니다.", + "pl": "Wybierz $(scoreText).", + "pt": "Selecione $(scoreText).", + "ru": "Выберите $(scoreText).", + "sl": "Izberite $(scoreText).", + "sq": "Zgjidh $(scoreText).", + "th": "เลือก $(scoreText)", + "uk": "Виберіть $(scoreText).", + "zh": "选择 $(scoreText)。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-item-TextContainerCapability--TextContainerBehavior--SetValue", + "nextStepTrigger": { + "presenceOfElement": "#instruction-parameters-container" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We will change the text.", + "fr": "Nous allons changer le contenu du texte.", + "ar": "سوف نقوم بتعديل النص.", + "de": "Wir werden den Text ändern.", + "es": "Cambiamos el texto.", + "fi": "Muutamme tekstiä.", + "it": "Modificheremo il testo.", + "tr": "Metni değiştireceğiz.", + "ja": "テキストを変更します。", + "ko": "텍스트를 변경해 보겠습니다.", + "pl": "Zmienimy tekst.", + "pt": "Vamos alterar o texto.", + "ru": "Мы изменим текст.", + "sl": "Spremenili bomo besedilo.", + "sq": "Do të ndryshojmë tekstin.", + "th": "เราจะเปลี่ยนข้อความ", + "uk": "Ми змінимо текст.", + "zh": "我们将更改文本。" + } + } + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#open-string-expression-popover-button", + "nextStepTrigger": { + "presenceOfElement": "#expression-selector" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Now, let's use the value of the timer.", + "fr": "Maintenant, utilisons la valeur du chronomètre.", + "ar": "والآن، هيّا نستخدم قيمة المؤقت.", + "de": "Lassen Sie uns den Wert des Timers verwenden.", + "es": "Ahora, usemos el valor del temporizador.", + "fi": "Nyt käytetään ajastimen arvoa.", + "it": "Ora, usiamo il valore del timer.", + "tr": "Şimdi, zamanlayıcının değerini kullanalım.", + "ja": "今度はタイマーの値を使いましょう。", + "ko": "이제 타이머의 값을 사용해 보겠습니다.", + "pl": "Teraz użyjmy wartości stopera.", + "pt": "Agora, vamos usar o valor do cronômetro.", + "ru": "Теперь давайте используем значение таймера.", + "sl": "Sedaj bomo uporabili vrednost štoparja.", + "sq": "Tani, le të përdorim vlerën e kohëmatësit.", + "th": "ตอนนี้เราจะใช้ค่าของตัวจับเวลา", + "uk": "Тепер давайте використаємо значення таймера.", + "zh": "现在,让我们使用计时器的值。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-selector input", + "nextStepTrigger": { + "presenceOfElement": "#instruction-or-expression-TimerElapsedTime" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Search for **Timer**", + "fr": "Recherchez **Chrono**", + "ar": "البحث عن **مؤقت**.", + "de": "Suchen Sie nach **Timer**", + "es": "Busque **Temporizador**", + "fi": "Etsi **Ajastin**", + "it": "Cerca **Timer**", + "tr": "**Zamanlayıcı** arayın", + "ja": "**タイマー** を検索します。", + "ko": "**타이머**를 검색합니다.", + "pl": "Wyszukaj **Stoper**", + "pt": "Procure por **Cronômetro**", + "ru": "Ищите **Таймер**", + "sl": "Iščite **Časovnik**", + "sq": "Kërkoni **Kohëmatës**", + "th": "ค้นหา **ตัวจับเวลา**", + "uk": "Шукайте **Таймер**", + "zh": "搜索 **计时器**" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-or-expression-TimerElapsedTime", + "nextStepTrigger": { + "presenceOfElement": "#expression-parameters-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select **Value of a scene timer**.", + "fr": "Sélectionnez **Valeur d'un chronomètre de scène**.", + "ar": "تحديد **قيمة مؤقت المشهد**.", + "de": "Wählen Sie **Wert eines Szenentimers**.", + "es": "Seleccione **Valor de un temporizador de escena**.", + "fi": "Valitse **Kohtauksen ajastimen arvo**.", + "it": "Seleziona **Valore di un timer di scena**.", + "tr": "**Sahne zamanlayıcısının değeri**'ni seçin.", + "ja": "**シーンタイマーの値** を選択します。", + "ko": "**씬 타이머의 값**을 선택합니다.", + "pl": "Wybierz **Wartość stopera poziomu**.", + "pt": "Selecione **Valor de um cronômetro de cena**.", + "ru": "Выберите **Значение таймера сцены**.", + "sl": "Izberite **Vrednost časovnika prizorišča**.", + "sq": "Zgjidh **Vlerën e një kohëmatësi skene**.", + "th": "เลือก **ค่าของตัวจับเวลาของฉาก**", + "uk": "Виберіть **Значення таймера сцени**.", + "zh": "选择 **场景计时器的值**。" + } + }, + "placement": "bottom" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-parameters-editor-dialog #parameter-1-identifier", + "nextStepTrigger": { + "valueEquals": "\"GameTimer\"" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Select the timer we just created, **\"GameTimer\"**.", + "fr": "Sélectionnez le chronomètre que nous venons de créer, **\"GameTimer\"**.", + "ar": "تحديد المؤقت الذي قمنا بإنشائه للتو (**\"GameTimer\"**).", + "de": "Wählen Sie den Timer, den wir gerade erstellt haben, **\"GameTimer\"**.", + "es": "Seleccione el temporizador que acabamos de crear, **\"GameTimer\"**.", + "fi": "Valitse juuri luomamme ajastin, **\"GameTimer\"**.", + "it": "Seleziona il timer che abbiamo appena creato, **\"GameTimer\"**.", + "tr": "Yeni oluşturduğumuz zamanlayıcıyı seçin, **\"GameTimer\"**.", + "ja": "先ほど作成したタイマー **\"GameTimer\"** を選択します。", + "ko": "방금 만든 타이머 **\"GameTimer\"**을 선택합니다.", + "pl": "Wybierz stoper, który właśnie utworzyliśmy, **\"GameTimer\"**.", + "pt": "Selecione o cronômetro que acabamos de criar, **\"GameTimer\"**.", + "ru": "Выберите таймер, который мы только что создали, **\"GameTimer\"**.", + "sl": "Izberite časovnik, ki smo ga pravkar ustvarili, **\"GameTimer\"**.", + "sq": "Zgjidh kohëmatësin që sapo krijuam, **\"GameTimer\"**.", + "th": "เลือกตัวจับเวลาที่เราสร้างไว้เมื่อสักครู่ที่แล้ว **\"GameTimer\"**", + "uk": "Виберіть таймер, який ми щойно створили, **\"GameTimer\"**.", + "zh": "选择我们刚刚创建的计时器 **\"GameTimer\"**。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#expression-parameters-editor-dialog #apply-button", + "nextStepTrigger": { + "absenceOfElement": "#expression-parameters-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're good.", + "fr": "On est bon.", + "ar": "نحن على الطريق الصحيح.", + "de": "Wir sind gut.", + "es": "Estamos bien.", + "fi": "Olemme hyviä.", + "it": "Siamo a posto.", + "tr": "İyi gidiyoruz.", + "ja": "問題ありません。", + "ko": "좋습니다.", + "pl": "Jesteśmy dobrze.", + "pt": "Estamos bem.", + "ru": "Мы в порядке.", + "sl": "V redu smo.", + "sq": "Jemi mirë.", + "th": "เรียบร้อยแล้ว", + "uk": "Ми в порядку.", + "zh": "我们完成了。" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#parameter-3-string-field", + "nextStepTrigger": { + "valueEquals": "ToString(round(TimerElapsedTime(\"GameTimer\")))" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "Final detail! If we leave it like this, the score text will display the decimals of our timer and we only want the seconds!\n\nLet's **round** that number.\n\nLet's use the function `round()` around the value so that we round the timer value. The result will look like this:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "fr": "Dernier détail ! Si nous laissons comme ça, le texte du score affichera les décimales de notre chronomètre et nous ne voulons que les secondes !\n\n**Arrondissons** ce nombre.\n\nAjoutons la fonction `round()` autour de la valeur afin que nous puissions arrondir la valeur du chronomètre. Le résultat ressemblera à ceci :\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "ar": "تفاصيل أخيرة! إذا تركناها بهذا الشكل، سيعرض نص النقاط العشرية لمؤقتنا ونريد فقط الثواني!\n\nلنقم ب**تقريب** هذا الرقم.\n\nلنستخدم الدالة `round()` حول القيمة حتى نقوم بتقريب قيمة المؤقت. سيكون الناتج كالتالي:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "de": "Letztes Detail! Wenn wir es so lassen, zeigt der Punktzahlentext die Dezimalstellen unseres Timers an und wir wollen nur die Sekunden!\n\nLassen Sie uns diese Zahl **runden**.\n\nLassen Sie uns die Funktion `round()` um den Wert herum verwenden, damit wir den Timerwert runden. Das Ergebnis wird so aussehen:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "es": "¡Detalle final! Si lo dejamos así, el texto de la puntuación mostrará los decimales de nuestro temporizador y solo queremos los segundos.\n\n¡**Redondeemos** ese número!\n\nAgreguemos la función `round()` alrededor del valor para que podamos redondear el valor del temporizador. El resultado se verá así:\n\n`\"ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "fi": "Viimeinen yksityiskohta! Jos jätämme sen tähän, pisteteksti näyttää ajastimen desimaalit ja haluamme vain sekunnit!\n\nPyöristetään tuo numero.\n\nKäytetään `round()`-funktiota arvon ympärillä, jotta voimme pyöristää ajastimen arvon. Tulos näyttää tältä:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "it": "Dettaglio finale! Se lo lasciamo così, il testo del punteggio visualizzerà le cifre decimali del nostro timer e noi vogliamo solo i secondi!\n\nArrotondiamo quel numero.\n\nUsiamo la funzione `round()` intorno al valore in modo che possiamo arrotondare il valore del timer. Il risultato sarà così:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "tr": "Son detay! Bunu böyle bırakırsak, skor metni zamanlayıcımızın ondalıklarını gösterecek ve biz sadece saniyeleri istiyoruz!\n\nO sayıyı **yuvarlayalım**.\n\nZamanlayıcı değerini yuvarlayabilmek için değerin etrafına `round()` fonksiyonunu ekleyelim. Sonuç şöyle görünecek:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "ja": "最後の詳細です!これのままにしておくと、スコアテキストにはタイマーの小数点が表示され、私たちは秒だけが欲しいです!\n\nその数値を**丸めましょう**。\n\nタイマーの値を丸めるために、値の周りに`round()`関数を使用しましょう。結果は次のようになります:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "ko": "마지막 세부 사항입니다! 이대로 둔다면 점수 텍스트에는 타이머의 소수점이 표시되고 우리는 초만 원합니다!\n\n그 숫자를 **반올림**해 보겠습니다.\n\n타이머 값을 반올림하려면 값을 둘러싼 `round()` 함수를 사용하겠습니다. 결과는 다음과 같이 보입니다:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "pl": "Ostatni szczegół! Jeśli zostawimy to tak, tekst wyniku wyświetli dziesiętne naszego stopera, a my chcemy tylko sekundy!\n\nZaokrąglmy tę liczbę.\n\nUżyjmy funkcji `round()` wokół wartości, aby zaokrąglić wartość stopera. Wynik będzie wyglądał tak:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "pt": "Detalhe final! Se deixarmos assim, o texto da pontuação exibirá os decimais do nosso cronômetro e só queremos os segundos!\n\nVamos **arredondar** esse número.\n\nVamos adicionar a função `round()` ao redor do valor para que possamos arredondar o valor do cronômetro. O resultado será assim:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "ru": "Последняя деталь! Если мы оставим это так, текст счета будет отображать десятичные дроби нашего таймера, а мы хотим только секунды!\n\nДавайте **округлим** это число.\n\nДавайте используем функцию `round()` вокруг значения, чтобы мы могли округлить значение таймера. Результат будет выглядеть так:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "sl": "Zadnji podrobnosti! Če pustimo tako, bo besedilo rezultata prikazalo decimalna mesta našega štoparja in mi želimo samo sekunde!\n\nZaokrožimo to število.\n\nUporabimo funkcijo `round()` okoli vrednosti, da bomo zaokrožili vrednost štoparja. Rezultat bo izgledal tako:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "sq": "Detaji përfundimtar! Nëse e lëmë kështu, teksti i rezultatit do të shfaqë dhjetëralet e kohëmatësit tonë dhe ne duam vetëm sekondat!\n\nLe të **rrumbullakësojmë** atë numër.\n\nLe të përdorim funksionin `round()` rreth vlerës që të rrethojmë vlerën e kohëmatësit. Rezultati do të duket kështu:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "th": "รายละเอียดสุดท้าย! หากเราปล่อยไว้เช่นนี้ ข้อความคะแนนจะแสดงทศนิยมของตัวจับเวลาของเราและเราต้องการเฉพาะวินาทีเท่านั้น!\n\nเรามา **ปัดเศษ** ตัวเลขนั้น\n\nเราจะใช้ฟังก์ชัน `round()` รอบค่าเพื่อที่เราจะปัดค่าตัวจับเวลา ผลลัพธ์จะดูเป็นแบบนี้:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "uk": "Останній деталь! Якщо ми залишимо це так, текст рахунку буде відображати десяткові нашого таймера, а ми хочемо тільки секунди!\n\nДавайте **округлимо** це число.\n\nДавайте використаємо функцію `round()` навколо значення, щоб ми могли округлити значення таймера. Результат буде виглядати так:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`", + "zh": "最后一个细节!如果我们保持这样,分数文本将显示我们的计时器的小数位,而我们只想要秒数!\n\n让我们**四舍五入**这个数字。\n\n让我们在值周围使用`round()`函数,这样我们就可以四舍五入计时器的值。结果将如下所示:\n\n`ToString(round( TimerElapsedTime(\"GameTimer\")))`" + } + }, + "placement": "top" + }, + "isOnClosableDialog": true + }, + { + "elementToHighlightId": "#instruction-editor-dialog #ok-button", + "nextStepTrigger": { + "absenceOfElement": "#instruction-editor-dialog" + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're all set.", + "fr": "On est tout bon.", + "ar": "ضبطنا كل شيء.", + "de": "Wir sind fertig.", + "es": "Estamos listos.", + "fi": "Olemme valmiita.", + "it": "Siamo pronti.", + "tr": "Her şey hazır.", + "ja": "準備完了です。", + "ko": "모두 준비되었습니다.", + "pl": "Jesteśmy gotowi.", + "pt": "Estamos prontos.", + "ru": "Мы все готовы.", + "sl": "Vse je pripravljeno.", + "sq": "Jemi të gatshëm.", + "th": "เราพร้อมแล้ว", + "uk": "Ми готові.", + "zh": "我们都准备好了。" + } + }, + "placement": "top" + } + }, + { + "elementToHighlightId": "#toolbar-preview-button", + "nextStepTrigger": { + "previewLaunched": true + }, + "tooltip": { + "description": { + "messageByLocale": { + "en": "We're done! Let's test our game to see the changes we've made! Click on the **Preview** button.", + "fr": "Nous avons terminé ! Testons notre jeu pour voir les changements que nous avons apportés ! Cliquez sur le bouton **Aperçu**.", + "ar": "حسنًا، لقد انتهينا! هيّا نختبر لعبتنا لنرى التغييرات التي قمنا بها! الضغط على الزر **معاينة**.", + "de": "Wir sind fertig! Lassen Sie uns unser Spiel testen, um die Änderungen zu sehen, die wir vorgenommen haben! Klicken Sie auf die **Vorschau**-Schaltfläche.", + "es": "¡Hemos terminado! ¡Probemos nuestro juego para ver los cambios que hemos hecho! Haga clic en el botón **Vista previa**.", + "fi": "Olemme valmiit! Testataan peliämme nähdäksemme tekemämme muutokset! Klikkaa **Esikatselu**-painiketta.", + "it": "abbiamo finito! Proviamo il nostro gioco per vedere le modifiche che abbiamo apportato! Clicca sul pulsante **Anteprima**.", + "tr": "Tamamlandık! Yaptığımız değişiklikleri görmek için oyunumuzu test edelim! **Önizleme** düğmesine tıklayın.", + "ja": "完了です!私たちが行った変更を確認するためにゲームをテストしましょう!**プレビュー**ボタンをクリックします。", + "ko": "우리는 끝났습니다! 우리가 한 변경 사항을 확인하기 위해 게임을 테스트해 봅시다! **미리보기** 버튼을 클릭합니다.", + "pl": "Skończyliśmy! Przetestujmy naszą grę, aby zobaczyć zmiany, jakie wprowadziliśmy! Kliknij przycisk **Podgląd**.", + "pt": "Nós terminamos! Vamos testar nosso jogo para ver as mudanças que fizemos! Clique no botão **Visualizar**.", + "ru": "Мы закончили! Давайте протестируем нашу игру, чтобы увидеть изменения, которые мы внесли! Нажмите на кнопку **Предварительный просмотр**.", + "sl": "Končali smo! Testirajmo našo igro, da vidimo spremembe, ki smo jih naredili! Kliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar! Le të testojmë lojën tonë për të parë ndryshimet që kemi bërë! Kliko në butonin **Parashiko**.", + "th": "เราเสร็จแล้ว! มาทดสอบเกมของเราเพื่อดูการเปลี่ยนแปลงที่เราได้ทำ! คลิกที่ปุ่ม **ตัวอย่าง**", + "uk": "Ми закінчили! Давайте протестуємо нашу гру, щоб побачити зміни, які ми зробили! Натисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!让我们测试游戏,看看我们所做的更改!点击**预览**按钮。" + } + }, + "placement": "bottom" + } + } + ] +} \ No newline at end of file diff --git a/tutorials/in-app/topDownRPGMovement.json b/tutorials/in-app/topDownRPGMovement.json new file mode 100644 index 0000000..d84dd64 --- /dev/null +++ b/tutorials/in-app/topDownRPGMovement.json @@ -0,0 +1,658 @@ +{ + "id": "topDownRPGMovement", + "titleByLocale": { + "en": "Let's make a Top-Down RPG game", + "fr": "Créez un jeu Top-Down RPG", + "de": "Erstelle ein Top-Down-RPG-Spiel", + "es": "Crea un juego Top-Down-RPG", + "fi": "Luodaan Top-Down-RPG-peli", + "it": "Creiamo un gioco Top-Down-RPG", + "tr": "Üstten Aşağı RPG Oyunu Yapalım", + "ja": "トップダウンRPGゲームを作ろう", + "ko": "탑다운 RPG 게임을 만들어 봅시다", + "pl": "Stwórz grę RPG z widokiem z góry", + "pt": "Crie um jogo Top-Down-RPG", + "th": "สร้างเกม Top-Down-RPG", + "ru": "Создайте игру RPG сверху вниз", + "sl": "Ustvarite igro RPG z vidika zgoraj navzdol", + "sq": "Krijo një lojë RPG me pamje nga lart-dhe-poshtë", + "uk": "Створіть гру RPG зверху донизу", + "zh": "让我们制作一个自上而下的 RPG 游戏" + }, + "bulletPointsByLocale": [ + { + "en": "Use a behavior to control a top-down character.", + "fr": "Utilisez un comportement pour contrôler un personnage de haut en bas.", + "ar": "استخدم سلوكًا للتحكم في شخصية من الأعلى إلى الأسفل.", + "de": "Verwenden Sie ein Verhalten, um eine Top-Down-Figur zu steuern.", + "es": "Utilice un comportamiento para controlar un personaje desde arriba hacia abajo.", + "it": "Usa un comportamento per controllare un personaggio top-down.", + "fi": "Käytä käyttäytymistä ohjaamaan hahmoa ylhäältä alas.", + "tr": "Üstten Aşağı karakteri kontrol etmek için bir davranış kullanın.", + "ja": "トップダウンキャラクターを制御するための行動を使用します。", + "ko": "탑다운 캐릭터를 제어하기 위한 동작을 사용하십시오.", + "pl": "Użyj zachowania do kontrolowania postaci z góry na dół.", + "pt": "Use um comportamento para controlar um personagem de cima para baixo.", + "th": "ใช้พฤติกรรมเพื่อควบคุมตัวละครแบบ top-down", + "ru": "Используйте поведение для управления персонажем сверху вниз.", + "sl": "Uporabite vedenje za nadzor lika od zgoraj navzdol.", + "sq": "Përdorni një sjellje për të kontrolluar një personazh nga lart-dhe-poshtë.", + "uk": "Використовуйте поведінку для управління персонажем зверху донизу.", + "zh": "使用一种行为来控制自上而下的角色。" + }, + { + "en": "Use another behavior for the pixel perfect movement.", + "fr": "Utilisez un autre comportement pour le mouvement pixel parfait.", + "ar": "استخدم سلوكًا آخر للحركة المثالية بالبكسل.", + "de": "Verwenden Sie ein weiteres Verhalten für die pixelgenaue Bewegung.", + "es": "Utiliza otro comportamiento para el movimiento perfecto por píxeles.", + "fi": "Käytä toista käyttäytymistä pikselin täsmälliseen liikkeeseen.", + "it": "Usa un altro comportamento per il movimento perfetto a livello di pixel.", + "tr": "Piksel mükemmel hareket için başka bir davranış kullanın.", + "ja": "ピクセル完璧な移動のために別の行動を使用します。", + "ko": "픽셀 완벽한 움직임을 위해 다른 동작을 사용하십시오.", + "pl": "Użyj innego zachowania do idealnego ruchu pikselowego.", + "pt": "Use outro comportamento para o movimento perfeito por pixels.", + "th": "ใช้พฤติกรรมอื่นสำหรับการเคลื่อนที่ที่ละเอียดพิกเซล", + "ru": "Используйте другое поведение для пиксельно точного движения.", + "sl": "Uporabite drugo vedenje za gibanje z natančnostjo na pike.", + "sq": "Përdorni një sjellje tjetër për lëvizjen perfekte me piksel.", + "uk": "Використовуйте інше поведінку для піксельно точного руху.", + "zh": "使用另一种行为进行像素完美的移动。" + } + ], + "editorSwitches": { + "Start": { + "editor": "Scene", + "scene1": "Overworld" + } + }, + "availableLocales": [ + "en", + "fr", + "ar", + "de", + "es", + "fi", + "it", + "tr", + "ja", + "ko", + "pl", + "pt", + "th", + "ru", + "sl", + "sq", + "uk", + "zh" + ], + "initialTemplateUrl": "https://resources.gdevelop-app.com/in-app-tutorials/templates/topDownRPGMovement/game.json", + "initialProjectData": { + "player": "Player", + "scene1": "Overworld" + }, + "flow": [ + { + "id": "Start", + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "inGameMessage": { + "messageByLocale": { + "en": "Try to use the arrow keys and see that the player can not move. Let's fix this!\nClose this window and go back to the editor.", + "fr": "Essayez d'utiliser les touches fléchées pour déplacer le joueur. Voyons comment résoudre ce problème !\nFermez cette fenêtre et retournez à l'éditeur.", + "ar": "!هذا كل شيء الآن يمكن $(player) أن يتحرك على كلا المحورين، مثل في بوكيمون\nأغلق هذه النافذة وعد إلى المحرر", + "de": "Versuchen Sie, die Pfeiltasten zu verwenden, und sehen Sie, dass der Spieler sich nicht bewegen kann. Lassen Sie uns das beheben!\nSchließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "Intenta usar las teclas de flecha y verás que el jugador no puede moverse. ¡Vamos a arreglarlo!\nCierra esta ventana y vuelve al editor.", + "fi": "Yritä käyttää nuolinäppäimiä ja huomaat, että pelaaja ei voi liikkua. Korjataan tämä!\nSulje tämä ikkuna ja palaa takaisin editoriin.", + "it": "Prova a usare i tasti freccia e vedrai che il giocatore non può muoversi. Correggiamolo!\nChiudi questa finestra e torna all'editor.", + "tr": "Ok tuşlarını kullanmayı deneyin ve oyuncunun hareket edemediğini göreceksiniz. Hadi bunu düzeltelim!\nBu pencereyi kapatın ve editöre geri dönün.", + "ja": "矢印キーを使ってみてください。プレイヤーが動けないことに気づくはずです。修正しましょう!\nこのウィンドウを閉じてエディタに戻ります。", + "ko": "화살표 키를 사용해 보세요. 플레이어가 움직일 수 없음을 알 수 있습니다. 이 문제를 해결해 봅시다!\n이 창을 닫고 편집기로 돌아갑니다.", + "pl": "Spróbuj użyć klawiszy strzałek i zobaczysz, że gracz nie może się poruszać. Naprawmy to!\nZamknij to okno i wróć do edytora.", + "pt": "Tente usar as setas do teclado e veja que o jogador não pode se mover. Vamos corrigir isso!\nFeche esta janela e volte para o editor.", + "th": "ลองใช้ปุ่มลูกศรและเห็นว่าผู้เล่นไม่สามารถเคลื่อนที่ได้ มาแก้ไขกันเถอะ!\nปิดหน้าต่างนี้และกลับไปที่เดิตเตอร์", + "ru": "Попробуйте использовать стрелки и увидите, что игрок не может двигаться. Давайте исправим это!\nЗакройте это окно и вернитесь в редактор.", + "sl": "Poskusite uporabiti puščične tipke in videli boste, da se igralec ne more premikati. Popravimo to!\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Përpiquni të përdorni butonat e shigjetave dhe do të shihni që lojtari nuk mund të lëvizë. Ta rregullojmë këtë!\nMbyll këtë dritare dhe kthehu në redaktor.", + "uk": "Спробуйте використати стрілки і побачите, що гравець не може рухатися. Давайте виправимо це!\nЗакрийте це вікно і поверніться до редактора.", + "zh": "尝试使用方向键,看看玩家无法移动。让我们来解决这个问题!\n关闭此窗口并返回编辑器。" + } + }, + "inGameTouchMessage": { + "messageByLocale": { + "en": "Try to use the joystick and see that the player can not move. Let's fix this!", + "fr": "Essayez d'utiliser le joystick pour déplacer le joueur. Voyons comment résoudre ce problème !", + "ar": "جرب استخدام عصا التحكم وسترى أن اللاعب لا يمكنه التحرك. دعونا نصلح هذا!", + "de": "Versuchen Sie, den Joystick zu verwenden, und sehen Sie, dass der Spieler sich nicht bewegen kann. Lassen Sie uns das beheben!", + "es": "Intenta usar el joystick y verás que el jugador no puede moverse. ¡Vamos a arreglarlo!", + "fi": "Yritä käyttää joystickiä ja huomaat, että pelaaja ei voi liikkua. Korjataan tämä!", + "it": "Prova a usare il joystick e vedrai che il giocatore non può muoversi. Correggiamolo!", + "tr": "Joystick'i kullanmayı deneyin ve oyuncunun hareket edemediğini göreceksiniz. Hadi bunu düzeltelim!", + "ja": "ジョイスティックを使ってみてください。プレイヤーが動けないことに気づくはずです。修正しましょう!", + "ko": "조이스틱을 사용해 보세요. 플레이어가 움직일 수 없음을 알 수 있습니다. 이 문제를 해결해 봅시다!", + "pl": "Spróbuj użyć dżojstiku i zobaczysz, że gracz nie może się poruszać. Naprawmy to!", + "pt": "Tente usar o joystick e veja que o jogador não pode se mover. Vamos corrigir isso!", + "th": "ลองใช้จอยสติกและเห็นว่าผู้เล่นไม่สามารถเคลื่อนที่ได้ มาแก้ไขกันเถอะ!", + "ru": "Попробуйте использовать джойстик и увидите, что игрок не может двигаться. Давайте исправим это!", + "sl": "Poskusite uporabiti džojstik in videli boste, da se igralec ne more premikati. Popravimo to!", + "sq": "Përpiquni të përdorni joystick-un dhe do të shihni që lojtari nuk mund të lëvizë. Ta rregullojmë këtë!", + "uk": "Спробуйте використати джойстик і побачите, що гравець не може рухатися. Давайте виправимо це!", + "zh": "尝试使用操纵杆,看看玩家无法移动。让我们来解决这个问题!" + } + }, + "inGameMessagePosition": "bottom-right", + "description": { + "messageByLocale": { + "en": "This game is a classic 'pixel perfect RPG'. Let’s play it in its current state.\n\nClick on the **preview** button to play.", + "fr": "Ce jeu est un classique 'RPG pixel parfait'. Jouons-y dans son état actuel.\n\nCliquez sur le bouton **Aperçu** pour jouer.", + "ar": "هذه اللعبة هي 'RPG بكسل مثالي' الكلاسيكية. دعونا نلعبها في حالتها الحالية.\n\nانقر على زر **معاينة** للعب.", + "de": "Dieses Spiel ist ein klassisches 'pixelgenaues RPG'. Lass uns es in seinem aktuellen Zustand spielen.\n\nKlicken Sie auf die Schaltfläche **Vorschau**, um zu spielen.", + "es": "Este juego es un clásico 'RPG pixel perfecto'. Vamos a jugarlo en su estado actual.\n\nHaz clic en el botón **Vista previa** para jugar.", + "fi": "Tämä peli on klassinen 'pikselin tarkka RPG'. Pelataan sitä sen nykyisessä tilassa.\n\nNapsauta **esikatselu**-painiketta pelataksesi.", + "it": "Questo gioco è un classico 'RPG pixel perfetto'. Giochiamoci nel suo stato attuale.\n\nFai clic sul pulsante **Anteprima** per giocare.", + "tr": "Bu oyun klasik bir 'piksel mükemmel RPG'. Şu anki durumunda oynayalım.\n\nOynamak için **önizleme** düğmesine tıklayın.", + "ja": "このゲームはクラシックな 'ピクセル完璧なRPG' です。現在の状態でプレイしましょう。\n\n**プレビュー**ボタンをクリックしてプレイしてください。", + "ko": "이 게임은 클래식 '픽셀 완벽한 RPG'입니다. 현재 상태에서 플레이해 봅시다.\n\n**미리보기** 버튼을 클릭하여 플레이하세요.", + "pl": "Ta gra to klasyczne 'pikselowe RPG'. Zagrajmy w nią w jej obecnym stanie.\n\nKliknij przycisk **Podgląd**, aby zagrać.", + "pt": "Este jogo é um clássico 'RPG pixel perfect'. Vamos jogá-lo em seu estado atual.\n\nClique no botão **pré-visualização** para jogar.", + "th": "เกมนี้เป็น 'RPG พิกเซลที่สมบูรณ์แบบ' แบบคลาสสิก มาเล่นกันในสถานะปัจจุบันของมันเถอะ\n\nคลิกที่ปุ่ม **ดูตัวอย่าง** เพื่อเล่น", + "ru": "Эта игра - классическая 'идеальная точность пикселей RPG'. Давайте сыграем в нее в ее текущем состоянии.\n\nНажмите кнопку **Предварительный просмотр**, чтобы начать игру.", + "sl": "Ta igra je klasična 'popolna pikselska RPG'. Poglejmo, kako se igra v trenutnem stanju.\n\nKliknite gumb **Predogled**, da začnete igrati.", + "sq": "Kjo lojë është një 'RPG pixel perfect' klasik. Le të luajmë në gjendjen e saj aktuale.\n\nKliko në butonin **Parashikimi** për të luajtur.", + "uk": "Ця гра - класична 'ідеальна точність пікселів RPG'. Давайте зіграємо в неї в її поточному стані.\n\nНатисніть кнопку **Попередній перегляд**, щоб почати гру.", + "zh": "这款游戏是经典的 '像素完美 RPG'。让我们在当前状态下玩它。\n\n点击 **预览** 按钮开始游戏。" + } + } + }, + { + "tooltip": { + "standalone": true, + "description": { + "messageByLocale": { + "en": "The player cannot move yet because the **Top-down movement** behavior is missing on the **$(player)** object.\n\nLet's add it.", + "fr": "Le joueur ne peut pas encore se déplacer car le comportement **Mouvement haut-bas** est manquant sur l'objet **$(player)**.\n\nAjoutons-le.", + "ar": "اللاعب لا يمكنه التحرك بعد لأن السلوك **الحركة من الأعلى إلى الأسفل** مفقود على كائن **$(player)**.\n\nلنضيفه.", + "de": "Der Spieler kann sich noch nicht bewegen, weil das Verhalten **Top-down movement** am Objekt **$(player)** fehlt.\n\nLass es uns hinzufügen.", + "es": "El jugador aún no puede moverse porque falta el comportamiento de **Movimiento de arriba hacia abajo** en el objeto **$(player)**.\n\nVamos a añadirlo.", + "fi": "Pelaaja ei voi vielä liikkua, koska **Ylhäältä alas liike** -käyttäytymistä ei ole **$(player)** -kohteessa.\n\nLisätään se.", + "it": "Il giocatore non può ancora muoversi perché manca il comportamento **Movimento dall'alto verso il basso** sull'oggetto **$(player)**.\n\nAggiungiamolo.", + "tr": "Oyuncu henüz hareket edemiyor çünkü **$(player)** nesnesinde **Üstten Aşağı hareket** davranışı eksik.\n\nEkleyelim.", + "ja": "**$(player)**オブジェクトに**Top-down movement**の動作が不足しているため、プレイヤーはまだ移動できません。\n\n追加しましょう。", + "ko": "**$(player)** 객체에서 **Top-down movement** 동작이 누락되어 플레이어가 아직 움직일 수 없습니다.\n\n추가해 보겠습니다.", + "pl": "Gracz nie może się jeszcze poruszać, ponieważ brakuje zachowania **Ruchu góra-dół** na obiekcie **$(player)**.\n\nDodajmy je.", + "pt": "O jogador ainda não pode se mover porque o comportamento **Movimento de cima para baixo** está faltando no objeto **$(player)**.\n\nVamos adicioná-lo.", + "th": "ผู้เล่นยังไม่สามารถเคลื่อนที่ได้เนื่องจากขาดการกระทำ **การเคลื่อนที่จากด้านบนลงด้านล่าง** บนวัตถุ **$(player)**\n\nเรามาเพิ่มมันดูกัน", + "ru": "Игрок пока не может двигаться, потому что поведение **Движение сверху вниз** отсутствует на объекте **$(player)**.\n\nДобавим его.", + "sl": "Igralec se še ne more premikati, ker manjka vedenje **Gibanje od zgoraj navzdol** na predmetu **$(player)**.\n\nDodajmo ga.", + "sq": "Lojtari nuk mund të lëvizë ende sepse mungon sjellja **Lëvizja nga lart-dheun** në objektin **$(player)**.\n\nTa shtojmë atë.", + "uk": "Гравець ще не може рухатися, оскільки відсутнє поведінка **Рух зверху вниз** на об'єкті **$(player)**.\n\nДавайте додамо його.", + "zh": "玩家尚无法移动,因为**$(player)**对象上缺少**Top-down movement**行为。\n\n让我们添加它。" + } + } + }, + "nextStepTrigger": { + "clickOnTooltipButton": { + "messageByLocale": { + "en": "Let's go!", + "fr": "C'est parti !", + "ar": "لنبدأ!", + "de": "Los geht's!", + "es": "¡Vamos!", + "fi": "Lähdetään!", + "it": "Andiamo!", + "tr": "Hadi başlayalım!", + "ja": "さあ、始めましょう!", + "ko": "출발!", + "pl": "Zaczynamy!", + "pt": "Vamos lá!", + "ru": "Поехали!", + "sl": "Gremo!", + "sq": "Hajde shkojme!", + "th": "ไปกันเลย!", + "uk": "Почнемо!", + "zh": "让我们开始吧!" + } + } + } + }, + { + "metaKind": "add-behavior", + "objectKey": "player", + "isOnClosableDialog": true, + "behaviorListItemId": "#behavior-item-TopDownMovementBehavior--TopDownMovementBehavior", + "behaviorParameterPanelId": "#behavior-parameters-TopDownMovement", + "objectHighlightDescription": { + "messageByLocale": { + "en": "Let's add movement to our $(player) with the help of the **Top-down movement** behavior.\n\nClick on the 3 dot menu, or right click on **$(player)**, and select **Edit behaviors**.", + "fr": "Ajoutons du mouvement à notre $(player) avec l'aide du comportement **Mouvement haut-bas**.\n\nCliquez sur le menu des 3 points, ou faites un clic droit sur **$(player)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف الحركة إلى $(player) الخاص بنا بمساعدة سلوك **الحركة من الأعلى إلى الأسفل**.\n\nانقر على قائمة النقاط الثلاثة، أو انقر بزر الماوس الأيمن فوق **$(player)**، وحدد **تحرير السلوك**.", + "de": "Lassen Sie uns mit Hilfe des **Top-down movement**-Verhaltens Bewegung zu unserem $(player) hinzufügen.\n\nKlicken Sie auf das Menü mit den 3 Punkten oder klicken Sie mit der rechten Maustaste auf **$(player)** und wählen Sie **Verhalten bearbeiten** aus.", + "es": "Añadamos movimiento a nuestro $(player) con la ayuda del comportamiento **Movimiento de arriba hacia abajo**.\n\nHaz clic en el menú de los 3 puntos, o haz clic derecho en **$(player)** y selecciona **Editar comportamientos**.", + "fi": "Lisätään liike $(player) -hahmoon **Ylhäältä alas liike** -käyttäytymisen avulla.\n\nNapsauta 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(player)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo del movimento al nostro $(player) con l'aiuto del comportamento **Movimento dall'alto verso il basso**.\n\nFai clic sul menu a 3 punti, o fai clic destro su **$(player)** e seleziona **Modifica comportamenti**.", + "tr": "Oyuncumuza **Üstten Aşağı hareket** davranışının yardımıyla hareket ekleyelim.\n\n3 noktalı menüye tıklayın veya **$(player)** üzerinde sağ tıklayın ve **Davranışları Düzenle** seçeneğini seçin.", + "ja": " **Top-down movement**動作の助けを借りて、$(player)に動きを追加しましょう。\n\n3点メニューをクリックするか、$(player)を右クリックし、「動作の編集」を選択します。", + "ko": " **Top-down movement** 동작을 사용하여 $(player)에 움직임을 추가해 봅시다.\n\n3 점 메뉴를 클릭하거나 $(player)를 마우스 오른쪽 버튼으로 클릭한 다음 **동작 편집**을 선택하세요.", + "pl": "Dodajmy ruch do naszego $(player) przy pomocy zachowania **Ruchu góra-dół**.\n\nKliknij menu trzech kropek lub kliknij prawym przyciskiem myszy na **$(player)** i wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar movimento ao nosso $(player) com a ajuda do comportamento **Movimento de cima para baixo**.\n\nClique no menu de 3 pontos, ou clique com o botão direito em **$(player)** e selecione **Editar comportamentos**.", + "th": "เพิ่มการเคลื่อนที่ให้กับ $(player) ของเราด้วยการกระทำ **การเคลื่อนที่จากด้านบนลงด้านล่าง**.\n\nคลิกที่เมนู 3 จุด หรือคลิกขวาที่ **$(player)** แล้วเลือก **แก้ไขพฤติกรรม**.", + "ru": "Давайте добавим движение к нашему $(player) с помощью поведения **Движение сверху вниз**.\n\nНажмите на меню с тремя точками, или щелкните правой кнопкой мыши на **$(player)** и выберите **Редактировать поведение**.", + "sl": "Dodajmo gibanje našemu $(player) s pomočjo vedenja **Gibanje od zgoraj navzdol**.\n\nKliknite na meni s 3 pikami ali z desno miškino tipko kliknite na **$(player)** in izberite **Uredi vedenje**.", + "sq": "Le të shtojmë lëvizje në $(player) tonë me ndihmën e sjelljes **Lëvizja nga lart-dheun**.\n\nKlikoni në menynë e 3 pikave, ose klikoni me të djathtën në **$(player)** dhe zgjidhni **Redakto sjelljet**.", + "uk": "Додаймо рух до нашого $(player) за допомогою поведінки **Рух зверху вниз**.\n\nНатисніть на меню з трьома крапками або правою кнопкою миші на **$(player)** і виберіть **Редагувати поведінку**.", + "zh": "让我们通过**Top-down movement**行为为我们的$(player)添加移动。\n\n单击3个点的菜单,或右键单击**$(player)**,然后选择**编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Let's add movement to our $(player) with the help of the **Top-down movement** behavior.\n\nSelect, then long press on **$(player)**, then select **Edit behaviors**.", + "fr": "Ajoutons du mouvement à notre $(player) avec l'aide du comportement **Mouvement haut-bas**.\n\nSélectionnez, puis appuyez longuement sur **$(player)**, puis sélectionnez **Modifier les comportements**.", + "ar": "لنضيف الحركة إلى $(player) مع مساعدة سلوك **الحركة من الأعلى إلى الأسفل**.\n\nحدد، ثم اضغط لفترة طويلة على **$(player)**، ثم اختر **تعديل السلوك**.", + "de": "Lassen Sie uns mit Hilfe des **Top-down movement**-Verhaltens Bewegung zu unserem $(player) hinzufügen.\n\nWählen Sie **$(player)** aus, drücken Sie lange darauf und wählen Sie dann **Verhalten bearbeiten** aus.", + "es": "Añadamos movimiento a nuestro $(player) con la ayuda del comportamiento **Movimiento de arriba hacia abajo**.\n\nSelecciona, luego mantén pulsado **$(player)**, y selecciona **Editar comportamientos**.", + "fi": "Lisätään liike $(player) -hahmoon **Ylhäältä alas liike** -käyttäytymisen avulla.\n\nValitse, sitten pidä pitkään painettuna **$(player)** ja valitse sitten **Muokkaa käyttäytymistä**.", + "it": "Aggiungiamo movimento al nostro $(player) con l'aiuto del comportamento **Movimento dall'alto verso il basso**.\n\nSeleziona, quindi tieni premuto su **$(player)**, quindi seleziona **Modifica comportamenti**.", + "tr": "Oyuncumuza **Üstten Aşağı hareket** davranışının yardımıyla hareket ekleyelim.\n\nSeçin, ardından **$(player)** üzerinde uzun basın ve ardından **Davranışları Düzenle** seçeneğini seçin.", + "ja": "**Top-down movement**動作の助けを借りて、$(player)に動きを追加しましょう。\n\n選択して、**$(player)**を長押しし、次に**動作の編集**を選択します。", + "ko": "**Top-down movement** 동작을 사용하여 $(player)에 움직임을 추가해 봅시다.\n\n**$(player)**를 선택한 다음 길게 누르고 **동작 편집**을 선택하세요.", + "pl": "Dodajmy ruch do naszego $(player) przy pomocy zachowania **Ruchu góra-dół**.\n\nWybierz, następnie przytrzymaj **$(player)**, a następnie wybierz **Edytuj zachowania**.", + "pt": "Vamos adicionar movimento ao nosso $(player) com a ajuda do comportamento **Movimento de cima para baixo**.\n\nSelecione, então pressione e segure **$(player)**, e selecione **Editar comportamentos**.", + "th": "เพิ่มการเคลื่อนที่ให้กับ $(player) ด้วยการกระทำ **การเคลื่อนที่จากด้านบนลงด้านล่าง**\n\nเลือก แล้วกดค้างที่ **$(player)** จากนั้นเลือก **แก้ไขพฤติกรรม**", + "ru": "Давайте добавим движение к нашему $(player) с помощью поведения **Движение сверху вниз**.\n\nВыберите, затем удерживайте нажатие на **$(player)**, затем выберите **Редактировать поведение**.", + "sl": "Dodajmo gibanje našemu $(player) s pomočjo vedenja **Gibanje od zgoraj navzdol**.\n\nIzberite, nato dolgo pritisnite na **$(player)**, nato pa izberite **Uredi vedenje**.", + "sq": "Le të shtojmë lëvizje në $(player) me ndihmën e sjelljes **Lëvizja nga lart-dheun**.\n\nZgjidh, pastaj shtypni gjatë në **$(player)**, pastaj zgjidhni **Redakto sjelljet**.", + "uk": "Додаймо рух до нашого $(player) за допомогою поведінки **Рух зверху вниз**.\n\nВиберіть, потім утримуйте натиск на **$(player)**, потім виберіть **Редагувати поведінку**.", + "zh": "让我们通过**Top-down movement**行为为我们的$(player)添加动作。\n\n选择,然后长按 **$(player)**,然后选择 **编辑行为**。" + } + }, + "behaviorDisplayNameByLocale": { + "en": "**Top-down movement**", + "fr": "**Mouvement vu de haut**", + "ar": "**الحركة من الأعلى إلى الأسفل**", + "de": "**Top-down movement**", + "es": "**Movimiento de arriba hacia abajo**", + "fi": "**Ylhäältä alas liike**", + "it": "**Movimento dall'alto verso il basso**", + "tr": "**Üstten Aşağı hareket**", + "ja": "**Top-down movement**", + "ko": "**Top-down movement**", + "pl": "**Ruch góra-dół**", + "pt": "**Movimento de cima para baixo**", + "th": "**การเคลื่อนที่จากด้านบนลงด้านล่าง**", + "ru": "**Движение сверху вниз**", + "sl": "**Gibanje od zgoraj navzdol**", + "sq": "**Lëvizja nga lart-dheun**", + "uk": "**Рух зверху вниз**", + "zh": "**Top-down movement**" + }, + "parameters": [ + { + "parameterId": "#MaxSpeed", + "expectedValue": "100", + "description": { + "messageByLocale": { + "en": "Let's update the max speed to **100**, so the $(player) can move slightly slower.", + "fr": "Mettez à jour la vitesse maximale à **100**, afin que $(player) puisse se déplacer légèrement plus lentement.", + "ar": "دعونا نحدث السرعة القصوى إلى **100**، حتى يمكن لـ $(player) التحرك ببطء قليلاً.", + "de": "Aktualisieren wir die maximale Geschwindigkeit auf **100**, damit sich $(player) etwas langsamer bewegen kann.", + "es": "Actualicemos la velocidad máxima a **100**, para que $(player) pueda moverse un poco más lento.", + "fi": "Päivitetään maksiminopeus arvoon **100**, jotta $(player) voi liikkua hieman hitaammin.", + "it": "Aggiorniamo la velocità massima a **100**, così $(player) può muoversi leggermente più lentamente.", + "tr": "Maksimum hızı **100** olarak güncelleyelim, böylece $(player) biraz daha yavaş hareket edebilir.", + "ja": "最大速度を**100**に更新して、$(player)が少し遅く移動できるようにしましょう。", + "ko": "최대 속도를 **100**으로 업데이트하여 $(player)이(가) 조금 더 느리게 이동할 수 있도록 합시다.", + "pl": "Zaktualizujmy maksymalną prędkość do **100**, aby $(player) mógł poruszać się nieco wolniej.", + "pt": "Vamos atualizar a velocidade máxima para **100**, para que $(player) possa se mover um pouco mais devagar.", + "th": "ปรับปรุงความเร็วสูงสุดเป็น **100** เพื่อให้ $(player) สามารถเคลื่อนที่ช้าลงเล็กน้อย", + "ru": "Обновим максимальную скорость до **100**, чтобы $(player) мог двигаться немного медленнее.", + "sl": "Posodobimo največjo hitrost na **100**, tako da se $(player) lahko premika nekoliko počasneje.", + "sq": "Le të përditësojmë shpejtësinë maksimale në **100**, kështu që $(player) mund të lëvizë pak më ngadalë.", + "uk": "Оновімо максимальну швидкість до **100**, щоб $(player) міг рухатися трохи повільніше.", + "zh": "让我们将最大速度更新为 **100**,这样 $(player) 可以稍微慢些移动。" + } + } + }, + { + "parameterId": "#AllowDiagonals", + "expectedValue": false, + "description": { + "messageByLocale": { + "en": "Uncheck this box, so the $(player) can move only horizontally (x axis) and vertically (y axis).", + "fr": "Décochez cette case, pour que $(player) puisse se déplacer uniquement horizontalement (axe x) et verticalement (axe y).", + "ar": "قم بإلغاء تحديد هذا المربع، حتى يمكن لـ $(player) التحرك أفقيًا فقط (المحور x) وعموديًا (المحور y).", + "de": "Deaktivieren Sie dieses Kontrollkästchen, damit sich $(player) nur horizontal (x-Achse) und vertikal (y-Achse) bewegen kann.", + "es": "Desmarca esta casilla, para que $(player) pueda moverse solo horizontalmente (eje x) y verticalmente (eje y).", + "fi": "Poista tämä valinta, jotta $(player) voi liikkua vain vaakasuunnassa (x-akseli) ja pystysuunnassa (y-akseli).", + "it": "Desseleziona questa casella, in modo che $(player) possa muoversi solo orizzontalmente (asse x) e verticalmente (asse y).", + "tr": "Bu kutuyu işaretleme, böylece $(player) yalnızca yatay (x eksen) ve dikey (y eksen) olarak hareket edebilir.", + "ja": "このボックスのチェックを外してください。そうすると、$(player) は水平(x 軸)と垂直(y 軸)にしか移動できません。", + "ko": "이 상자의 체크를 해제하면 $(player)이(가) 수평 (x 축) 및 수직 (y 축)으로만 이동할 수 있습니다.", + "pl": "Odznacz to pole, aby $(player) mógł poruszać się tylko poziomo (oś x) i pionowo (oś y).", + "pt": "Desmarque esta caixa, para que $(player) possa se mover apenas horizontalmente (eixo x) e verticalmente (eixo y).", + "th": "ยกเลิกการเลือกกล่องนี้เพื่อให้ $(player) สามารถเคลื่อนที่แนวนอน (แกน x) และแนวตั้ง (แกน y) เท่านั้น", + "ru": "Снимите отметку с этого флажка, чтобы $(player) мог двигаться только горизонтально (ось x) и вертикально (ось y).", + "sl": "Odkljukajte to polje, da se $(player) lahko premika samo vodoravno (os x) in navpično (os y).", + "sq": "Hiqni vlerën e këtij kutie, që $(player) të mund të lëvizë vetëm horizontalisht (ose x) dhe vertikalisht (ose y).", + "uk": "Зніміть позначку з цього поля, щоб $(player) міг рухатися тільки горизонтально (ось x) і вертикально (ось y).", + "zh": "取消选中此框,这样 $(player) 只能在水平(x 轴)和垂直(y 轴)方向上移动。" + } + } + }, + { + "parameterId": "#RotateObject", + "expectedValue": false, + "description": { + "messageByLocale": { + "en": "Uncheck this box to prevent the $(player) from rotating in the direction you are moving.", + "fr": "Décochez cette case pour empêcher $(player) de tourner dans la direction où vous vous déplacez.", + "ar": "قم بإلغاء تحديد هذا المربع لمنع $(player) من التدوير في الاتجاه الذي تتحرك فيه.", + "de": "Deaktivieren Sie dieses Kontrollkästchen, um zu verhindern, dass sich $(player) in die Richtung dreht, in die Sie sich bewegen.", + "es": "Desmarca esta casilla para evitar que $(player) rote en la dirección en la que te estás moviendo.", + "fi": "Poista tämä valinta, jotta $(player) ei voi kääntyä siihen suuntaan, johon olet liikkumassa.", + "it": "Desseleziona questa casella per impedire a $(player) di ruotare nella direzione in cui ti stai muovendo.", + "tr": "Bu kutuyu işaretleme, $(player)ın hareket ettiğiniz yönde dönmesini engeller.", + "ja": "このボックスのチェックを外してください。そうすると、$(player) はあなたが移動している方向に回転しなくなります。", + "ko": "이 상자의 체크를 해제하면 $(player)이(가) 이동하는 방향으로 회전하지 않습니다.", + "pl": "Odznacz to pole, aby zapobiec obrotowi $(player) w kierunku, w którym się poruszasz.", + "pt": "Desmarque esta caixa para impedir que $(player) gire na direção em que você está se movendo.", + "th": "ยกเลิกการเลือกกล่องนี้เพื่อป้องกัน $(player) ไม่ให้หมุนในทิศทางที่คุณกำลังเคลื่อนที่", + "ru": "Снимите отметку с этого флажка, чтобы предотвратить вращение $(player) в направлении, куда вы двигаетесь.", + "sl": "Odkljukajte to polje, da preprečite, da bi se $(player) vrtel v smeri, v katero se premikate.", + "sq": "Hiqni vlerën e këtij kutie për të parandaluar $(player) nga të kthyerit në drejtimin në të cilin po lëvizni.", + "uk": "Зніміть позначку з цього поля, щоб запобігти обертанню $(player) в напрямку, в якому ви рухаєтеся.", + "zh": "取消选中此框,以防止 $(player) 在您移动的方向上旋转。" + } + } + } + ], + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it! Now the $(player) can move on both axis, like in Pokemon!", + "fr": "C'est tout ! Maintenant, $(player) peut se déplacer sur les deux axes, comme dans Pokémon !", + "ar": "!هذا كل شيء الآن يمكن $(player) أن يتحرك على كلا المحورين، مثل في بوكيمون", + "de": "Das ist es! Jetzt kann sich $(player) auf beiden Achsen bewegen, wie in Pokémon!", + "es": "¡Eso es! ¡Ahora $(player) puede moverse en ambos ejes, como en Pokémon!", + "fi": "Siinä se on! Nyt $(player) voi liikkua molemmilla akselilla, kuten Pokémonissa!", + "it": "È tutto qui! Ora $(player) può muoversi su entrambi gli assi, come in Pokémon!", + "tr": "İşte bu kadar! Artık $(player), Pokemon'daki gibi her iki eksen üzerinde hareket edebilir!", + "ja": "それでおしまい!今、$(player) はポケモンのように両軸で動けます!", + "ko": "이제 $(player)가 포켓몬처럼 양 축에서 움직일 수 있습니다!", + "pl": "To wszystko! Teraz $(player) może poruszać się na obu osiach, tak jak w Pokemonie!", + "pt": "É isso aí! Agora o $(player) pode se mover em ambos os eixos, como em Pokémon!", + "th": "เป็นอันเสร็จสิ้น! ตอนนี้ $(player) สามารถเคลื่อนที่ได้ทั้งสองแกนเหมือนในเกม Pokemon!", + "ru": "Это все! Теперь $(player) может двигаться по обеим осям, как в Покемоне!", + "sl": "To je to! Zdaj se lahko $(player) premika po obeh oseh, kot v Pokemonu!", + "sq": "Kështu është! Tani $(player) mund të lëvizë në të dyja boshtet, si në Pokemon!", + "uk": "Ось і все! Тепер $(player) може рухатися по обох вісях, як у Покемоні!", + "zh": "就是这样!现在 $(player) 可以像神奇宝贝一样在两个轴上移动了!" + } + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "inGameMessage": { + "messageByLocale": { + "en": "Great job! Now you can move your character on two axis. But the movement isn't pixel perfect yet. Let's add a new behavior for this use to the **$(player)**.\n\nClose this window and go back to the editor.", + "fr": "Excellent ! Vous pouvez maintenant déplacer votre personnage sur deux axes. Mais le mouvement n'est pas encore parfait au pixel près. Ajoutons un nouveau comportement pour cet usage à **$(player)**.\n\nFermez cette fenêtre et retournez à l'éditeur.", + "ar": "عمل رائع! يمكنك الآن تحريك شخصيتك على محورين. ولكن الحركة ليست مثالية بالبيكسل بعد. دعونا نضيف سلوكًا جديدًا لهذا الاستخدام إلى **$(player)**.\n\nأغلق هذه النافذة وعد إلى المحرر.", + "de": "Großartige Arbeit! Jetzt können Sie Ihren Charakter auf zwei Achsen bewegen. Aber die Bewegung ist noch nicht pixelgenau. Fügen wir eine neue Verhaltensweise für diesen Zweck zu **$(player)** hinzu.\n\nSchließen Sie dieses Fenster und kehren Sie zum Editor zurück.", + "es": "¡Buen trabajo! Ahora puedes mover tu personaje en dos ejes. Pero el movimiento aún no es perfecto en píxeles. Vamos a agregar un nuevo comportamiento para este uso a **$(player)**.\n\nCierra esta ventana y vuelve al editor.", + "fi": "Hienoa työtä! Nyt voit liikuttaa hahmoasi kahdella akselilla. Mutta liike ei ole vielä täydellistä pikselin tarkkuudella. Lisätään uusi käyttäytyminen tätä varten **$(player)**.\n\nSulje tämä ikkuna ja palaa editoriin.", + "it": "Ottimo lavoro! Ora puoi muovere il tuo personaggio su due assi. Ma il movimento non è ancora perfetto al pixel. Aggiungiamo un nuovo comportamento per questo utilizzo a **$(player)**.\n\nChiudi questa finestra e torna all'editor.", + "tr": "Harika iş! Artık karakterinizi iki eksen üzerinde hareket ettirebilirsiniz. Ancak hareket henüz piksel mükemmel değil. Bu kullanım için **$(player)**'a yeni bir davranış ekleyelim.\n\nBu pencereyi kapatın ve editöre geri dönün.", + "ja": "素晴らしい仕事です!今、キャラクターを二軸で移動できます。しかし、動きはまだピクセルパーフェクトではありません。このために新しい挙動を**$(player)**に追加しましょう。\n\nこのウィンドウを閉じてエディタに戻ります。", + "ko": "잘 했어요! 이제 캐릭터를 두 축에서 이동할 수 있습니다. 하지만 움직임이 아직 픽셀 완벽하지 않습니다. 이 용도를 위해 새로운 동작을 **$(player)**에 추가합시다.\n\n이 창을 닫고 편집기로 돌아갑니다.", + "pl": "Świetna robota! Teraz możesz poruszać postacią na dwóch osiach. Ale ruch nie jest jeszcze idealny co do piksela. Dodajmy nowe zachowanie do tego użycia do **$(player)**.\n\nZamknij to okno i wróć do edytora.", + "pt": "Ótimo trabalho! Agora você pode mover seu personagem em dois eixos. Mas o movimento ainda não é perfeito em pixels. Vamos adicionar um novo comportamento para esse uso ao **$(player)**.\n\nFeche esta janela e volte ao editor.", + "th": "งานดีมาก! ตอนนี้คุณสามารถเคลื่อนที่ตัวละครได้ในสองแกน แต่การเคลื่อนไหวยังไม่สมบูรณ์แบบในระดับพิกเซล เพิ่มพฤติกรรมใหม่สำหรับการใช้งานนี้ใน **$(player)**\n\nปิดหน้าต่างนี้และกลับไปที่ตัวแก้ไข", + "ru": "Отличная работа! Теперь вы можете двигать своего персонажа по двум осям. Но движение пока не пиксельно точно. Давайте добавим новое поведение для этого к **$(player)**.\n\nЗакройте это окно и вернитесь в редактор.", + "sl": "Odlično delo! Zdaj lahko svojega lika premikate po dveh oseh. Toda gibanje še ni natančno na ravni pikslov. Dodajmo novo vedenje za to uporabo k **$(player)**.\n\nZaprite to okno in se vrnite v urejevalnik.", + "sq": "Puna e shkëlqyer! Tani mund të lëvizni personazhin tuaj në dy boshte. Por lëvizja ende nuk është e përkryer në piksel. Le të shtojmë një sjellje të re për këtë përdorim në **$(player)**.\n\nMbyll këtë dritare dhe kthehu në redaktor.", + "uk": "Чудова робота! Тепер ви можете рухати свого персонажа по обох вісях. Але рух поки не піксельно точний. Давайте додамо нову поведінку для цього до **$(player)**.\n\nЗакрийте це вікно і поверніться до редактора.", + "zh": "干得好!现在你可以在两个轴上移动你的角色。但是移动还不是完美的像素。让我们为**$(player)**添加一个新的行为。\n\n关闭这个窗口,回到编辑器。" + } + }, + "inGameMessagePosition": "bottom-right" + }, + { + "metaKind": "add-behavior", + "objectKey": "player", + "behaviorListItemId": "#behavior-item-PixelPerfectMovement--PixelPerfectTopDownMovement", + "behaviorParameterPanelId": "#behavior-parameters-PixelPerfectTopDownMovement", + "behaviorDisplayNameByLocale": { + "en": "**Pixel perfect top-down movement**", + "fr": "**Mouvement pixel-perfect de haut en bas**", + "ar": "**الحركة المثالية من أعلى إلى أسفل بالبيكسل**", + "de": "**Pixelgenaue Top-Down-Bewegung**", + "es": "**Movimiento de arriba hacia abajo perfecto en píxeles**", + "fi": "**Pikselin tarkka ylhäältä alas liike**", + "it": "**Movimento dall'alto verso il basso perfetto al pixel**", + "tr": "**Piksel mükemmel üstten aşağı hareket**", + "ja": "**ピクセル完璧なトップダウン移動**", + "ko": "**픽셀 완벽한 상하 이동**", + "pl": "**Ruch góra-dół idealny w pikselach**", + "pt": "**Movimento de cima para baixo perfeito em pixels**", + "th": "**การเคลื่อนที่จากด้านบนลงด้านล่างที่สมบูรณ์แบบในระดับพิกเซล**", + "ru": "**Движение сверху вниз с пиксельной точностью**", + "sl": "**Gibanje od zgoraj navzdol popolno v pikslih**", + "sq": "**Lëvizja nga lart-dheun e përkryer në piksel**", + "uk": "**Рух зверху вниз з піксельною точністю**", + "zh": "**像素完美的自上而下移动**" + }, + "parameters": [ + { + "parameterId": "#PixelSize", + "expectedValue": "16", + "description": { + "messageByLocale": { + "en": "Let's update the Pixel Size to **16**, so that $(player) moves by 16-pixel tiles.", + "fr": "Mettez à jour le Pixel Size à **16**, afin que $(player) puisse se déplacer par case de 16 pixels.", + "ar": "دعونا نقوم بتحديث حجم البكسل إلى **16**، حتى يتمكن $(player) من التحرك بمربعات بحجم 16 بكسل.", + "de": "Aktualisieren wir die Pixelgröße auf **16**, damit sich $(player) in 16-Pixel-Kacheln bewegt.", + "es": "Actualicemos el tamaño de píxel a **16**, para que $(player) se mueva en casillas de 16 píxeles.", + "fi": "Päivitetään pikselikoko arvoon **16**, jotta $(player) liikkuu 16 pikselin kokoisissa laatoissa.", + "it": "Aggiorniamo la dimensione dei pixel a **16**, così $(player) si muove di 16 pixel per volta.", + "tr": "Piksel boyutunu **16** olarak güncelleyelim, böylece $(player) 16 piksellik kareler halinde hareket eder.", + "ja": "ピクセルサイズを**16**に更新して、$(player)が16ピクセルごとに移動できるようにしましょう。", + "ko": "픽셀 크기를 **16**으로 업데이트하여 $(player)이(가) 16픽셀 단위로 이동할 수 있도록 합시다.", + "pl": "Zaktualizujmy rozmiar piksela do **16**, aby $(player) poruszał się o 16 pikseli na raz.", + "pt": "Vamos atualizar o tamanho do pixel para **16**, para que $(player) se mova em blocos de 16 pixels.", + "th": "อัปเดตขนาดพิกเซลเป็น **16** เพื่อให้ $(player) เคลื่อนที่เป็นช่องขนาด 16 พิกเซล", + "ru": "Обновим размер пикселя до **16**, чтобы $(player) перемещался по 16-пиксельным клеткам.", + "sl": "Posodobimo velikost piksla na **16**, tako da se $(player) premika po 16-pikselnih poljih.", + "sq": "Le të përditësojmë madhësinë e pikselit në **16**, që $(player) të lëvizë me blloqe prej 16 pikselësh.", + "uk": "Оновімо розмір пікселя до **16**, щоб $(player) переміщувався по 16-піксельних клітинках.", + "zh": "让我们将像素大小更新为 **16**,这样 $(player) 可以以 16 像素为单位移动。" + } + } + } + ], + "objectHighlightDescription": { + "messageByLocale": { + "en": "Open this object to be able to add the **Pixel perfect top-down movement** behavior on it.\n\nClick on the 3 dot menu, or right click on **$(player)**, and select **Edit behaviors**.", + "fr": "Ouvrez cet objet pour pouvoir ajouter le comportement **Mouvement parfait de haut en bas en pixels**.\n\nCliquez sur le menu à 3 points ou faites un clic droit sur **$(player)** et sélectionnez **Modifier les comportements**.", + "ar": "افتح هذا الكائن لتتمكن من إضافة سلوك **الحركة المثالية من أعلى إلى أسفل بالبيكسل** عليه.\n\nانقر على قائمة النقاط الثلاث، أو انقر بزر الماوس الأيمن على **$(player)**، ثم اختر **تعديل السلوكيات**.", + "de": "Öffnen Sie dieses Objekt, um das Verhalten **Pixelgenaue Top-Down-Bewegung** hinzuzufügen.\n\nKlicken Sie auf das 3-Punkte-Menü oder klicken Sie mit der rechten Maustaste auf **$(player)** und wählen Sie **Verhalten bearbeiten**.", + "es": "Abre este objeto para poder añadir el comportamiento **Movimiento perfecto de arriba hacia abajo en píxeles**.\n\nHaz clic en el menú de 3 puntos, o haz clic derecho en **$(player)** y selecciona **Editar comportamientos**.", + "fi": "Avaa tämä objekti voidaksesi lisätä **Pikselin tarkan ylöspäin suuntautuvan liikkeen** käyttäytymisen siihen.\n\nKlikkaa 3 pisteen valikkoa tai napsauta hiiren oikealla painikkeella **$(player)** ja valitse **Muokkaa käyttäytymistä**.", + "it": "Apri questo oggetto per poter aggiungere il comportamento **Movimento perfetto dall'alto verso il basso in pixel**.\n\nFai clic sul menu a 3 punti o fai clic con il pulsante destro del mouse su **$(player)** e seleziona **Modifica comportamenti**.", + "tr": "Bu nesneyi açarak üzerine **Piksel mükemmel üstten aşağı hareket** davranışını ekleyebilirsiniz.\n\n3 nokta menüsüne tıklayın veya **$(player)** üzerinde sağ tıklayın ve **Davranışları Düzenle**'yi seçin.", + "ja": "このオブジェクトを開いて、**ピクセルパーフェクトなトップダウン移動**の挙動を追加します。\n\n3点メニューをクリックするか、**$(player)**を右クリックして、**動作を編集**を選択します。", + "ko": "이 오브젝트를 열어 **픽셀 완벽한 탑다운 움직임** 동작을 추가하세요.\n\n3점 메뉴를 클릭하거나 **$(player)**를 마우스 오른쪽 버튼으로 클릭하고 **동작 편집**을 선택하세요.", + "pl": "Otwórz ten obiekt, aby dodać zachowanie **Ruch z góry na dół z dokładnością do piksela**.\n\nKliknij menu z 3 kropkami lub kliknij prawym przyciskiem myszy na **$(player)** i wybierz **Edytuj zachowania**.", + "pt": "Abra este objeto para poder adicionar o comportamento **Movimento perfeito de cima para baixo em pixels**.\n\nClique no menu de 3 pontos, ou clique com o botão direito do mouse em **$(player)** e selecione **Editar comportamentos**.", + "th": "เปิดวัตถุนี้เพื่อเพิ่มพฤติกรรม **การเคลื่อนไหวแบบพิกเซลเพอร์เฟคจากบนลงล่าง**\n\nคลิกที่เมนูจุด 3 จุด หรือคลิกขวาที่ **$(player)** แล้วเลือก **แก้ไขพฤติกรรม**", + "ru": "Откройте этот объект, чтобы добавить поведение **Пиксельно точное движение сверху вниз**.\n\nНажмите на меню из 3 точек или щелкните правой кнопкой мыши на **$(player)** и выберите **Редактировать поведение**.", + "sl": "Odprite ta predmet, da lahko dodate vedenje **Piksel natančno premikanje od zgoraj navzdol**.\n\nKliknite na meni s 3 pikami ali desni klik na **$(player)** in izberite **Uredi vedenje**.", + "sq": "Hapni këtë objekt për të shtuar sjelljen **Lëvizje e përkryer nga lart poshtë me piksel** mbi të.\n\nKlikoni në menunë me 3 pika, ose klikoni me të djathtën mbi **$(player)** dhe zgjidhni **Redakto sjelljet**.", + "uk": "Відкрийте цей об'єкт, щоб додати поведінку **Піксельно точний рух зверху вниз**.\n\nНатисніть на меню з 3 крапками або клацніть правою кнопкою миші на **$(player)** і виберіть **Редагувати поведінки**.", + "zh": "打开此对象,以便添加**像素级精确的俯视移动**行为。\n\n点击三点菜单,或右键单击**$(player)**,然后选择**编辑行为**。" + } + }, + "objectHighlightTouchDescription": { + "messageByLocale": { + "en": "Open this object to be able to add the **Pixel perfect top-down movement** behavior on it.\n\nSelect, then long press on **$(player)**, then select **Edit behaviors**.", + "fr": "Ouvrez cet objet pour pouvoir ajouter le comportement **Mouvement parfait de haut en bas en pixels**.\n\nSélectionnez, puis appuyez longuement sur **$(player)**, puis sélectionnez **Modifier les comportements**.", + "ar": "افتح هذا الكائن لإضافة سلوك **حركة مثالية من أعلى إلى أسفل بالبيكسل** عليه.\n\nاختر ثم اضغط مطولًا على **$(player)**، ثم اختر **تعديل السلوكيات**.", + "de": "Öffnen Sie dieses Objekt, um das Verhalten **Pixelgenaue Top-Down-Bewegung** hinzuzufügen.\n\nWählen Sie, dann drücken Sie lange auf **$(player)**, und wählen Sie **Verhalten bearbeiten**.", + "es": "Abre este objeto para poder añadir el comportamiento de **Movimiento perfecto de arriba hacia abajo en píxeles**.\n\nSelecciona y luego mantén presionado **$(player)**, luego selecciona **Editar comportamientos**.", + "fi": "Avaa tämä objekti voidaksesi lisätä **Pikselin tarkan ylöspäin suuntautuvan liikkeen** käyttäytymisen siihen.\n\nValitse, sitten pidä pitkään painettuna **$(player)**, ja valitse sitten **Muokkaa käyttäytymistä**.", + "it": "Apri questo oggetto per poter aggiungere il comportamento **Movimento perfetto dall'alto verso il basso in pixel**.\n\nSeleziona, poi premi a lungo su **$(player)**, quindi seleziona **Modifica comportamenti**.", + "tr": "Bu davranışı üzerine eklemek için bu nesneyi açın **Piksel mükemmel üstten aşağı hareket**.\n\nSeçin, ardından **$(player)** üzerinde uzun basın, ardından **Davranışları Düzenle**'yi seçin.", + "ja": "このオブジェクトを開いて、**ピクセルパーフェクトなトップダウン移動**の挙動を追加します。\n\n選択してから**$(player)**を長押しして、**動作を編集**を選択します。", + "ko": "이 오브젝트를 열어 **픽셀 완벽한 탑다운 움직임** 동작을 추가하세요.\n\n**$(player)**를 선택한 후 길게 눌러서 **동작 편집**을 선택하세요.", + "pl": "Otwórz ten obiekt, aby dodać zachowanie **Ruch z góry na dół z dokładnością do piksela**.\n\nWybierz, a następnie przytrzymaj **$(player)**, a potem wybierz **Edytuj zachowania**.", + "pt": "Abra este objeto para poder adicionar o comportamento **Movimento perfeito de cima para baixo em pixels**.\n\nSelecione, depois pressione e segure **$(player)**, em seguida selecione **Editar comportamentos**.", + "th": "เปิดวัตถุนี้เพื่อเพิ่มพฤติกรรม **การเคลื่อนไหวแบบพิกเซลเพอร์เฟคจากบนลงล่าง**\n\nเลือก จากนั้นกดค้างที่ **$(player)** จากนั้นเลือก **แก้ไขพฤติกรรม**", + "ru": "Откройте этот объект, чтобы добавить поведение **Пиксельно точное движение сверху вниз**.\n\nВыберите, затем нажмите и удерживайте **$(player)**, затем выберите **Редактировать поведение**.", + "sl": "Odprite ta predmet, da lahko dodate vedenje **Piksel natančno premikanje od zgoraj navzdol**.\n\nIzberite, nato pritisnite in zadržite **$(player)**, nato izberite **Uredi vedenje**.", + "sq": "Hapni këtë objekt për të shtuar sjelljen **Lëvizje e përkryer nga lart poshtë me piksel** mbi të.\n\nZgjidhni dhe mbani shtypur **$(player)**, pastaj zgjidhni **Redakto sjelljet**.", + "uk": "Відкрийте цей об'єкт, щоб додати поведінку **Піксельно точний рух зверху вниз**.\n\nВиберіть, потім натисніть і утримуйте **$(player)**, потім виберіть **Редагувати поведінки**.", + "zh": "打开此对象,以便添加**像素级精确的俯视移动**行为。\n\n选择,然后长按**$(player)**,然后选择**编辑行为**。" + } + }, + "finishedConfigurationDescription": { + "messageByLocale": { + "en": "That's it! Now the character can move and be aligned with the pixel grid and all other pixel art elements of the game.", + "fr": "Ça y est ! Maintenant, le personnage peut se déplacer et être aligné avec la grille de pixels et tous les autres éléments en pixel art du jeu.", + "ar": "هذا كل شيء! الآن يمكن للشخصية التحرك والتوافق مع شبكة البيكسل وجميع العناصر الفنية الأخرى للعبة.", + "de": "Das war's! Jetzt kann sich der Charakter bewegen und ist mit dem Pixelgitter und allen anderen Pixel-Art-Elementen des Spiels ausgerichtet.", + "es": "¡Eso es todo! Ahora el personaje puede moverse y alinearse con la cuadrícula de píxeles y todos los demás elementos de arte en píxeles del juego.", + "fi": "Siinä se kaikki! Nyt hahmo voi liikkua ja olla linjassa pikseliruudukon ja pelin muiden pikselitaidelementtien kanssa.", + "it": "Ecco fatto! Ora il personaggio può muoversi ed essere allineato con la griglia di pixel e tutti gli altri elementi di pixel art del gioco.", + "tr": "Tamam! Artık karakter hareket edebilir ve piksel ızgarası ve oyunun diğer tüm piksel sanat öğeleriyle hizalanabilir.", + "ja": "これで完了です!キャラクターはピクセルグリッドおよび他のすべてのピクセルアート要素に合わせて移動できるようになりました。", + "ko": "끝났습니다! 이제 캐릭터는 픽셀 그리드와 게임의 다른 모든 픽셀 아트 요소에 맞춰 움직일 수 있습니다.", + "pl": "To wszystko! Teraz postać może się poruszać i być wyrównana z siatką pikseli oraz wszystkimi innymi elementami pixel art w grze.", + "pt": "É isso aí! Agora o personagem pode se mover e se alinhar com a grade de pixels e todos os outros elementos de arte em pixels do jogo.", + "th": "เสร็จแล้ว! ตอนนี้ตัวละครสามารถเคลื่อนที่และจัดตำแหน่งตามตารางพิกเซลและองค์ประกอบศิลปะพิกเซลอื่นๆ ในเกมได้แล้ว", + "ru": "Вот и всё! Теперь персонаж может двигаться и быть выровненным по пиксельной сетке и всем другим пиксельным элементам игры.", + "sl": "To je to! Zdaj se lahko lik premika in je poravnan s pikselno mrežo in vsemi drugimi elementi pikselne umetnosti v igri.", + "sq": "Kjo është! Tani karakteri mund të lëvizë dhe të jetë i rreshtuar me rrjetën e pikselëve dhe të gjitha elementet e tjera të artit piksel të lojës.", + "uk": "Ось і все! Тепер персонаж може рухатися та бути вирівняним за піксельною сіткою та всіма іншими елементами піксельного арту гри.", + "zh": "就这样!现在角色可以移动并与像素网格和游戏的所有其他像素艺术元素对齐了。" + } + } + }, + { + "metaKind": "launch-preview", + "nextStep": "previewLaunched", + "description": { + "messageByLocale": { + "en": "We're done!\nLet's play our game to see how the character matches perfectly the squared grid!\n\nClick on the **Preview** button.", + "fr": "Nous avons terminé !\nJouons à notre jeu pour voir comment le personnage s'aligne parfaitement sur la grille carrée !\n\nCliquez sur le bouton **Aperçu**.", + "ar": "لقد انتهينا!\nلنلعب لعبتنا لنرى كيف يتطابق الشخصية تمامًا مع الشبكة المربعة!\n\nانقر على زر **معاينة**.", + "de": "Wir sind fertig!\nLassen Sie uns unser Spiel spielen, um zu sehen, wie der Charakter perfekt zum quadratischen Raster passt!\n\nKlicken Sie auf die Schaltfläche **Vorschau**.", + "es": "¡Hemos terminado!\n¡Juguemos a nuestro juego para ver cómo el personaje se ajusta perfectamente a la cuadrícula cuadrada!\n\nHaz clic en el botón **Vista previa**.", + "fi": "Olemme valmiit!\nPelataan peliämme nähdäksemme, miten hahmo sopii täydellisesti neliömäiseen ruudukkoon!\n\nKlikkaa **Esikatselu**-painiketta.", + "it": "Abbiamo finito!\nGioca al nostro gioco per vedere come il personaggio si adatta perfettamente alla griglia quadrata!\n\nFai clic sul pulsante **Anteprima**.", + "tr": "Bitti!\nKarakterin kareli ızgara ile mükemmel şekilde eşleşip eşleşmediğini görmek için oyunumuzu oynayalım!\n\n**Önizleme** düğmesine tıklayın.", + "ja": "完了です!\nキャラクターが四角いグリッドに完璧に一致するかどうかを確認するためにゲームをプレイしましょう!\n\n**プレビュー**ボタンをクリックします。", + "ko": "끝났습니다!\n캐릭터가 정사각형 그리드와 완벽하게 일치하는지 확인하기 위해 게임을 플레이해 봅시다!\n\n**미리보기** 버튼을 클릭하세요.", + "pl": "Skończyliśmy!\nZagrajmy w naszą grę, aby zobaczyć, jak postać idealnie pasuje do kwadratowej siatki!\n\nKliknij przycisk **Podgląd**.", + "pt": "Terminamos!\nVamos jogar o nosso jogo para ver como o personagem se encaixa perfeitamente na grade quadrada!\n\nClique no botão **Visualizar**.", + "th": "เราเสร็จแล้ว!\nเรามาเล่นเกมของเราเพื่อดูว่าตัวละครตรงกับตารางสี่เหลี่ยมอย่างลงตัวหรือไม่!\n\nคลิกที่ปุ่ม **ดูตัวอย่าง**", + "ru": "Мы закончили!\nДавайте поиграем в нашу игру, чтобы увидеть, как персонаж идеально соответствует квадратной сетке!\n\nНажмите на кнопку **Предпросмотр**.", + "sl": "Končali smo!\nIgrajmo našo igro, da vidimo, kako se lik popolnoma ujema s kvadratno mrežo!\n\nKliknite na gumb **Predogled**.", + "sq": "Kemi përfunduar!\nLe të luajmë lojën tonë për të parë se si personazhi përputhet plotësisht me rrjetën e katërt!\n\nKlikoni në butonin **Parashiko**.", + "uk": "Ми закінчили!\nДавайте зіграємо в нашу гру, щоб побачити, як персонаж ідеально відповідає квадратній сітці!\n\nНатисніть на кнопку **Попередній перегляд**.", + "zh": "我们完成了!\n让我们玩游戏,看看角色如何完美地匹配方格网格!\n\n点击**预览**按钮。" + } + } + } + ], + "endDialog": { + "content": [ + { + "messageByLocale": { + "en": "# You've finished this lesson!", + "fr": "# Vous avez terminé cette leçon !", + "ar": "# لقد انتهيت من هذا الدرس!", + "de": "# Du hast diese Lektion abgeschlossen!", + "es": "# ¡Has terminado esta lección!", + "fi": "# Olet suorittanut tämän oppitunnin!", + "it": "# Hai completato questa lezione!", + "tr": "# Bu dersi tamamladınız!", + "ja": "# このレッスンは終了しました!", + "ko": "# 이 레슨을 마쳤습니다!", + "pl": "# Zakończyłeś tę lekcję!", + "pt": "# Você terminou esta lição!", + "th": "# คุณได้เสร็จสิ้นบทเรียนนี้แล้ว!", + "ru": "# Вы завершили это урок!", + "sl": "# Dokončali ste ta pouk!", + "sq": "# Keni përfunduar këtë mësim!", + "uk": "# Ви завершили цей урок!", + "zh": "# 你已完成本课程!" + } + }, + { + "messageByLocale": { + "en": "Well done, in this tutorial you've learned how to:", + "fr": "Bien joué, dans ce tutoriel vous avez appris comment :", + "ar": "أحسنت، في هذا الدرس التعليمي تعلمت كيفية :", + "de": "Gut gemacht, in diesem Tutorial haben Sie gelernt, wie Sie:", + "es": "¡Bien hecho, en este tutorial has aprendido cómo:", + "fi": "Hyvin tehty, tässä oppitunnissa olet oppinut, miten:", + "it": "Ben fatto, in questo tutorial hai imparato come:", + "tr": "Harika, bu derste şunları öğrendiniz:", + "ja": "お疲れ様です、このチュートリアルでは以下の方法を学びました:", + "ko": "잘 했어요, 이 튜토리얼에서는 다음을 배웠습니다:", + "pl": "Dobrze wykonane, w tym samouczku nauczyłeś się, jak:", + "pt": "Bem feito, neste tutorial você aprendeu como:", + "th": "เก่งมาก เรียนรู้วิธีทำดังนี้ในบทแนะนำนี้", + "ru": "Отлично сработано, в этом учебнике вы узнали, как:", + "sl": "Dobro opravljeno, v tem vadnem programu ste se naučili, kako:", + "sq": "Mirë, në këtë udhëzues keni mësuar si të:", + "uk": "Добре зроблено, у цьому підручнику ви вивчили, як:", + "zh": "干得好,在这个教程中,您学会了如何:" + } + }, + { + "messageByLocale": { + "en": "- How to control a player with a top-down behavior\n\n- How to make the top-down player movement pixel perfect", + "fr": "- Comment contrôler un joueur avec un comportement de haut en bas\n\n- Comment rendre le mouvement du joueur en vue de dessus parfait en pixels", + "ar": "- كيفية التحكم في لاعب بسلوك من أعلى إلى أسفل\n\n- كيفية جعل حركة اللاعب من الأعلى إلى الأسفل مثالية على مستوى البكسل", + "de": "- Wie man einen Spieler mit einem Top-Down-Verhalten steuert\n\n- Wie man die Bewegung des Top-Down-Spielers pixelgenau macht", + "es": "- Cómo controlar a un jugador con un comportamiento de vista superior\n\n- Cómo hacer que el movimiento del jugador en vista superior sea perfecto en píxeles", + "fi": "- Kuinka ohjata pelaajaa ylhäältä alas -käyttäytymisellä\n\n- Kuinka tehdä ylhäältä alas -pelaajan liikkeestä pikselin tarkkaa", + "it": "- Come controllare un giocatore con un comportamento dall'alto verso il basso\n\n- Come rendere perfetto il movimento del giocatore dall'alto verso il basso pixel per pixel", + "tr": "- Bir oyuncuyu üstten aşağı bir davranışla nasıl kontrol edeceğinizi\n\n- Üstten aşağı oyuncu hareketini piksel mükemmel hale getirmenin yolunu", + "ja": "- トップダウンの動作でプレイヤーを制御する方法\n\n- トップダウンプレイヤーの動きをピクセル単位で完璧にする方法", + "ko": "- 탑다운 행동으로 플레이어를 제어하는 방법\n\n- 탑다운 플레이어의 움직임을 픽셀 단위로 완벽하게 만드는 방법", + "pl": "- Jak kontrolować gracza z widokiem z góry\n\n- Jak sprawić, aby ruch gracza z widokiem z góry był idealny na poziomie pikseli", + "pt": "- Como controlar um jogador com um comportamento de visão de cima\n\n- Como tornar o movimento do jogador de cima perfeito em pixels", + "th": "- วิธีควบคุมผู้เล่นด้วยพฤติกรรมแบบมองจากด้านบน\n\n- วิธีทำให้การเคลื่อนไหวของผู้เล่นแบบมองจากด้านบนสมบูรณ์แบบพิกเซลต่อพิกเซล", + "ru": "- Как управлять игроком с поведением сверху вниз\n\n- Как сделать движение игрока сверху вниз пиксельно точным", + "sl": "- Kako nadzorovati igralca s pogledom od zgoraj navzdol\n\n- Kako narediti gibanje igralca od zgoraj navzdol piksel popolno", + "sq": "- Si të kontrolloni një lojtar me sjellje nga lart-poshtë\n\n- Si të bëni lëvizjen e lojtarit nga lart-poshtë piksel për piksel të përsosur", + "uk": "- Як керувати гравцем з поведінкою зверху вниз\n\n- Як зробити рух гравця зверху вниз ідеально точним", + "zh": "- 如何用俯视视角控制玩家\n\n- 如何使俯视视角玩家的移动达到像素级精度" + } + }, + { + "messageByLocale": { + "en": "You can keep adding stuff to this game or publish it!", + "fr": "Vous pouvez continuer à ajouter des éléments à ce jeu ou le publier !", + "ar": "يمكنك الاستمرار في إضافة أشياء إلى هذه اللعبة أو نشرها!", + "de": "Sie können weiterhin Dinge zu diesem Spiel hinzufügen oder es veröffentlichen!", + "es": "¡Puedes seguir añadiendo cosas a este juego o publicarlo!", + "fi": "Voit jatkaa asioiden lisäämistä tähän peliin tai julkaista sen!", + "it": "Puoi continuare ad aggiungere cose a questo gioco o pubblicarlo!", + "tr": "Bu oyunu geliştirmeye devam edebilir veya yayınlayabilirsiniz!", + "ja": "このゲームにさらに要素を追加するか、それを公開することができます!", + "ko": "이 게임에 계속해서 새로운 요소를 추가하거나 게임을 게시할 수 있습니다!", + "pl": "Możesz dalej dodawać rzeczy do tej gry lub ją opublikować!", + "pt": "Você pode continuar adicionando coisas a este jogo ou publicá-lo!", + "th": "คุณสามารถเพิ่มสิ่งต่างๆในเกมนี้ต่อได้หรือตีพิมพ์!", + "ru": "Вы можете продолжать добавлять вещи в эту игру или опубликовать ее!", + "sl": "Lahko še naprej dodajate stvari v to igro ali jo objavite!", + "sq": "Mund të vazhdoni të shtoni gjëra në këtë lojë ose ta publikoni atë!", + "uk": "Ви можете продовжувати додавати речі до цієї гри або опублікувати її!", + "zh": "您可以继续添加内容到这个游戏中或发布它!" + } + } + ] + } +}