From 721a7c7d229b33321e49188e641ab5d8c05e932c Mon Sep 17 00:00:00 2001 From: Sceef Date: Sun, 15 Feb 2026 07:04:05 +0000 Subject: [PATCH] Automated Extension submission for issue #2029 --- extensions/community/GamePush.json | 10136 +++++++++++++++++++++++++++ 1 file changed, 10136 insertions(+) create mode 100644 extensions/community/GamePush.json diff --git a/extensions/community/GamePush.json b/extensions/community/GamePush.json new file mode 100644 index 000000000..ecf39295c --- /dev/null +++ b/extensions/community/GamePush.json @@ -0,0 +1,10136 @@ +{ + "author": "Sceef", + "category": "Third-party", + "extensionNamespace": "GamePush", + "fullName": "GamePush", + "gdevelopVersion": ">=5.5.222", + "helpPath": "https://docs.gamepush.com/docs/get-start/", + "iconUrl": "data:image/svg+xml;base64,PHN2ZyB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3MzIuMiA0MDAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgY2xhc3M9Im1yLTEiPjxnIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij48cGF0aCBkPSJNMTQ0LjQgNjQuMyAxMzAuNyAwSDQ1bDQxLjMgMTkzaDg1LjZsLTkuMy00M2g1Ny4zbDEzLjcgNjQuM0gwTDE4LjQgMzAwSDI5NWwzNC00My0zMi4yLTE1MEwyNDUgNjRIMTQ0LjRaIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsLTkxMy4zMzMzMSwxMDI2LjY2NjYpIHRyYW5zbGF0ZSg5MDUuMTcyODUsNDcwKSIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsgZmlsbC1vcGFjaXR5OiAxOyBmaWxsLXJ1bGU6IG5vbnplcm87IHN0cm9rZTogbm9uZTsiPjwvcGF0aD48L2c+PGcgc3R5bGU9ImRpc3BsYXk6IGlubGluZTsiPjxwYXRoIGQ9Im0xNzcuNSAxOTMtNC43LTIzLjFoMjcuNWwtMTUtNjYuNGgtLjJsLTMuOC0xNy44SDk0LjdsMjcuNSAxMjguNmgxMTMuNUwyNTQgMzAwSDk3LjdsLTUyLTQyLjdMMCA0MyAzNCAwSDIwNkwyNTggNDNsMzEuNiAxNTB6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsLTkxMy4zMzMzMSwxMDI2LjY2NjYpIHRyYW5zbGF0ZSg2ODUsNDcwKSIgc3R5bGU9ImZpbGw6IHJnYigzMSwgMjE4LCAxKTsgZmlsbC1vcGFjaXR5OiAxOyBmaWxsLXJ1bGU6IG5vbnplcm87IHN0cm9rZTogbm9uZTsiPjwvcGF0aD48L2c+PC9zdmc+", + "name": "GamePush", + "previewIconUrl": "data:image/svg+xml;base64,PHN2ZyB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3MzIuMiA0MDAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgY2xhc3M9Im1yLTEiPjxnIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmU7Ij48cGF0aCBkPSJNMTQ0LjQgNjQuMyAxMzAuNyAwSDQ1bDQxLjMgMTkzaDg1LjZsLTkuMy00M2g1Ny4zbDEzLjcgNjQuM0gwTDE4LjQgMzAwSDI5NWwzNC00My0zMi4yLTE1MEwyNDUgNjRIMTQ0LjRaIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsLTkxMy4zMzMzMSwxMDI2LjY2NjYpIHRyYW5zbGF0ZSg5MDUuMTcyODUsNDcwKSIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsgZmlsbC1vcGFjaXR5OiAxOyBmaWxsLXJ1bGU6IG5vbnplcm87IHN0cm9rZTogbm9uZTsiPjwvcGF0aD48L2c+PGcgc3R5bGU9ImRpc3BsYXk6IGlubGluZTsiPjxwYXRoIGQ9Im0xNzcuNSAxOTMtNC43LTIzLjFoMjcuNWwtMTUtNjYuNGgtLjJsLTMuOC0xNy44SDk0LjdsMjcuNSAxMjguNmgxMTMuNUwyNTQgMzAwSDk3LjdsLTUyLTQyLjdMMCA0MyAzNCAwSDIwNkwyNTggNDNsMzEuNiAxNTB6IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsLTkxMy4zMzMzMSwxMDI2LjY2NjYpIHRyYW5zbGF0ZSg2ODUsNDcwKSIgc3R5bGU9ImZpbGw6IHJnYigzMSwgMjE4LCAxKTsgZmlsbC1vcGFjaXR5OiAxOyBmaWxsLXJ1bGU6IG5vbnplcm87IHN0cm9rZTogbm9uZTsiPjwvcGF0aD48L2c+PC9zdmc+", + "shortDescription": "GamePush integration: achievements, leaderboards, ads, purchases, rewards, feedbacks, player. One build for 20+ platforms (Yandex Games, VK, Telegram, CrazyGames, etc.).", + "version": "1.0.0", + "description": [ + "Extension for integrating games with GamePush.com.", + "", + "Use it to show ads (rewarded, fullscreen, sticky), in-app purchases (one-time and permanent), sync player progress, unlock achievements, open leaderboards, and adapt to platform (language, device, login). One build works on 20+ platforms.", + "", + "**Installation:**", + "1. Add the extension to your project (Project Manager → Extensions → Create extension from file).", + "2. At game start, call the `Initialize GamePush` action with your Project ID and Public Token from the GamePush dashboard.", + "3. Use the `GamePush is ready` condition before calling other actions (or wait for it in a loop).", + "", + "Documentation: https://docs.gamepush.com" + ], + "origin": { + "identifier": "GamePush", + "name": "gdevelop-extension-store" + }, + "tags": [ + "gamepush", + "sdk", + "feedbacks", + "analytics", + "achievements", + "leaderboard", + "games collections", + "overlay", + "ads", + "purchases", + "rewards", + "rewards schedulers", + "events", + "segments", + "monetization", + "variables", + "liveops", + "yandex games", + "vk", + "telegram", + "DOM apis" + ], + "authorIds": [ + "UH1mG1uCrhOE6mxtrtaRV4N95B93" + ], + "dependencies": [], + "globalVariables": [], + "sceneVariables": [], + "eventsFunctions": [ + { + "fullName": "", + "functionType": "Action", + "name": "onFirstSceneLoaded", + "sentence": "", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " if (typeof gdjs.GamePush !== 'undefined') return;", + " var gp = null;", + " var ready = false;", + " var scriptLoaded = false;", + " var initPromise = null;", + " if (typeof window !== 'undefined') {", + " window.onGPInit = function(gpInstance) {", + " try {", + " gp = gpInstance;", + " scriptLoaded = true;", + " if (gp && gp.player && typeof gp.player.on === 'function') {", + " gp.player.on('login', function(success) { if (gdjs.GamePush) { gdjs.GamePush._loginTriggered = true; gdjs.GamePush._loginSuccess = !!success; } });", + " gp.player.on('logout', function(success) { if (gdjs.GamePush) { gdjs.GamePush._logoutTriggered = true; gdjs.GamePush._logoutSuccess = !!success; } });", + " }", + " if (gp && gp.socials && typeof gp.socials.on === 'function') {", + " gp.socials.on('share', function(success) { if (gdjs.GamePush) { gdjs.GamePush._shareTriggered = true; gdjs.GamePush._shareSuccess = !!success; } });", + " gp.socials.on('post', function(success) { if (gdjs.GamePush) { gdjs.GamePush._postTriggered = true; gdjs.GamePush._postSuccess = !!success; } });", + " gp.socials.on('invite', function(success) { if (gdjs.GamePush) { gdjs.GamePush._inviteTriggered = true; gdjs.GamePush._inviteSuccess = !!success; } });", + " gp.socials.on('joinCommunity', function(success) { if (gdjs.GamePush) { gdjs.GamePush._joinCommunityTriggered = true; gdjs.GamePush._joinCommunitySuccess = !!success; } });", + " }", + " if (gp && gp.sounds && typeof gp.sounds.on === 'function') {", + " gp.sounds.on('mute:music', function() {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._musicMuteTriggered = true;", + " gdjs.GamePush._musicMuted = true;", + " try {", + " var g = gdjs.GamePush._game;", + " if (g && typeof g.getSoundManager === 'function') {", + " var sm = g.getSoundManager();", + " if (sm && typeof sm.muteEverything === 'function') sm.muteEverything('gamepush');", + " else if (sm && typeof sm.getMusicOnChannel === 'function') { for (var ch = 0; ch <= 10; ch++) { var m = sm.getMusicOnChannel(ch); if (m && typeof m.pause === 'function') m.pause(); } }", + " }", + " } catch (e) {}", + " }", + " });", + " gp.sounds.on('unmute:music', function() {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._musicUnmuteTriggered = true;", + " gdjs.GamePush._musicMuted = false;", + " try {", + " var g = gdjs.GamePush._game;", + " if (g && typeof g.getSoundManager === 'function') {", + " var sm = g.getSoundManager();", + " if (sm && typeof sm.unmuteEverything === 'function') sm.unmuteEverything('gamepush');", + " else if (sm && typeof sm.getMusicOnChannel === 'function') { for (var ch = 0; ch <= 10; ch++) { var m = sm.getMusicOnChannel(ch); if (m && typeof m.play === 'function') m.play(); } }", + " }", + " } catch (e) {}", + " }", + " });", + " gp.sounds.on('mute:sfx', function() { if (gdjs.GamePush) { gdjs.GamePush._sfxMuteTriggered = true; gdjs.GamePush._sfxMuted = true; } });", + " gp.sounds.on('unmute:sfx', function() { if (gdjs.GamePush) { gdjs.GamePush._sfxUnmuteTriggered = true; gdjs.GamePush._sfxMuted = false; } });", + " }", + " if (gp && gp.payments && typeof gp.payments.on === 'function') {", + " gp.payments.on('purchase', function(data) {", + " if (gdjs.GamePush) {", + " var product = data && data.product ? data.product : data;", + " var tag = (product && product.tag != null) ? String(product.tag) : '';", + " var id = (product && (product.id != null || product.productId != null)) ? Number(product.id || product.productId) : 0;", + " if (!tag && id && gp.payments.products && Array.isArray(gp.payments.products)) {", + " for (var i = 0; i < gp.payments.products.length; i++) { if (Number(gp.payments.products[i].id) === id) { tag = (gp.payments.products[i].tag != null) ? String(gp.payments.products[i].tag) : ''; break; } }", + " }", + " gdjs.GamePush._purchaseTriggered = true;", + " gdjs.GamePush._purchaseSuccess = true;", + " gdjs.GamePush._purchaseError = '';", + " gdjs.GamePush._purchaseTag = tag;", + " gdjs.GamePush._purchaseId = id;", + " }", + " });", + " gp.payments.on('error:purchase', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._purchaseTriggered = true;", + " gdjs.GamePush._purchaseSuccess = false;", + " gdjs.GamePush._purchaseError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._purchaseTag = '';", + " gdjs.GamePush._purchaseId = 0;", + " }", + " });", + " gp.payments.on('consume', function(data) {", + " if (gdjs.GamePush) {", + " var product = data && data.product ? data.product : data;", + " var tag = (product && product.tag != null) ? String(product.tag) : '';", + " gdjs.GamePush._consumeTriggered = true;", + " gdjs.GamePush._consumeSuccess = true;", + " gdjs.GamePush._consumeError = '';", + " gdjs.GamePush._consumeTag = tag;", + " }", + " });", + " gp.payments.on('error:consume', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._consumeTriggered = true;", + " gdjs.GamePush._consumeSuccess = false;", + " gdjs.GamePush._consumeError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._consumeTag = '';", + " }", + " });", + " }", + " if (gp && gp.ads && typeof gp.ads.on === 'function') {", + " gp.ads.on('start', function() { if (gdjs.GamePush) { gdjs.GamePush._adsStartTriggered = true; } });", + " gp.ads.on('close', function(success) { if (gdjs.GamePush) { gdjs.GamePush._adsCloseTriggered = true; gdjs.GamePush._adsCloseSuccess = !!success; } });", + " gp.ads.on('fullscreen:start', function() { if (gdjs.GamePush) { gdjs.GamePush._fullscreenStartTriggered = true; } });", + " gp.ads.on('fullscreen:close', function(success) { if (gdjs.GamePush) { gdjs.GamePush._fullscreenCloseTriggered = true; gdjs.GamePush._fullscreenCloseSuccess = !!success; } });", + " gp.ads.on('preloader:start', function() { if (gdjs.GamePush) { gdjs.GamePush._preloaderStartTriggered = true; } });", + " gp.ads.on('preloader:close', function(success) { if (gdjs.GamePush) { gdjs.GamePush._preloaderCloseTriggered = true; gdjs.GamePush._preloaderCloseSuccess = !!success; } });", + " gp.ads.on('rewarded:start', function() { if (gdjs.GamePush) { gdjs.GamePush._rewardedStartTriggered = true; } });", + " gp.ads.on('rewarded:close', function(success) { if (gdjs.GamePush) { gdjs.GamePush._rewardedCloseTriggered = true; gdjs.GamePush._rewardedCloseSuccess = !!success; } });", + " gp.ads.on('sticky:start', function() { if (gdjs.GamePush) { gdjs.GamePush._stickyStartTriggered = true; } });", + " gp.ads.on('sticky:render', function() { if (gdjs.GamePush) { gdjs.GamePush._stickyRenderTriggered = true; } });", + " gp.ads.on('sticky:refresh', function() { if (gdjs.GamePush) { gdjs.GamePush._stickyRefreshTriggered = true; } });", + " gp.ads.on('sticky:close', function() { if (gdjs.GamePush) { gdjs.GamePush._stickyCloseTriggered = true; } });", + " }", + " if (gp && gp.variables && typeof gp.variables.on === 'function') {", + " gp.variables.on('fetch', function() { if (gdjs.GamePush) { gdjs.GamePush._variablesFetchTriggered = true; gdjs.GamePush._variablesFetchSuccess = true; gdjs.GamePush._variablesFetchError = ''; } });", + " gp.variables.on('error:fetch', function(err) { if (gdjs.GamePush) { gdjs.GamePush._variablesFetchTriggered = true; gdjs.GamePush._variablesFetchSuccess = false; gdjs.GamePush._variablesFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); } });", + " gp.variables.on('fetchPlatformVariables', function(vars) { if (gdjs.GamePush) { gdjs.GamePush._platformVarsTriggered = true; gdjs.GamePush._platformVarsSuccess = true; gdjs.GamePush._platformVarsResult = vars && typeof vars === 'object' ? vars : {}; gdjs.GamePush._platformVarsError = ''; } });", + " gp.variables.on('error:fetchPlatformVariables', function(err) { if (gdjs.GamePush) { gdjs.GamePush._platformVarsTriggered = true; gdjs.GamePush._platformVarsSuccess = false; gdjs.GamePush._platformVarsResult = {}; gdjs.GamePush._platformVarsError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); } });", + " }", + " if (gp && gp.rewards && typeof gp.rewards.on === 'function') {", + " gp.rewards.on('give', function(data) {", + " if (gdjs.GamePush && data) {", + " var r = data.reward;", + " gdjs.GamePush._rewardGiveTriggered = true;", + " gdjs.GamePush._rewardGiveSuccess = true;", + " gdjs.GamePush._rewardGiveError = '';", + " gdjs.GamePush._rewardGiveTag = (r && r.tag != null) ? String(r.tag) : '';", + " gdjs.GamePush._rewardGiveId = (r && r.id != null) ? Number(r.id) : 0;", + " }", + " });", + " gp.rewards.on('error:give', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._rewardGiveTriggered = true;", + " gdjs.GamePush._rewardGiveSuccess = false;", + " gdjs.GamePush._rewardGiveError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._rewardGiveTag = '';", + " gdjs.GamePush._rewardGiveId = 0;", + " }", + " });", + " gp.rewards.on('accept', function(data) {", + " if (gdjs.GamePush && data) {", + " var r = data.reward;", + " gdjs.GamePush._rewardAcceptTriggered = true;", + " gdjs.GamePush._rewardAcceptSuccess = true;", + " gdjs.GamePush._rewardAcceptError = '';", + " gdjs.GamePush._rewardAcceptTag = (r && r.tag != null) ? String(r.tag) : '';", + " gdjs.GamePush._rewardAcceptId = (r && r.id != null) ? Number(r.id) : 0;", + " }", + " });", + " gp.rewards.on('error:accept', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._rewardAcceptTriggered = true;", + " gdjs.GamePush._rewardAcceptSuccess = false;", + " gdjs.GamePush._rewardAcceptError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._rewardAcceptTag = '';", + " gdjs.GamePush._rewardAcceptId = 0;", + " }", + " });", + " }", + " if (gp && gp.triggers && typeof gp.triggers.on === 'function') {", + " gp.triggers.on('activate', function(data) {", + " if (gdjs.GamePush && data && data.trigger) {", + " var t = data.trigger;", + " gdjs.GamePush._triggerActivateTriggered = true;", + " gdjs.GamePush._triggerActivateTag = (t.tag != null) ? String(t.tag) : '';", + " gdjs.GamePush._triggerActivateId = (t.id != null) ? String(t.id) : '';", + " }", + " });", + " gp.triggers.on('claim', function(data) {", + " if (gdjs.GamePush && data && data.trigger) {", + " var t = data.trigger;", + " gdjs.GamePush._triggerClaimTriggered = true;", + " gdjs.GamePush._triggerClaimSuccess = true;", + " gdjs.GamePush._triggerClaimError = '';", + " gdjs.GamePush._triggerClaimTag = (t.tag != null) ? String(t.tag) : '';", + " gdjs.GamePush._triggerClaimId = (t.id != null) ? String(t.id) : '';", + " }", + " });", + " gp.triggers.on('error:claim', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._triggerClaimTriggered = true;", + " gdjs.GamePush._triggerClaimSuccess = false;", + " gdjs.GamePush._triggerClaimError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._triggerClaimTag = '';", + " gdjs.GamePush._triggerClaimId = '';", + " }", + " });", + " }", + " if (gp && gp.schedulers && typeof gp.schedulers.on === 'function') {", + " gp.schedulers.on('register', function(schedulerInfo) {", + " if (gdjs.GamePush && schedulerInfo) {", + " gdjs.GamePush._schedulersRegisterTriggered = true;", + " gdjs.GamePush._schedulersRegisterSuccess = true;", + " gdjs.GamePush._schedulersRegisterError = '';", + " gdjs.GamePush._schedulersRegisterSchedulerId = (schedulerInfo.scheduler && schedulerInfo.scheduler.id != null) ? Number(schedulerInfo.scheduler.id) : 0;", + " gdjs.GamePush._schedulersRegisterSchedulerTag = (schedulerInfo.scheduler && schedulerInfo.scheduler.tag != null) ? String(schedulerInfo.scheduler.tag) : '';", + " }", + " });", + " gp.schedulers.on('error:register', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._schedulersRegisterTriggered = true;", + " gdjs.GamePush._schedulersRegisterSuccess = false;", + " gdjs.GamePush._schedulersRegisterError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._schedulersRegisterSchedulerId = 0;", + " gdjs.GamePush._schedulersRegisterSchedulerTag = '';", + " }", + " });", + " gp.schedulers.on('claimDay', function(schedulerDayInfo) {", + " if (gdjs.GamePush && schedulerDayInfo) {", + " gdjs.GamePush._schedulersClaimDayTriggered = true;", + " gdjs.GamePush._schedulersClaimDaySuccess = true;", + " gdjs.GamePush._schedulersClaimDayError = '';", + " gdjs.GamePush._schedulersClaimDaySchedulerId = (schedulerDayInfo.scheduler && schedulerDayInfo.scheduler.id != null) ? Number(schedulerDayInfo.scheduler.id) : 0;", + " gdjs.GamePush._schedulersClaimDaySchedulerTag = (schedulerDayInfo.scheduler && schedulerDayInfo.scheduler.tag != null) ? String(schedulerDayInfo.scheduler.tag) : '';", + " gdjs.GamePush._schedulersClaimDayDay = (schedulerDayInfo.day != null) ? Number(schedulerDayInfo.day) : 0;", + " }", + " });", + " gp.schedulers.on('error:claimDay', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._schedulersClaimDayTriggered = true;", + " gdjs.GamePush._schedulersClaimDaySuccess = false;", + " gdjs.GamePush._schedulersClaimDayError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._schedulersClaimDaySchedulerId = 0;", + " gdjs.GamePush._schedulersClaimDaySchedulerTag = '';", + " gdjs.GamePush._schedulersClaimDayDay = 0;", + " }", + " });", + " gp.schedulers.on('claimDayAdditional', function(schedulerDayInfo) {", + " if (gdjs.GamePush && schedulerDayInfo) {", + " gdjs.GamePush._schedulersClaimDayAdditionalTriggered = true;", + " gdjs.GamePush._schedulersClaimDayAdditionalSuccess = true;", + " gdjs.GamePush._schedulersClaimDayAdditionalError = '';", + " }", + " });", + " gp.schedulers.on('error:claimDayAdditional', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._schedulersClaimDayAdditionalTriggered = true;", + " gdjs.GamePush._schedulersClaimDayAdditionalSuccess = false;", + " gdjs.GamePush._schedulersClaimDayAdditionalError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + " gp.schedulers.on('claimAllDay', function(schedulerDayInfo) {", + " if (gdjs.GamePush && schedulerDayInfo) {", + " gdjs.GamePush._schedulersClaimAllDayTriggered = true;", + " gdjs.GamePush._schedulersClaimAllDaySuccess = true;", + " gdjs.GamePush._schedulersClaimAllDayError = '';", + " }", + " });", + " gp.schedulers.on('error:claimAllDay', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._schedulersClaimAllDayTriggered = true;", + " gdjs.GamePush._schedulersClaimAllDaySuccess = false;", + " gdjs.GamePush._schedulersClaimAllDayError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + " gp.schedulers.on('claimAllDays', function(schedulerInfo) {", + " if (gdjs.GamePush && schedulerInfo) {", + " gdjs.GamePush._schedulersClaimAllDaysTriggered = true;", + " gdjs.GamePush._schedulersClaimAllDaysSuccess = true;", + " gdjs.GamePush._schedulersClaimAllDaysError = '';", + " }", + " });", + " gp.schedulers.on('error:claimAllDays', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._schedulersClaimAllDaysTriggered = true;", + " gdjs.GamePush._schedulersClaimAllDaysSuccess = false;", + " gdjs.GamePush._schedulersClaimAllDaysError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + " }", + " if (gp && gp.segments && typeof gp.segments.on === 'function') {", + " gp.segments.on('enter', function(segmentTag) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._segmentEnterTriggered = true;", + " gdjs.GamePush._segmentEnterTag = (segmentTag != null) ? String(segmentTag) : '';", + " }", + " });", + " gp.segments.on('leave', function(segmentTag) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._segmentLeaveTriggered = true;", + " gdjs.GamePush._segmentLeaveTag = (segmentTag != null) ? String(segmentTag) : '';", + " }", + " });", + " }", + " if (gp && gp.events && typeof gp.events.on === 'function') {", + " gp.events.on('join', function(data) {", + " if (gdjs.GamePush && data) {", + " var ev = data.event;", + " gdjs.GamePush._eventsJoinTriggered = true;", + " gdjs.GamePush._eventsJoinSuccess = true;", + " gdjs.GamePush._eventsJoinError = '';", + " gdjs.GamePush._eventsJoinEventId = (ev && ev.id != null) ? Number(ev.id) : 0;", + " gdjs.GamePush._eventsJoinEventTag = (ev && ev.tag != null) ? String(ev.tag) : '';", + " }", + " });", + " gp.events.on('error:join', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._eventsJoinTriggered = true;", + " gdjs.GamePush._eventsJoinSuccess = false;", + " gdjs.GamePush._eventsJoinError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._eventsJoinEventId = 0;", + " gdjs.GamePush._eventsJoinEventTag = '';", + " }", + " });", + " }", + " if (gp && gp.gamesCollections && typeof gp.gamesCollections.on === 'function') {", + " gp.gamesCollections.on('open', function() { if (gdjs.GamePush) { gdjs.GamePush._gamesCollectionsOpenTriggered = true; } });", + " gp.gamesCollections.on('close', function() { if (gdjs.GamePush) { gdjs.GamePush._gamesCollectionsCloseTriggered = true; } });", + " gp.gamesCollections.on('fetch', function(result) { if (gdjs.GamePush) { gdjs.GamePush._gamesCollectionsFetchTriggered = true; gdjs.GamePush._gamesCollectionsFetchSuccess = true; gdjs.GamePush._gamesCollectionsFetchError = ''; gdjs.GamePush._gamesCollectionsFetchResult = result; } });", + " gp.gamesCollections.on('error:fetch', function(err) { if (gdjs.GamePush) { gdjs.GamePush._gamesCollectionsFetchTriggered = true; gdjs.GamePush._gamesCollectionsFetchSuccess = false; gdjs.GamePush._gamesCollectionsFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); gdjs.GamePush._gamesCollectionsFetchResult = null; } });", + " }", + " if (gp && gp.windows && typeof gp.windows.on === 'function') {", + " gp.windows.on('confirm:close', function(isConfirmed) { if (gdjs.GamePush) { gdjs.GamePush._confirmCloseTriggered = true; gdjs.GamePush._confirmCloseResult = !!isConfirmed; } });", + " }", + " if (gp && gp.feedbacks && typeof gp.feedbacks.on === 'function') {", + " gp.feedbacks.on('createFeedback', function(feedback) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksSendTriggered = true; gdjs.GamePush._feedbacksSendSuccess = true; gdjs.GamePush._feedbacksSendError = ''; gdjs.GamePush._feedbacksSendResult = feedback; } });", + " gp.feedbacks.on('error:createFeedback', function(err) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksSendTriggered = true; gdjs.GamePush._feedbacksSendSuccess = false; gdjs.GamePush._feedbacksSendError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); gdjs.GamePush._feedbacksSendResult = null; } });", + " gp.feedbacks.on('openFeedbacksList', function() { if (gdjs.GamePush) { gdjs.GamePush._feedbacksOpenListTriggered = true; gdjs.GamePush._feedbacksOpenListSuccess = true; } });", + " gp.feedbacks.on('error:openFeedbacksList', function(err) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksOpenListTriggered = true; gdjs.GamePush._feedbacksOpenListSuccess = false; } });", + " gp.feedbacks.on('fetchFeedbacks', function(result) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksFetchTriggered = true; gdjs.GamePush._feedbacksFetchSuccess = true; gdjs.GamePush._feedbacksFetchResult = result; } });", + " gp.feedbacks.on('error:fetchFeedbacks', function(err) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksFetchTriggered = true; gdjs.GamePush._feedbacksFetchSuccess = false; gdjs.GamePush._feedbacksFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); gdjs.GamePush._feedbacksFetchResult = null; } });", + " gp.feedbacks.on('fetchMoreFeedbacks', function(result) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksFetchMoreTriggered = true; gdjs.GamePush._feedbacksFetchMoreSuccess = true; gdjs.GamePush._feedbacksFetchMoreResult = result; } });", + " gp.feedbacks.on('error:fetchMoreFeedbacks', function(err) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksFetchMoreTriggered = true; gdjs.GamePush._feedbacksFetchMoreSuccess = false; } });", + " gp.feedbacks.on('sendMessage', function(msg) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksSendMessageTriggered = true; gdjs.GamePush._feedbacksSendMessageSuccess = true; gdjs.GamePush._feedbacksSendMessageError = ''; } });", + " gp.feedbacks.on('error:sendMessage', function(err) { if (gdjs.GamePush) { gdjs.GamePush._feedbacksSendMessageTriggered = true; gdjs.GamePush._feedbacksSendMessageSuccess = false; gdjs.GamePush._feedbacksSendMessageError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); } });", + " }", + " if (gp && gp.uniques && typeof gp.uniques.on === 'function') {", + " gp.uniques.on('register', function(uniqueValue) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueRegisterTriggered = true;", + " gdjs.GamePush._uniqueRegisterSuccess = true;", + " gdjs.GamePush._uniqueRegisterError = '';", + " gdjs.GamePush._uniqueRegisterTag = (uniqueValue && uniqueValue.tag != null) ? String(uniqueValue.tag) : '';", + " gdjs.GamePush._uniqueRegisterValue = (uniqueValue && uniqueValue.value != null) ? String(uniqueValue.value) : '';", + " }", + " });", + " gp.uniques.on('error:register', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueRegisterTriggered = true;", + " gdjs.GamePush._uniqueRegisterSuccess = false;", + " gdjs.GamePush._uniqueRegisterError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._uniqueRegisterTag = '';", + " gdjs.GamePush._uniqueRegisterValue = '';", + " }", + " });", + " gp.uniques.on('check', function(uniqueValue) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueCheckTriggered = true;", + " gdjs.GamePush._uniqueCheckSuccess = true;", + " gdjs.GamePush._uniqueCheckError = '';", + " gdjs.GamePush._uniqueCheckTag = (uniqueValue && uniqueValue.tag != null) ? String(uniqueValue.tag) : '';", + " gdjs.GamePush._uniqueCheckValue = (uniqueValue && uniqueValue.value != null) ? String(uniqueValue.value) : '';", + " }", + " });", + " gp.uniques.on('error:check', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueCheckTriggered = true;", + " gdjs.GamePush._uniqueCheckSuccess = false;", + " gdjs.GamePush._uniqueCheckError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._uniqueCheckTag = '';", + " gdjs.GamePush._uniqueCheckValue = '';", + " }", + " });", + " gp.uniques.on('delete', function(uniqueValue) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueDeleteTriggered = true;", + " gdjs.GamePush._uniqueDeleteSuccess = true;", + " gdjs.GamePush._uniqueDeleteError = '';", + " gdjs.GamePush._uniqueDeleteTag = (uniqueValue && uniqueValue.tag != null) ? String(uniqueValue.tag) : '';", + " gdjs.GamePush._uniqueDeleteValue = (uniqueValue && uniqueValue.value != null) ? String(uniqueValue.value) : '';", + " }", + " });", + " gp.uniques.on('error:delete', function(err) {", + " if (gdjs.GamePush) {", + " gdjs.GamePush._uniqueDeleteTriggered = true;", + " gdjs.GamePush._uniqueDeleteSuccess = false;", + " gdjs.GamePush._uniqueDeleteError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " gdjs.GamePush._uniqueDeleteTag = '';", + " gdjs.GamePush._uniqueDeleteValue = '';", + " }", + " });", + " }", + " if (gp && gp.player && gp.player.ready) { gp.player.ready.then(function() { ready = true; }); } else { ready = true; }", + " } catch (e) { ready = true; }", + " };", + " }", + " gdjs.GamePush = {", + " gp: function() { return gp; },", + " isReady: function() { return !!(gp && ready); },", + " waitReady: function() {", + " if (!gp) return Promise.resolve(false);", + " if (ready) return Promise.resolve(true);", + " if (gp.player && gp.player.ready) return gp.player.ready.then(function() { ready = true; return true; });", + " return Promise.resolve(true);", + " },", + " _fullscreenEnded: false,", + " _rewardedEnded: false,", + " _rewardedSuccess: false,", + " _rewardedTag: \"\",", + " _loginTriggered: false,", + " _loginSuccess: false,", + " _logoutTriggered: false,", + " _logoutSuccess: false,", + " _isPaused: false,", + " _musicMuted: false,", + " _sfxMuted: false,", + " _musicMuteTriggered: false,", + " _musicUnmuteTriggered: false,", + " _sfxMuteTriggered: false,", + " _sfxUnmuteTriggered: false,", + " _shareTriggered: false,", + " _shareSuccess: false,", + " _postTriggered: false,", + " _postSuccess: false,", + " _inviteTriggered: false,", + " _inviteSuccess: false,", + " _joinCommunityTriggered: false,", + " _joinCommunitySuccess: false,", + " _purchaseTriggered: false,", + " _purchaseSuccess: false,", + " _purchaseTag: \"\",", + " _purchaseId: 0,", + " _purchaseError: \"\",", + " _consumeTriggered: false,", + " _consumeSuccess: false,", + " _consumeTag: \"\",", + " _consumeError: \"\",", + " _adsStartTriggered: false,", + " _adsCloseTriggered: false,", + " _adsCloseSuccess: false,", + " _fullscreenStartTriggered: false,", + " _fullscreenCloseTriggered: false,", + " _fullscreenCloseSuccess: false,", + " _preloaderStartTriggered: false,", + " _preloaderCloseTriggered: false,", + " _preloaderCloseSuccess: false,", + " _rewardedStartTriggered: false,", + " _rewardedCloseTriggered: false,", + " _rewardedCloseSuccess: false,", + " _stickyStartTriggered: false,", + " _stickyRenderTriggered: false,", + " _stickyRefreshTriggered: false,", + " _stickyCloseTriggered: false,", + " _leaderboardScopedTriggered: false,", + " _leaderboardScopedSuccess: false,", + " _leaderboardScopedResult: null,", + " _leaderboardPublishTriggered: false,", + " _leaderboardPublishSuccess: false,", + " _playerRatingTriggered: false,", + " _playerRatingSuccess: false,", + " _playerRatingResult: null,", + " _playerRatingScopedTriggered: false,", + " _playerRatingScopedSuccess: false,", + " _playerRatingScopedResult: null,", + " _reviewRequestTriggered: false,", + " _reviewRequestSuccess: false,", + " _reviewRating: 0,", + " _reviewError: \"\",", + " _shortcutTriggered: false,", + " _shortcutSuccess: false,", + " _variablesFetchTriggered: false,", + " _variablesFetchSuccess: false,", + " _variablesFetchError: \"\",", + " _platformVarsTriggered: false,", + " _platformVarsSuccess: false,", + " _platformVarsResult: null,", + " _platformVarsError: \"\",", + " _rewardGiveTriggered: false,", + " _rewardGiveSuccess: false,", + " _rewardGiveError: \"\",", + " _rewardGiveTag: \"\",", + " _rewardGiveId: 0,", + " _rewardAcceptTriggered: false,", + " _rewardAcceptSuccess: false,", + " _rewardAcceptError: \"\",", + " _rewardAcceptTag: \"\",", + " _rewardAcceptId: 0,", + " _triggerActivateTriggered: false,", + " _triggerActivateTag: \"\",", + " _triggerActivateId: \"\",", + " _triggerClaimTriggered: false,", + " _triggerClaimSuccess: false,", + " _triggerClaimError: \"\",", + " _triggerClaimTag: \"\",", + " _triggerClaimId: \"\",", + " _schedulersRegisterTriggered: false,", + " _schedulersRegisterSuccess: false,", + " _schedulersRegisterError: \"\",", + " _schedulersRegisterSchedulerId: 0,", + " _schedulersRegisterSchedulerTag: \"\",", + " _schedulersClaimDayTriggered: false,", + " _schedulersClaimDaySuccess: false,", + " _schedulersClaimDayError: \"\",", + " _schedulersClaimDaySchedulerId: 0,", + " _schedulersClaimDaySchedulerTag: \"\",", + " _schedulersClaimDayDay: 0,", + " _schedulersClaimDayAdditionalTriggered: false,", + " _schedulersClaimDayAdditionalSuccess: false,", + " _schedulersClaimDayAdditionalError: \"\",", + " _schedulersClaimAllDayTriggered: false,", + " _schedulersClaimAllDaySuccess: false,", + " _schedulersClaimAllDayError: \"\",", + " _schedulersClaimAllDaysTriggered: false,", + " _schedulersClaimAllDaysSuccess: false,", + " _schedulersClaimAllDaysError: \"\",", + " _eventsJoinTriggered: false,", + " _eventsJoinSuccess: false,", + " _eventsJoinError: \"\",", + " _eventsJoinEventId: 0,", + " _eventsJoinEventTag: \"\",", + " _segmentEnterTriggered: false,", + " _segmentEnterTag: \"\",", + " _segmentLeaveTriggered: false,", + " _segmentLeaveTag: \"\",", + " _gamesCollectionsOpenTriggered: false,", + " _gamesCollectionsCloseTriggered: false,", + " _gamesCollectionsFetchTriggered: false,", + " _gamesCollectionsFetchSuccess: false,", + " _gamesCollectionsFetchError: \"\",", + " _gamesCollectionsFetchResult: null,", + " _confirmCloseTriggered: false,", + " _confirmCloseResult: false,", + " _feedbacksSendTriggered: false,", + " _feedbacksSendSuccess: false,", + " _feedbacksSendError: \"\",", + " _feedbacksSendResult: null,", + " _feedbacksOpenListTriggered: false,", + " _feedbacksOpenListSuccess: false,", + " _feedbacksFetchTriggered: false,", + " _feedbacksFetchSuccess: false,", + " _feedbacksFetchError: \"\",", + " _feedbacksFetchResult: null,", + " _feedbacksFetchMoreTriggered: false,", + " _feedbacksFetchMoreSuccess: false,", + " _feedbacksFetchMoreResult: null,", + " _feedbacksSendMessageTriggered: false,", + " _feedbacksSendMessageSuccess: false,", + " _feedbacksSendMessageError: \"\",", + " _uniqueRegisterTriggered: false,", + " _uniqueRegisterSuccess: false,", + " _uniqueRegisterError: \"\",", + " _uniqueRegisterTag: \"\",", + " _uniqueRegisterValue: \"\",", + " _uniqueCheckTriggered: false,", + " _uniqueCheckSuccess: false,", + " _uniqueCheckError: \"\",", + " _uniqueCheckTag: \"\",", + " _uniqueCheckValue: \"\",", + " _uniqueDeleteTriggered: false,", + " _uniqueDeleteSuccess: false,", + " _uniqueDeleteError: \"\",", + " _uniqueDeleteTag: \"\",", + " _uniqueDeleteValue: \"\",", + " _game: null", + " };", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Initialize GamePush SDK. Provide Project ID and Public Token from the GamePush dashboard.", + "fullName": "Initialize GamePush", + "functionType": "Action", + "group": "Initialization", + "name": "Initialize", + "sentence": "Initialize GamePush (Project ID: _PARAM1_, Public Token: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var projectId = eventsFunctionContext.getArgument(\"ProjectId\");", + " var publicToken = eventsFunctionContext.getArgument(\"PublicToken\");", + " if (typeof gdjs.GamePush === 'undefined') return;", + " if (gdjs.GamePush.gp() && gdjs.GamePush.isReady()) return;", + " if (typeof document === 'undefined' || !document.head) return;", + " if (document.querySelector('script[src*=\"gamepush.com/sdk\"]')) return;", + " var s = document.createElement('script');", + " s.async = true;", + " s.src = 'https://gamepush.com/sdk/game-score.js?projectId=' + encodeURIComponent(String(projectId)) + '&publicToken=' + encodeURIComponent(String(publicToken)) + '&callback=onGPInit';", + " document.head.appendChild(s);", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Project ID", + "longDescription": "Project ID from GamePush dashboard.", + "name": "ProjectId", + "type": "string" + }, + { + "description": "Public Token", + "longDescription": "Public key from GamePush dashboard.", + "name": "PublicToken", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if GamePush is initialized and player is synced.", + "fullName": "GamePush is ready", + "functionType": "Condition", + "group": "Initialization", + "name": "IsReady", + "sentence": "GamePush is ready", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { eventsFunctionContext.returnValue = typeof gdjs.GamePush !== 'undefined' && gdjs.GamePush.isReady(); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Current language code (ISO 639-1: en, ru, fr, etc.).", + "fullName": "Language", + "functionType": "StringExpression", + "group": "Common", + "name": "Language", + "sentence": "Current language", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.language) ? String(gp.language) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Set language (ISO 639-1: ru, en, fr, de, es, it, zh, pt, ko, ja, tr, ar, hi, id).", + "fullName": "Set language", + "functionType": "Action", + "group": "Common", + "name": "LanguageSet", + "sentence": "Set language (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var lang = String(eventsFunctionContext.getArgument(\"Language\") || \"\"); var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.changeLanguage && lang) gp.changeLanguage(lang); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [{ "description": "Language code", "longDescription": "ISO 639-1 (en, ru, fr, etc.).", "name": "Language", "type": "string" }], + "objectGroups": [] + }, + { + "description": "Check if current language equals the selected language. Use for localization.", + "fullName": "Language is", + "functionType": "Condition", + "group": "Common", + "name": "LanguageIs", + "sentence": "Language is _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var lang = String(eventsFunctionContext.getArgument(\"Language\") || \"\").toLowerCase(); var gp = gdjs.GamePush && gdjs.GamePush.gp(); var current = (gp && gp.language) ? String(gp.language).toLowerCase() : \"\"; eventsFunctionContext.returnValue = current === lang; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Language", + "longDescription": "Select language to check.", + "name": "Language", + "type": "string", + "supplementaryInformation": "en|English\nru|Русский\nfr|Français\nde|Deutsch\nes|Español\nit|Italiano\nzh|中文\npt|Português\nko|한국어\nja|日本語\ntr|Türkçe\nar|العربية\nhi|हिन्दी\nid|Bahasa Indonesia" + } + ], + "objectGroups": [] + }, + { + "description": "Check if running on a mobile device.", + "fullName": "Device is mobile", + "functionType": "Condition", + "group": "Common", + "name": "DeviceIsMobile", + "sentence": "Device is mobile", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.isMobile); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if screen is in portrait orientation.", + "fullName": "Screen is in portrait orientation", + "functionType": "Condition", + "group": "Common", + "name": "DeviceIsPortrait", + "sentence": "Screen is in portrait orientation", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.isPortrait); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if GamePush is in dev mode (trusted site has dev flag).", + "fullName": "Dev mode is on", + "functionType": "Condition", + "group": "Common", + "name": "SystemIsDev", + "sentence": "Dev mode is on", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.isDev); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if host is in allowed origins (trusted site).", + "fullName": "Host is in allowed origin", + "functionType": "Condition", + "group": "Common", + "name": "SystemIsAllowedOrigin", + "sentence": "Host is in allowed origin", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.isAllowedOrigin); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Server time as ISO 8601 string. Use for anti-cheat.", + "fullName": "Server time", + "functionType": "StringExpression", + "group": "Common", + "name": "ServerTime", + "sentence": "Server time", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.serverTime) ? String(gp.serverTime) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Set game background image (url, blur px, fade sec).", + "fullName": "Set background", + "functionType": "Action", + "group": "Common", + "name": "BackgroundSet", + "sentence": "Set background (URL: _PARAM1_, blur: _PARAM2_, fade: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var url = String(eventsFunctionContext.getArgument(\"Url\") || \"\"); var blur = Number(eventsFunctionContext.getArgument(\"Blur\")) || 0; var fade = Number(eventsFunctionContext.getArgument(\"Fade\")) || 0; var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.setBackground && url) { var opts = { url: url }; if (blur > 0) opts.blur = blur; if (fade > 0) opts.fade = fade; gp.setBackground(opts); } } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "URL", "longDescription": "Image URL.", "name": "Url", "type": "string" }, + { "defaultValue": "0", "description": "Blur", "longDescription": "Blur in pixels.", "name": "Blur", "type": "expression" }, + { "defaultValue": "0", "description": "Fade", "longDescription": "Fade duration in seconds.", "name": "Fade", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Notify platform that game has started. Call after load.", + "fullName": "Game start", + "functionType": "Action", + "group": "Common", + "name": "GameStart", + "sentence": "Game start", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.gameStart) gp.gameStart(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Notify platform that gameplay started (e.g. POKI, CrazyGames). Call at level start.", + "fullName": "Gameplay start", + "functionType": "Action", + "group": "Common", + "name": "GameplayStart", + "sentence": "Gameplay start", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.gameplayStart) gp.gameplayStart(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Notify platform that gameplay ended. Call at level end.", + "fullName": "Gameplay stop", + "functionType": "Action", + "group": "Common", + "name": "GameplayStop", + "sentence": "Gameplay stop", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.gameplayStop) gp.gameplayStop(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Send analytics page hit / view (Yandex Metrica, Google Analytics). Add counters in Panel → Project Settings → Analytics Systems.", + "fullName": "Send analytics page hit", + "functionType": "Action", + "group": "Analytics", + "name": "AnalyticsHit", + "sentence": "Send analytics page hit: _PARAM0_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.analytics && gp.analytics.hit) gp.analytics.hit(eventsFunctionContext.getArgument(\"Url\")); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "URL", "longDescription": "Page URL/path (e.g. /level/1 or /menu).", "name": "Url", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Send analytics goal / conversion (Yandex Metrica, Google Analytics). With value, Yandex.Metrica converts as GOAL_NAME_VALUE.", + "fullName": "Send analytics goal", + "functionType": "Action", + "group": "Analytics", + "name": "AnalyticsGoal", + "sentence": "Send analytics goal: _PARAM0_ (value: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.analytics && gp.analytics.goal) { var name = eventsFunctionContext.getArgument(\"GoalName\"); var val = eventsFunctionContext.getArgument(\"GoalValue\"); if (val !== '' && val !== undefined) gp.analytics.goal(name, val); else gp.analytics.goal(name); } } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Goal name", "longDescription": "Event/goal name (e.g. LEVEL_START, PURCHASE).", "name": "GoalName", "type": "string" }, + { "description": "Goal value", "longDescription": "Optional value (number or string). Leave empty for goal without value.", "name": "GoalValue", "type": "string", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Current platform type (e.g. YANDEX, VK, TELEGRAM, CRAZY_GAMES, CUSTOM). See docs for all codes.", + "fullName": "Platform type", + "functionType": "StringExpression", + "group": "Platform", + "name": "PlatformType", + "sentence": "Platform type", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.platform && gp.platform.type) ? String(gp.platform.type) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform tag (gp.platform.tag).", + "fullName": "Platform tag", + "functionType": "StringExpression", + "group": "Platform", + "name": "PlatformTag", + "sentence": "Platform tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.platform && gp.platform.tag) ? String(gp.platform.tag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform supports integrated auth (login via platform).", + "fullName": "Platform has integrated auth", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformHasIntegratedAuth", + "sentence": "Platform has integrated auth", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.platform && gp.platform.hasIntegratedAuth); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform allows logout (exit from account).", + "fullName": "Platform is logout available", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformIsLogoutAvailable", + "sentence": "Platform is logout available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.platform && gp.platform.isLogoutAvailable); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform allows opening external links (e.g. social, store).", + "fullName": "Platform is external links allowed", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformIsExternalLinksAllowed", + "sentence": "Platform is external links allowed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.platform && gp.platform.isExternalLinksAllowed); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform supports login via secret code.", + "fullName": "Platform is secret code auth available", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformIsSecretCodeAuthAvailable", + "sentence": "Platform is secret code auth available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.platform && gp.platform.isSecretCodeAuthAvailable); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if current platform type equals the given code (e.g. YANDEX, VK, TELEGRAM).", + "fullName": "Platform type is", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformTypeIs", + "sentence": "Platform type is _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var code = String(eventsFunctionContext.getArgument(\"PlatformCode\") || \"\").toUpperCase(); var gp = gdjs.GamePush && gdjs.GamePush.gp(); var current = (gp && gp.platform && gp.platform.type) ? String(gp.platform.type).toUpperCase() : \"\"; eventsFunctionContext.returnValue = current === code; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Platform code", + "longDescription": "Code of the platform (e.g. YANDEX, VK, TELEGRAM, CRAZY_GAMES, CUSTOM).", + "name": "PlatformCode", + "type": "string", + "supplementaryInformation": "YANDEX|Yandex Games\nVK|VK Games\nVK_PLAY|VK Play\nTELEGRAM|Telegram\nCRAZY_GAMES|CrazyGames\nCUSTOM|Web (own site)\nOK|OK Games\nGAME_DISTRIBUTION|GameDistribution\nGAME_MONETIZE|GameMonetize\nGAMEPIX|GamePix\nGOOGLE_PLAY|Google Play" + } + ], + "objectGroups": [] + }, + { + "description": "Check if current platform tag equals the given value.", + "fullName": "Platform tag is", + "functionType": "Condition", + "group": "Platform", + "name": "PlatformTagIs", + "sentence": "Platform tag is _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var tag = String(eventsFunctionContext.getArgument(\"PlatformTag\") || \"\"); var gp = gdjs.GamePush && gdjs.GamePush.gp(); var current = (gp && gp.platform && gp.platform.tag) ? String(gp.platform.tag) : \"\"; eventsFunctionContext.returnValue = current === tag; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Platform tag", + "longDescription": "Tag of the platform to check.", + "name": "PlatformTag", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Unlock achievement by ID or tag.", + "fullName": "Unlock achievement", + "functionType": "Action", + "group": "Achievements", + "name": "AchievementUnlock", + "sentence": "Unlock achievement (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.achievements) return;", + " var num = Number(idOrTag);", + " if (!isNaN(num) && num !== 0) gp.achievements.unlock({ id: num });", + " else gp.achievements.unlock({ tag: String(idOrTag) });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "ID or tag", + "longDescription": "Numeric ID or achievement tag.", + "name": "IdOrTag", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set achievement progress (for achievements with a maximum progress).", + "fullName": "Set achievement progress", + "functionType": "Action", + "group": "Achievements", + "name": "AchievementSetProgress", + "sentence": "Set achievement progress (ID or tag: _PARAM1_, progress: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var progress = Number(eventsFunctionContext.getArgument(\"Progress\")) || 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.achievements) return;", + " var num = Number(idOrTag);", + " if (!isNaN(num) && num !== 0) gp.achievements.setProgress({ id: num, progress: progress });", + " else gp.achievements.setProgress({ tag: String(idOrTag), progress: progress });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "ID or tag", + "longDescription": "Achievement ID or tag.", + "name": "IdOrTag", + "type": "string" + }, + { + "defaultValue": "0", + "description": "Progress", + "longDescription": "Number (0..maxProgress).", + "name": "Progress", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if the achievement is unlocked for the player.", + "fullName": "Achievement unlocked", + "functionType": "Condition", + "group": "Achievements", + "name": "AchievementHas", + "sentence": "Achievement unlocked (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.achievements && gp.achievements.has(String(idOrTag)));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "ID or tag", + "longDescription": "Achievement ID or tag.", + "name": "IdOrTag", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Open the achievements list window (GamePush built-in UI).", + "fullName": "Open achievements list", + "functionType": "Action", + "group": "Achievements", + "name": "AchievementOpen", + "sentence": "Open achievements list", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.achievements) gp.achievements.open();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Give a reward to the player by ID or tag. Use \"Reward given\" / \"Reward give error\" to handle result. With lazy: true the reward is saved with the next player sync.", + "fullName": "Give reward", + "functionType": "Action", + "group": "Rewards", + "name": "RewardsGive", + "sentence": "Give reward (ID or tag: _PARAM1_, lazy: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var lazy = !!eventsFunctionContext.getArgument(\"Lazy\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._rewardGiveTriggered = false; ext._rewardGiveSuccess = false; ext._rewardGiveError = ''; ext._rewardGiveTag = ''; ext._rewardGiveId = 0; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.rewards || typeof gp.rewards.give !== 'function') return;", + " var num = Number(idOrTag);", + " var opts = lazy ? { lazy: true } : {};", + " if (!isNaN(num) && num !== 0) { opts.id = num; gp.rewards.give(opts); }", + " else { opts.tag = String(idOrTag); gp.rewards.give(opts); }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Numeric reward ID or tag (e.g. STARTER_PACK).", "name": "IdOrTag", "type": "string" }, + { "description": "Lazy", "longDescription": "If yes, reward is saved with next player sync.", "name": "Lazy", "type": "yesno", "defaultValue": false } + ], + "objectGroups": [] + }, + { + "description": "Accept a given reward (credits bonuses). Use \"Reward accepted\" / \"Reward accept error\" to handle result.", + "fullName": "Accept reward", + "functionType": "Action", + "group": "Rewards", + "name": "RewardsAccept", + "sentence": "Accept reward (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._rewardAcceptTriggered = false; ext._rewardAcceptSuccess = false; ext._rewardAcceptError = ''; ext._rewardAcceptTag = ''; ext._rewardAcceptId = 0; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.rewards || typeof gp.rewards.accept !== 'function') return;", + " var num = Number(idOrTag);", + " if (!isNaN(num) && num !== 0) gp.rewards.accept({ id: num });", + " else gp.rewards.accept({ tag: String(idOrTag) });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Reward give request finished (success or error). Resets after check.", + "fullName": "Reward give finished", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsGiveFinished", + "sentence": "Reward give finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardGiveTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last reward give succeeded. Resets after check.", + "fullName": "Reward give success", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsGiveSuccess", + "sentence": "Reward give success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardGiveSuccess); if (ext && ext._rewardGiveSuccess) { ext._rewardGiveTriggered = false; ext._rewardGiveSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last reward give failed. Resets after check. Use \"Last reward give error\" for code.", + "fullName": "Reward give error", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsGiveError", + "sentence": "Reward give error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardGiveTriggered && !ext._rewardGiveSuccess); if (ext && ext._rewardGiveTriggered && !ext._rewardGiveSuccess) { ext._rewardGiveTriggered = false; ext._rewardGiveError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Reward accept request finished (success or error). Resets after check.", + "fullName": "Reward accept finished", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsAcceptFinished", + "sentence": "Reward accept finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardAcceptTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last reward accept succeeded. Resets after check.", + "fullName": "Reward accept success", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsAcceptSuccess", + "sentence": "Reward accept success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardAcceptSuccess); if (ext && ext._rewardAcceptSuccess) { ext._rewardAcceptTriggered = false; ext._rewardAcceptSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last reward accept failed. Resets after check.", + "fullName": "Reward accept error", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsAcceptError", + "sentence": "Reward accept error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._rewardAcceptTriggered && !ext._rewardAcceptSuccess); if (ext && ext._rewardAcceptTriggered && !ext._rewardAcceptSuccess) { ext._rewardAcceptTriggered = false; ext._rewardAcceptError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the reward has been given to the player.", + "fullName": "Reward given", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsHas", + "sentence": "Reward given (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var num = Number(idOrTag);", + " eventsFunctionContext.returnValue = !!(gp && gp.rewards && ( (!isNaN(num) && num !== 0) ? gp.rewards.has(num) : gp.rewards.has(String(idOrTag)) ));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if the reward has been accepted by the player.", + "fullName": "Reward accepted", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsHasAccepted", + "sentence": "Reward accepted (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var num = Number(idOrTag);", + " eventsFunctionContext.returnValue = !!(gp && gp.rewards && ( (!isNaN(num) && num !== 0) ? gp.rewards.hasAccepted(num) : gp.rewards.hasAccepted(String(idOrTag)) ));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if there is a given but not accepted reward.", + "fullName": "Reward given but not accepted", + "functionType": "Condition", + "group": "Rewards", + "name": "RewardsHasUnaccepted", + "sentence": "Reward given but not accepted (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var num = Number(idOrTag);", + " eventsFunctionContext.returnValue = !!(gp && gp.rewards && ( (!isNaN(num) && num !== 0) ? gp.rewards.hasUnaccepted(num) : gp.rewards.hasUnaccepted(String(idOrTag)) ));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Error code of the last failed reward give (e.g. reward_not_found, player_not_found).", + "fullName": "Last reward give error", + "functionType": "StringExpression", + "group": "Rewards", + "name": "RewardsLastGiveError", + "sentence": "Last reward give error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._rewardGiveError) ? String(ext._rewardGiveError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag of the reward that was just given (after Reward give success).", + "fullName": "Last given reward tag", + "functionType": "StringExpression", + "group": "Rewards", + "name": "RewardsLastGiveTag", + "sentence": "Last given reward tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._rewardGiveTag) ? String(ext._rewardGiveTag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Error code of the last failed reward accept.", + "fullName": "Last reward accept error", + "functionType": "StringExpression", + "group": "Rewards", + "name": "RewardsLastAcceptError", + "sentence": "Last reward accept error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._rewardAcceptError) ? String(ext._rewardAcceptError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of rewards in the project (from gp.rewards.list).", + "fullName": "Rewards list count", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsListCount", + "sentence": "Rewards list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.rewards && gp.rewards.list; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of given rewards for the player (from gp.rewards.givenList).", + "fullName": "Rewards given list count", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsGivenListCount", + "sentence": "Rewards given list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.rewards && gp.rewards.givenList; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Reward ID at index in the full rewards list.", + "fullName": "Reward ID at", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsRewardIdAt", + "sentence": "Reward ID at (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.rewards && gp.rewards.list; var i = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\"))) || 0; var r = Array.isArray(list) && list[i] ? list[i] : null; eventsFunctionContext.returnValue = (r && r.id != null) ? Number(r.id) : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in rewards list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Reward tag at index in the full rewards list.", + "fullName": "Reward tag at", + "functionType": "StringExpression", + "group": "Rewards", + "name": "RewardsRewardTagAt", + "sentence": "Reward tag at (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.rewards && gp.rewards.list; var i = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\"))) || 0; var r = Array.isArray(list) && list[i] ? list[i] : null; eventsFunctionContext.returnValue = (r && r.tag != null) ? String(r.tag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in rewards list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Reward name at index in the full rewards list (localized).", + "fullName": "Reward name at", + "functionType": "StringExpression", + "group": "Rewards", + "name": "RewardsRewardNameAt", + "sentence": "Reward name at (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.rewards && gp.rewards.list; var i = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\"))) || 0; var r = Array.isArray(list) && list[i] ? list[i] : null; eventsFunctionContext.returnValue = (r && r.name != null) ? String(r.name) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in rewards list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get reward ID by ID or tag (from getReward). Returns 0 if not found.", + "fullName": "Reward ID by ID or tag", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsRewardId", + "sentence": "Reward ID (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.rewards || typeof gp.rewards.getReward !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var num = Number(idOrTag);", + " var data = (!isNaN(num) && num !== 0) ? gp.rewards.getReward(num) : gp.rewards.getReward(String(idOrTag));", + " var r = data && data.reward;", + " eventsFunctionContext.returnValue = (r && r.id != null) ? Number(r.id) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Total count of given rewards for the player (by reward ID or tag).", + "fullName": "Player reward count total", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsPlayerRewardCountTotal", + "sentence": "Player reward count total (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.rewards || typeof gp.rewards.getReward !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var num = Number(idOrTag);", + " var data = (!isNaN(num) && num !== 0) ? gp.rewards.getReward(num) : gp.rewards.getReward(String(idOrTag));", + " var pr = data && data.playerReward;", + " eventsFunctionContext.returnValue = (pr && pr.countTotal != null) ? Number(pr.countTotal) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Count of accepted rewards for the player (by reward ID or tag).", + "fullName": "Player reward count accepted", + "functionType": "NumberExpression", + "group": "Rewards", + "name": "RewardsPlayerRewardCountAccepted", + "sentence": "Player reward count accepted (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.rewards || typeof gp.rewards.getReward !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var num = Number(idOrTag);", + " var data = (!isNaN(num) && num !== 0) ? gp.rewards.getReward(num) : gp.rewards.getReward(String(idOrTag));", + " var pr = data && data.playerReward;", + " eventsFunctionContext.returnValue = (pr && pr.countAccepted != null) ? Number(pr.countAccepted) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Reward ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Claim trigger reward by ID or tag. Lazy Sync. Check \"Trigger claim completed\" / \"Trigger claim error\" and \"Last trigger claim error\".", + "fullName": "Claim trigger reward", + "functionType": "Action", + "group": "Triggers", + "name": "TriggersClaim", + "sentence": "Claim trigger reward (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._triggerClaimTriggered = false; ext._triggerClaimSuccess = false; ext._triggerClaimError = ''; ext._triggerClaimTag = ''; ext._triggerClaimId = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.triggers || typeof gp.triggers.claim !== 'function') return;", + " var opts = {};", + " var idMatch = /^[0-9a-fA-F]{24}$/.test(String(idOrTag));", + " if (idMatch) opts.id = String(idOrTag); else opts.tag = String(idOrTag);", + " gp.triggers.claim(opts).then(function(result) {", + " if (ext && result && result.trigger) {", + " var t = result.trigger;", + " ext._triggerClaimTriggered = true;", + " ext._triggerClaimSuccess = true;", + " ext._triggerClaimError = '';", + " ext._triggerClaimTag = (t.tag != null) ? String(t.tag) : '';", + " ext._triggerClaimId = (t.id != null) ? String(t.id) : '';", + " }", + " }).catch(function(err) {", + " if (ext) {", + " ext._triggerClaimTriggered = true;", + " ext._triggerClaimSuccess = false;", + " ext._triggerClaimError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " ext._triggerClaimTag = '';", + " ext._triggerClaimId = '';", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Trigger ID (24 hex chars) or tag (e.g. LEVEL_10).", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Trigger claim request finished (success or error). Resets after check.", + "fullName": "Trigger claim finished", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersClaimFinished", + "sentence": "Trigger claim finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerClaimTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last trigger claim succeeded. Resets after check.", + "fullName": "Trigger claim success", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersClaimSuccess", + "sentence": "Trigger claim success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerClaimSuccess); if (ext && ext._triggerClaimSuccess) { ext._triggerClaimTriggered = false; ext._triggerClaimSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last trigger claim failed. Resets after check. Use \"Last trigger claim error\" for code.", + "fullName": "Trigger claim error", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersClaimError", + "sentence": "Trigger claim error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerClaimTriggered && !ext._triggerClaimSuccess); if (ext && ext._triggerClaimTriggered && !ext._triggerClaimSuccess) { ext._triggerClaimTriggered = false; ext._triggerClaimError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if trigger is activated (conditions met).", + "fullName": "Trigger activated", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersIsActivated", + "sentence": "Trigger activated (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.triggers && typeof gp.triggers.isActivated === 'function' && gp.triggers.isActivated(String(idOrTag)));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Trigger ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if trigger reward has been claimed.", + "fullName": "Trigger reward claimed", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersIsClaimed", + "sentence": "Trigger reward claimed (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.triggers && typeof gp.triggers.isClaimed === 'function' && gp.triggers.isClaimed(String(idOrTag)));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Trigger ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: a trigger was activated. Resets after check. Use \"Last trigger activate tag\" / \"Last trigger activate ID\".", + "fullName": "Trigger activated (event)", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersOnActivate", + "sentence": "Trigger activated (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerActivateTriggered); if (ext && ext._triggerActivateTriggered) ext._triggerActivateTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: trigger reward was claimed (event). Resets after check.", + "fullName": "Trigger reward claimed (event)", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersOnClaim", + "sentence": "Trigger reward claimed (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerClaimTriggered && ext._triggerClaimSuccess); if (ext && ext._triggerClaimTriggered && ext._triggerClaimSuccess) { ext._triggerClaimTriggered = false; ext._triggerClaimSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: trigger claim failed (event). Resets after check.", + "fullName": "Trigger claim failed (event)", + "functionType": "Condition", + "group": "Triggers", + "name": "TriggersOnErrorClaim", + "sentence": "Trigger claim failed (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._triggerClaimTriggered && !ext._triggerClaimSuccess); if (ext && ext._triggerClaimTriggered && !ext._triggerClaimSuccess) { ext._triggerClaimTriggered = false; ext._triggerClaimError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of triggers in the list (all triggers).", + "fullName": "Trigger list count", + "functionType": "NumberExpression", + "group": "Triggers", + "name": "TriggersListCount", + "sentence": "Trigger list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.triggers && gp.triggers.list; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of activated triggers.", + "fullName": "Activated trigger list count", + "functionType": "NumberExpression", + "group": "Triggers", + "name": "TriggersActivatedListCount", + "sentence": "Activated trigger list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.triggers && gp.triggers.activatedList; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get trigger ID at index in full list. Index 0-based.", + "fullName": "Trigger ID at", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersTriggerIdAt", + "sentence": "Trigger ID at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.triggers && gp.triggers.list;", + " var t = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (t && t.id != null) ? String(t.id) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get trigger tag at index in full list. Index 0-based.", + "fullName": "Trigger tag at", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersTriggerTagAt", + "sentence": "Trigger tag at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.triggers && gp.triggers.list;", + " var t = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (t && t.tag != null) ? String(t.tag) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get activated trigger ID at index. Index 0-based.", + "fullName": "Activated trigger ID at", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersActivatedIdAt", + "sentence": "Activated trigger ID at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.triggers && gp.triggers.activatedList;", + " eventsFunctionContext.returnValue = (Array.isArray(list) && list[idx] != null) ? String(list[idx]) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Trigger description by ID or tag (from getTrigger).", + "fullName": "Trigger description", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersDescription", + "sentence": "Trigger description (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.triggers || typeof gp.triggers.getTrigger !== 'function') { eventsFunctionContext.returnValue = ''; return; }", + " var data = gp.triggers.getTrigger(String(idOrTag));", + " var t = data && data.trigger;", + " eventsFunctionContext.returnValue = (t && t.description != null) ? String(t.description) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Trigger ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Last trigger claim error code (trigger_not_found, trigger_not_activated, trigger_already_claimed, etc.).", + "fullName": "Last trigger claim error", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersLastClaimError", + "sentence": "Last trigger claim error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._triggerClaimError != null) ? String(ext._triggerClaimError) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag of trigger that fired activate/claim event.", + "fullName": "Last trigger activate tag", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersLastActivateTag", + "sentence": "Last trigger activate tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._triggerActivateTag != null) ? String(ext._triggerActivateTag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "ID of trigger that fired activate/claim event.", + "fullName": "Last trigger activate ID", + "functionType": "StringExpression", + "group": "Triggers", + "name": "TriggersLastActivateId", + "sentence": "Last trigger activate ID", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._triggerActivateId != null) ? String(ext._triggerActivateId) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Register player in a reward scheduler by ID or tag. +1 Request. Docs: https://docs.gamepush.com/docs/schedulers/schedulers-api/.", + "fullName": "Register in scheduler", + "functionType": "Action", + "group": "Rewards Schedulers", + "name": "SchedulersRegister", + "sentence": "Register in scheduler (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._schedulersRegisterTriggered = false; ext._schedulersRegisterSuccess = false; ext._schedulersRegisterError = ''; ext._schedulersRegisterSchedulerId = 0; ext._schedulersRegisterSchedulerTag = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.register !== 'function') return;", + " var opts = {};", + " var num = Number(idOrTag);", + " if (num === num && num >= 0) opts.id = num; else opts.tag = String(idOrTag);", + " gp.schedulers.register(opts).then(function(result) {", + " if (ext && result) {", + " ext._schedulersRegisterTriggered = true;", + " ext._schedulersRegisterSuccess = true;", + " ext._schedulersRegisterError = '';", + " if (result.scheduler) { ext._schedulersRegisterSchedulerId = Number(result.scheduler.id) || 0; ext._schedulersRegisterSchedulerTag = (result.scheduler.tag != null) ? String(result.scheduler.tag) : ''; }", + " }", + " }).catch(function(err) {", + " if (ext) {", + " ext._schedulersRegisterTriggered = true;", + " ext._schedulersRegisterSuccess = false;", + " ext._schedulersRegisterError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Scheduler ID (number) or tag (e.g. DAILY_30).", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Claim reward for the day. +Lazy Sync. Check \"Scheduler claim day finished\" / success / error.", + "fullName": "Claim scheduler day reward", + "functionType": "Action", + "group": "Rewards Schedulers", + "name": "SchedulersClaimDay", + "sentence": "Claim scheduler day reward (scheduler: _PARAM1_, day: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var day = Number(eventsFunctionContext.getArgument(\"Day\"));", + " var ext = gdjs.GamePush;", + " if (ext) { ext._schedulersClaimDayTriggered = false; ext._schedulersClaimDaySuccess = false; ext._schedulersClaimDayError = ''; ext._schedulersClaimDaySchedulerId = 0; ext._schedulersClaimDaySchedulerTag = ''; ext._schedulersClaimDayDay = 0; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.claimDay !== 'function') return;", + " gp.schedulers.claimDay(String(idOrTag), day).then(function(result) {", + " if (ext && result) {", + " ext._schedulersClaimDayTriggered = true;", + " ext._schedulersClaimDaySuccess = true;", + " ext._schedulersClaimDayError = '';", + " if (result.scheduler) { ext._schedulersClaimDaySchedulerId = Number(result.scheduler.id) || 0; ext._schedulersClaimDaySchedulerTag = (result.scheduler.tag != null) ? String(result.scheduler.tag) : ''; }", + " if (result.day != null) ext._schedulersClaimDayDay = Number(result.day);", + " }", + " }).catch(function(err) {", + " if (ext) {", + " ext._schedulersClaimDayTriggered = true;", + " ext._schedulersClaimDaySuccess = false;", + " ext._schedulersClaimDayError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "longDescription": "Day number (1-based).", "name": "Day", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Claim reward for the day for additional activity (trigger). +Lazy Sync.", + "fullName": "Claim scheduler day additional reward", + "functionType": "Action", + "group": "Rewards Schedulers", + "name": "SchedulersClaimDayAdditional", + "sentence": "Claim scheduler day additional reward (scheduler: _PARAM1_, day: _PARAM2_, trigger: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var day = Number(eventsFunctionContext.getArgument(\"Day\"));", + " var triggerIdOrTag = eventsFunctionContext.getArgument(\"TriggerIdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._schedulersClaimDayAdditionalTriggered = false; ext._schedulersClaimDayAdditionalSuccess = false; ext._schedulersClaimDayAdditionalError = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.claimDayAdditional !== 'function') return;", + " gp.schedulers.claimDayAdditional(String(idOrTag), day, String(triggerIdOrTag)).then(function() {", + " if (ext) { ext._schedulersClaimDayAdditionalTriggered = true; ext._schedulersClaimDayAdditionalSuccess = true; ext._schedulersClaimDayAdditionalError = ''; }", + " }).catch(function(err) {", + " if (ext) { ext._schedulersClaimDayAdditionalTriggered = true; ext._schedulersClaimDayAdditionalSuccess = false; ext._schedulersClaimDayAdditionalError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "name": "Day", "type": "expression" }, + { "description": "Trigger ID or tag", "name": "TriggerIdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Claim all rewards for the day (login + triggers). +Lazy Sync.", + "fullName": "Claim scheduler all day rewards", + "functionType": "Action", + "group": "Rewards Schedulers", + "name": "SchedulersClaimAllDay", + "sentence": "Claim scheduler all day rewards (scheduler: _PARAM1_, day: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var day = Number(eventsFunctionContext.getArgument(\"Day\"));", + " var ext = gdjs.GamePush;", + " if (ext) { ext._schedulersClaimAllDayTriggered = false; ext._schedulersClaimAllDaySuccess = false; ext._schedulersClaimAllDayError = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.claimAllDay !== 'function') return;", + " gp.schedulers.claimAllDay(String(idOrTag), day).then(function() {", + " if (ext) { ext._schedulersClaimAllDayTriggered = true; ext._schedulersClaimAllDaySuccess = true; ext._schedulersClaimAllDayError = ''; }", + " }).catch(function(err) {", + " if (ext) { ext._schedulersClaimAllDayTriggered = true; ext._schedulersClaimAllDaySuccess = false; ext._schedulersClaimAllDayError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "name": "Day", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Claim rewards for all completed days at once. +Lazy Sync.", + "fullName": "Claim scheduler all days rewards", + "functionType": "Action", + "group": "Rewards Schedulers", + "name": "SchedulersClaimAllDays", + "sentence": "Claim scheduler all days rewards (scheduler: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._schedulersClaimAllDaysTriggered = false; ext._schedulersClaimAllDaysSuccess = false; ext._schedulersClaimAllDaysError = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.claimAllDays !== 'function') return;", + " gp.schedulers.claimAllDays(String(idOrTag)).then(function() {", + " if (ext) { ext._schedulersClaimAllDaysTriggered = true; ext._schedulersClaimAllDaysSuccess = true; ext._schedulersClaimAllDaysError = ''; }", + " }).catch(function(err) {", + " if (ext) { ext._schedulersClaimAllDaysTriggered = true; ext._schedulersClaimAllDaysSuccess = false; ext._schedulersClaimAllDaysError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if the player is registered in the scheduler.", + "fullName": "Player registered in scheduler", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersIsRegistered", + "sentence": "Player registered in scheduler (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\"); var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.schedulers && typeof gp.schedulers.isRegistered === 'function' && gp.schedulers.isRegistered(String(idOrTag))); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if today's reward has been claimed in the scheduler.", + "fullName": "Scheduler today reward claimed", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersIsTodayRewardClaimed", + "sentence": "Scheduler today reward claimed (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\"); var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.schedulers && typeof gp.schedulers.isTodayRewardClaimed === 'function' && gp.schedulers.isTodayRewardClaimed(String(idOrTag))); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if the reward for the day can be claimed.", + "fullName": "Scheduler can claim day", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersCanClaimDay", + "sentence": "Scheduler can claim day (scheduler: _PARAM1_, day: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\"); var day = Number(eventsFunctionContext.getArgument(\"Day\")); var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.schedulers && typeof gp.schedulers.canClaimDay === 'function' && gp.schedulers.canClaimDay(String(idOrTag), day)); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "name": "Day", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Check if the reward for additional activity (trigger) for the day can be claimed.", + "fullName": "Scheduler can claim day additional", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersCanClaimDayAdditional", + "sentence": "Scheduler can claim day additional (scheduler: _PARAM1_, day: _PARAM2_, trigger: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\"); var day = Number(eventsFunctionContext.getArgument(\"Day\")); var triggerIdOrTag = eventsFunctionContext.getArgument(\"TriggerIdOrTag\"); var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.schedulers && typeof gp.schedulers.canClaimDayAdditional === 'function' && gp.schedulers.canClaimDayAdditional(String(idOrTag), day, String(triggerIdOrTag))); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "name": "Day", "type": "expression" }, + { "description": "Trigger ID or tag", "name": "TriggerIdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if any reward for the day (login or triggers) can be claimed.", + "fullName": "Scheduler can claim all day", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersCanClaimAllDay", + "sentence": "Scheduler can claim all day (scheduler: _PARAM1_, day: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\"); var day = Number(eventsFunctionContext.getArgument(\"Day\")); var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.schedulers && typeof gp.schedulers.canClaimAllDay === 'function' && gp.schedulers.canClaimAllDay(String(idOrTag), day)); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" }, + { "defaultValue": "1", "description": "Day", "name": "Day", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Scheduler: player registered (event). Resets after check.", + "fullName": "Scheduler registered (event)", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersOnRegister", + "sentence": "Scheduler registered (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._schedulersRegisterTriggered && ext._schedulersRegisterSuccess); if (ext && ext._schedulersRegisterTriggered && ext._schedulersRegisterSuccess) { ext._schedulersRegisterTriggered = false; ext._schedulersRegisterSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Scheduler: register failed (event). Resets after check.", + "fullName": "Scheduler register error (event)", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersOnRegisterError", + "sentence": "Scheduler register error (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._schedulersRegisterTriggered && !ext._schedulersRegisterSuccess); if (ext && ext._schedulersRegisterTriggered && !ext._schedulersRegisterSuccess) { ext._schedulersRegisterTriggered = false; ext._schedulersRegisterError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Scheduler: reward for the day claimed (event). Resets after check.", + "fullName": "Scheduler claim day (event)", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersOnClaimDay", + "sentence": "Scheduler claim day (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._schedulersClaimDayTriggered && ext._schedulersClaimDaySuccess); if (ext && ext._schedulersClaimDayTriggered && ext._schedulersClaimDaySuccess) { ext._schedulersClaimDayTriggered = false; ext._schedulersClaimDaySuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Scheduler: claim day failed (event). Resets after check.", + "fullName": "Scheduler claim day error (event)", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersOnClaimDayError", + "sentence": "Scheduler claim day error (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._schedulersClaimDayTriggered && !ext._schedulersClaimDaySuccess); if (ext && ext._schedulersClaimDayTriggered && !ext._schedulersClaimDaySuccess) { ext._schedulersClaimDayTriggered = false; ext._schedulersClaimDayError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Scheduler: all days claimed (event). Resets after check.", + "fullName": "Scheduler claim all days (event)", + "functionType": "Condition", + "group": "Rewards Schedulers", + "name": "SchedulersOnClaimAllDays", + "sentence": "Scheduler claim all days (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._schedulersClaimAllDaysTriggered && ext._schedulersClaimAllDaysSuccess); if (ext && ext._schedulersClaimAllDaysTriggered && ext._schedulersClaimAllDaysSuccess) { ext._schedulersClaimAllDaysTriggered = false; ext._schedulersClaimAllDaysSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of schedulers in the list.", + "fullName": "Scheduler list count", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersListCount", + "sentence": "Scheduler list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.schedulers && gp.schedulers.list; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of active schedulers the player is enrolled in.", + "fullName": "Scheduler active list count", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersActiveListCount", + "sentence": "Scheduler active list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.schedulers && gp.schedulers.activeList; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get scheduler ID at index in list. Index 0-based.", + "fullName": "Scheduler ID at", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersSchedulerIdAt", + "sentence": "Scheduler ID at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.schedulers && gp.schedulers.list;", + " var s = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (s && s.id != null) ? Number(s.id) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get scheduler tag at index in list. Index 0-based.", + "fullName": "Scheduler tag at", + "functionType": "StringExpression", + "group": "Rewards Schedulers", + "name": "SchedulersSchedulerTagAt", + "sentence": "Scheduler tag at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.schedulers && gp.schedulers.list;", + " var s = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (s && s.tag != null) ? String(s.tag) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Current day in the scheduler for the player (from getScheduler).", + "fullName": "Scheduler current day", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersCurrentDay", + "sentence": "Scheduler current day (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.getScheduler !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var info = gp.schedulers.getScheduler(String(idOrTag));", + " eventsFunctionContext.returnValue = (info && info.currentDay != null) ? Number(info.currentDay) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Total number of days in the scheduler (from getScheduler).", + "fullName": "Scheduler days count", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersDaysCount", + "sentence": "Scheduler days count (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.schedulers || typeof gp.schedulers.getScheduler !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var info = gp.schedulers.getScheduler(String(idOrTag));", + " var s = info && info.scheduler;", + " eventsFunctionContext.returnValue = (s && s.days != null) ? Number(s.days) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "Scheduler ID or tag", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Last scheduler register error code.", + "fullName": "Last scheduler register error", + "functionType": "StringExpression", + "group": "Rewards Schedulers", + "name": "SchedulersLastRegisterError", + "sentence": "Last scheduler register error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._schedulersRegisterError != null) ? String(ext._schedulersRegisterError) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last scheduler claim day error code.", + "fullName": "Last scheduler claim day error", + "functionType": "StringExpression", + "group": "Rewards Schedulers", + "name": "SchedulersLastClaimDayError", + "sentence": "Last scheduler claim day error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._schedulersClaimDayError != null) ? String(ext._schedulersClaimDayError) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Scheduler tag from last claim day event.", + "fullName": "Last scheduler claim day tag", + "functionType": "StringExpression", + "group": "Rewards Schedulers", + "name": "SchedulersLastClaimDayTag", + "sentence": "Last scheduler claim day tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._schedulersClaimDaySchedulerTag != null) ? String(ext._schedulersClaimDaySchedulerTag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Day number from last claim day event.", + "fullName": "Last scheduler claim day number", + "functionType": "NumberExpression", + "group": "Rewards Schedulers", + "name": "SchedulersLastClaimDayDay", + "sentence": "Last scheduler claim day number", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._schedulersClaimDayDay != null) ? Number(ext._schedulersClaimDayDay) : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the player is in the segment by tag (e.g. HAS_PAYMENTS, VIP, NEWBLE).", + "fullName": "Player in segment", + "functionType": "Condition", + "group": "Segments", + "name": "SegmentsHas", + "sentence": "Player in segment (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var tag = eventsFunctionContext.getArgument(\"Tag\"); eventsFunctionContext.returnValue = !!(gp && gp.segments && typeof gp.segments.has === 'function' && gp.segments.has(String(tag))); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Segment tag", "longDescription": "Segment tag (e.g. HAS_PAYMENTS, VIP).", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Player entered a segment (event). Resets after check.", + "fullName": "Segment enter (event)", + "functionType": "Condition", + "group": "Segments", + "name": "SegmentsOnEnter", + "sentence": "Segment enter (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._segmentEnterTriggered); if (ext && ext._segmentEnterTriggered) ext._segmentEnterTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player left a segment (event). Resets after check.", + "fullName": "Segment leave (event)", + "functionType": "Condition", + "group": "Segments", + "name": "SegmentsOnLeave", + "sentence": "Segment leave (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._segmentLeaveTriggered); if (ext && ext._segmentLeaveTriggered) ext._segmentLeaveTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of segments in the list (all segments the player can be in).", + "fullName": "Segment list count", + "functionType": "NumberExpression", + "group": "Segments", + "name": "SegmentsListCount", + "sentence": "Segment list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.segments && gp.segments.list; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get segment tag at index in the list. Index 0-based.", + "fullName": "Segment tag at", + "functionType": "StringExpression", + "group": "Segments", + "name": "SegmentsTagAt", + "sentence": "Segment tag at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.segments && gp.segments.list;", + " eventsFunctionContext.returnValue = (Array.isArray(list) && list[idx] != null) ? String(list[idx]) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Tag of segment that fired enter event.", + "fullName": "Last segment enter tag", + "functionType": "StringExpression", + "group": "Segments", + "name": "SegmentsLastEnterTag", + "sentence": "Last segment enter tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._segmentEnterTag != null) ? String(ext._segmentEnterTag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag of segment that fired leave event.", + "fullName": "Last segment leave tag", + "functionType": "StringExpression", + "group": "Segments", + "name": "SegmentsLastLeaveTag", + "sentence": "Last segment leave tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._segmentLeaveTag != null) ? String(ext._segmentLeaveTag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Join an event by ID or tag. +1 Request. Check \"Event join finished\" / \"Event join success\" / \"Event join error\" and \"Last event join error\".", + "fullName": "Join event", + "functionType": "Action", + "group": "Events", + "name": "EventsJoin", + "sentence": "Join event (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._eventsJoinTriggered = false; ext._eventsJoinSuccess = false; ext._eventsJoinError = ''; ext._eventsJoinEventId = 0; ext._eventsJoinEventTag = ''; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.events || typeof gp.events.join !== 'function') return;", + " var opts = {};", + " var num = Number(idOrTag);", + " if (num === num && num >= 0) opts.id = num; else opts.tag = String(idOrTag);", + " gp.events.join(opts).then(function(result) {", + " if (ext && result && result.event) {", + " var ev = result.event;", + " ext._eventsJoinTriggered = true;", + " ext._eventsJoinSuccess = true;", + " ext._eventsJoinError = '';", + " ext._eventsJoinEventId = (ev.id != null) ? Number(ev.id) : 0;", + " ext._eventsJoinEventTag = (ev.tag != null) ? String(ev.tag) : '';", + " }", + " }).catch(function(err) {", + " if (ext) {", + " ext._eventsJoinTriggered = true;", + " ext._eventsJoinSuccess = false;", + " ext._eventsJoinError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " ext._eventsJoinEventId = 0;", + " ext._eventsJoinEventTag = '';", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID (number) or tag (e.g. HALLOWEEN).", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Event join request finished (success or error). Resets after check.", + "fullName": "Event join finished", + "functionType": "Condition", + "group": "Events", + "name": "EventsJoinFinished", + "sentence": "Event join finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._eventsJoinTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last event join succeeded. Resets after check.", + "fullName": "Event join success", + "functionType": "Condition", + "group": "Events", + "name": "EventsJoinSuccess", + "sentence": "Event join success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._eventsJoinSuccess); if (ext && ext._eventsJoinSuccess) { ext._eventsJoinTriggered = false; ext._eventsJoinSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last event join failed. Resets after check. Use \"Last event join error\" for code.", + "fullName": "Event join error", + "functionType": "Condition", + "group": "Events", + "name": "EventsJoinError", + "sentence": "Event join error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._eventsJoinTriggered && !ext._eventsJoinSuccess); if (ext && ext._eventsJoinTriggered && !ext._eventsJoinSuccess) { ext._eventsJoinTriggered = false; ext._eventsJoinError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if event is active (gp.events.has).", + "fullName": "Event is active", + "functionType": "Condition", + "group": "Events", + "name": "EventsHas", + "sentence": "Event is active (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var val = idOrTag;", + " if (gp && gp.events && typeof gp.events.has === 'function') eventsFunctionContext.returnValue = !!gp.events.has(val);", + " else eventsFunctionContext.returnValue = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if player is joined in the event (gp.events.isJoined).", + "fullName": "Player joined event", + "functionType": "Condition", + "group": "Events", + "name": "EventsIsJoined", + "sentence": "Player joined event (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.events && typeof gp.events.isJoined === 'function' && gp.events.isJoined(idOrTag));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Event: player joined an event. Resets after check.", + "fullName": "Player joined event (event)", + "functionType": "Condition", + "group": "Events", + "name": "EventsOnJoin", + "sentence": "Player joined event (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._eventsJoinTriggered && ext._eventsJoinSuccess); if (ext && ext._eventsJoinTriggered && ext._eventsJoinSuccess) { ext._eventsJoinTriggered = false; ext._eventsJoinSuccess = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Event: event join failed. Resets after check.", + "fullName": "Event join failed (event)", + "functionType": "Condition", + "group": "Events", + "name": "EventsOnErrorJoin", + "sentence": "Event join failed (event)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._eventsJoinTriggered && !ext._eventsJoinSuccess); if (ext && ext._eventsJoinTriggered && !ext._eventsJoinSuccess) { ext._eventsJoinTriggered = false; ext._eventsJoinError = ''; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of events in the list (gp.events.list).", + "fullName": "Event list count", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsListCount", + "sentence": "Event list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.events && gp.events.list; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of events the player is participating in (gp.events.activeList).", + "fullName": "Player active events count", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsActiveListCount", + "sentence": "Player active events count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var list = gp && gp.events && gp.events.activeList; eventsFunctionContext.returnValue = Array.isArray(list) ? list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get event ID at index in gp.events.list. Index 0-based.", + "fullName": "Event ID at", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsEventIdAt", + "sentence": "Event ID at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.events && gp.events.list;", + " var ev = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (ev && ev.id != null) ? Number(ev.id) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get event tag at index in gp.events.list. Index 0-based.", + "fullName": "Event tag at", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsEventTagAt", + "sentence": "Event tag at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.events && gp.events.list;", + " var ev = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (ev && ev.tag != null) ? String(ev.tag) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get event name at index in gp.events.list. Index 0-based.", + "fullName": "Event name at", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsEventNameAt", + "sentence": "Event name at (index: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Number(eventsFunctionContext.getArgument(\"Index\"));", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var list = gp && gp.events && gp.events.list;", + " var ev = Array.isArray(list) && list[idx] ? list[idx] : null;", + " eventsFunctionContext.returnValue = (ev && ev.name != null) ? String(ev.name) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Get event info by ID or tag (gp.events.getEvent). Returns event, isJoined, stats, rewards, achievements, products.", + "fullName": "Event name (ID or tag)", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsEventName", + "sentence": "Event name (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.events || typeof gp.events.getEvent !== 'function') { eventsFunctionContext.returnValue = ''; return; }", + " var info = gp.events.getEvent(idOrTag);", + " var ev = info && info.event;", + " eventsFunctionContext.returnValue = (ev && ev.name != null) ? String(ev.name) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Event description by ID or tag (from getEvent).", + "fullName": "Event description (ID or tag)", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsEventDescription", + "sentence": "Event description (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.events || typeof gp.events.getEvent !== 'function') { eventsFunctionContext.returnValue = ''; return; }", + " var info = gp.events.getEvent(idOrTag);", + " var ev = info && info.event;", + " eventsFunctionContext.returnValue = (ev && ev.description != null) ? String(ev.description) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Seconds left until event ends (from getEvent).", + "fullName": "Event time left (ID or tag)", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsTimeLeft", + "sentence": "Event time left in seconds (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.events || typeof gp.events.getEvent !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var info = gp.events.getEvent(idOrTag);", + " var ev = info && info.event;", + " eventsFunctionContext.returnValue = (ev && ev.timeLeft != null) ? Number(ev.timeLeft) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Player active days in event (from getEvent stats).", + "fullName": "Player event active days (ID or tag)", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsActiveDays", + "sentence": "Player event active days (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.events || typeof gp.events.getEvent !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var info = gp.events.getEvent(idOrTag);", + " var stats = info && info.stats;", + " eventsFunctionContext.returnValue = (stats && stats.activeDays != null) ? Number(stats.activeDays) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Player consecutive active days in event (from getEvent stats).", + "fullName": "Player event active days consecutive (ID or tag)", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsActiveDaysConsecutive", + "sentence": "Player event active days consecutive (ID or tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idOrTag = eventsFunctionContext.getArgument(\"IdOrTag\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.events || typeof gp.events.getEvent !== 'function') { eventsFunctionContext.returnValue = 0; return; }", + " var info = gp.events.getEvent(idOrTag);", + " var stats = info && info.stats;", + " eventsFunctionContext.returnValue = (stats && stats.activeDaysConsecutive != null) ? Number(stats.activeDaysConsecutive) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "ID or tag", "longDescription": "Event ID or tag.", "name": "IdOrTag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Last event join error code (player_not_found, empty_id_or_tag, event_not_found, already_joined, etc.).", + "fullName": "Last event join error", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsLastJoinError", + "sentence": "Last event join error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._eventsJoinError != null) ? String(ext._eventsJoinError) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Event ID that fired join/error event.", + "fullName": "Last event join event ID", + "functionType": "NumberExpression", + "group": "Events", + "name": "EventsLastJoinEventId", + "sentence": "Last event join event ID", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._eventsJoinEventId != null) ? Number(ext._eventsJoinEventId) : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Event tag that fired join/error event.", + "fullName": "Last event join event tag", + "functionType": "StringExpression", + "group": "Events", + "name": "EventsLastJoinEventTag", + "sentence": "Last event join event tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._eventsJoinEventTag != null) ? String(ext._eventsJoinEventTag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Open the leaderboard (global by score field).", + "fullName": "Open leaderboard", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardOpen", + "sentence": "Open leaderboard", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.leaderboard) gp.leaderboard.open();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Open scoped (isolated) leaderboard. Tag and variant identify the scope (e.g. level, day, guild). See docs: https://docs.gamepush.com/ru/docs/leaderboards/scoped-leaderboard/.", + "fullName": "Open scoped leaderboard", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardScopedOpen", + "sentence": "Open scoped leaderboard (tag: _PARAM1_, variant: _PARAM2_, order: _PARAM3_, limit: _PARAM4_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var variant = String(eventsFunctionContext.getArgument(\"Variant\") || \"\");", + " var order = String(eventsFunctionContext.getArgument(\"Order\") || \"DESC\");", + " var limit = eventsFunctionContext.getArgument(\"Limit\");", + " var limitNum = (typeof limit === 'number') ? limit : (limit !== \"\" && limit != null ? Number(limit) : 10);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.leaderboard && gp.leaderboard.openScoped) {", + " var opts = { tag: tag, variant: variant, order: order, limit: limitNum };", + " gp.leaderboard.openScoped(opts);", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Table tag (e.g. LEVELS, BEST_DAY).", "name": "Tag", "type": "string" }, + { "description": "Variant", "longDescription": "Scope name (e.g. level_15, 01/31/2022).", "name": "Variant", "type": "string" }, + { "description": "Order", "longDescription": "DESC or ASC.", "name": "Order", "type": "string", "supplementaryInformation": "DESC|DESC\nASC|ASC" }, + { "defaultValue": "10", "description": "Limit", "longDescription": "Players in list (max 100).", "name": "Limit", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Fetch scoped leaderboard data (async). Check \"Scoped leaderboard fetch completed\" or \"Scoped leaderboard fetch error\" and use \"Scoped leaderboard player position\" expression.", + "fullName": "Fetch scoped leaderboard", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardScopedFetch", + "sentence": "Fetch scoped leaderboard (tag: _PARAM1_, variant: _PARAM2_, limit: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var variant = String(eventsFunctionContext.getArgument(\"Variant\") || \"\");", + " var limit = eventsFunctionContext.getArgument(\"Limit\");", + " var limitNum = (typeof limit === 'number') ? limit : (limit !== \"\" && limit != null ? Number(limit) : 10);", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.leaderboard || !gp.leaderboard.fetchScoped) return;", + " ext._leaderboardScopedTriggered = false;", + " ext._leaderboardScopedSuccess = false;", + " ext._leaderboardScopedResult = null;", + " gp.leaderboard.fetchScoped({ tag: tag, variant: variant, limit: limitNum, withMe: 'first', showNearest: 5 }).then(function(result) {", + " if (ext) { ext._leaderboardScopedTriggered = true; ext._leaderboardScopedSuccess = true; ext._leaderboardScopedResult = result; }", + " }).catch(function() {", + " if (ext) { ext._leaderboardScopedTriggered = true; ext._leaderboardScopedSuccess = false; }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Table tag.", "name": "Tag", "type": "string" }, + { "description": "Variant", "longDescription": "Scope name.", "name": "Variant", "type": "string" }, + { "defaultValue": "10", "description": "Limit", "longDescription": "Players in list (max 100).", "name": "Limit", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: scoped leaderboard fetch completed successfully. Resets after check.", + "fullName": "Scoped leaderboard fetch completed", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardScopedFetchSuccess", + "sentence": "Scoped leaderboard fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._leaderboardScopedTriggered && ext._leaderboardScopedSuccess);", + " if (ext && ext._leaderboardScopedTriggered) ext._leaderboardScopedTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: scoped leaderboard fetch failed. Resets after check.", + "fullName": "Scoped leaderboard fetch error", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardScopedFetchError", + "sentence": "Scoped leaderboard fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._leaderboardScopedTriggered && !ext._leaderboardScopedSuccess);", + " if (ext && ext._leaderboardScopedTriggered) ext._leaderboardScopedTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player position in last fetched scoped leaderboard (1-based). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player position", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerPosition", + "sentence": "Scoped leaderboard player position", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var pos = (r && r.player && r.player.position != null) ? r.player.position : 0;", + " eventsFunctionContext.returnValue = typeof pos === 'number' ? pos : Number(pos) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of players in last fetched scoped leaderboard (players array length). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player count", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerCount", + "sentence": "Scoped leaderboard player count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " eventsFunctionContext.returnValue = list.length;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player name at index in last fetched scoped leaderboard (0-based). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player name at index", + "functionType": "StringExpression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerNameAt", + "sentence": "Scoped leaderboard player name at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " eventsFunctionContext.returnValue = (p && p.name != null) ? String(p.name) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player ID at index in last fetched scoped leaderboard (0-based). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player ID at index", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerIdAt", + "sentence": "Scoped leaderboard player ID at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " var id = (p && p.id != null) ? p.id : 0;", + " eventsFunctionContext.returnValue = typeof id === 'number' ? id : Number(id) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player position (rank) at index in last fetched scoped leaderboard (0-based index). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player position at index", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerPositionAt", + "sentence": "Scoped leaderboard player position at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " var pos = (p && p.position != null) ? p.position : 0;", + " eventsFunctionContext.returnValue = typeof pos === 'number' ? pos : Number(pos) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player avatar URL at index in last fetched scoped leaderboard (0-based). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player avatar at index", + "functionType": "StringExpression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerAvatarAt", + "sentence": "Scoped leaderboard player avatar at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " eventsFunctionContext.returnValue = (p && p.avatar != null) ? String(p.avatar) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player custom variable (number) at index by name (e.g. score, gold). Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player variable (number) at index", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerVariableNumberAt", + "sentence": "Scoped leaderboard player variable (number) at index (_PARAM1_), name (_PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var varName = String(eventsFunctionContext.getArgument(\"VariableName\") || \"\").trim();", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " var v = (p && varName && p[varName] != null) ? p[varName] : 0;", + " eventsFunctionContext.returnValue = typeof v === 'number' ? v : Number(v) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" }, + { "description": "Variable name", "longDescription": "Field name (e.g. score, gold, level).", "name": "VariableName", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Player custom variable (string) at index by name. Use after \"Scoped leaderboard fetch completed\".", + "fullName": "Scoped leaderboard player variable (string) at index", + "functionType": "StringExpression", + "group": "Leaderboards", + "name": "LeaderboardScopedPlayerVariableStringAt", + "sentence": "Scoped leaderboard player variable (string) at index (_PARAM1_), name (_PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var varName = String(eventsFunctionContext.getArgument(\"VariableName\") || \"\").trim();", + " var ext = gdjs.GamePush;", + " var r = ext && ext._leaderboardScopedResult;", + " var list = (r && Array.isArray(r.players)) ? r.players : [];", + " var p = list[i];", + " var v = (p && varName && p[varName] != null) ? p[varName] : \"\";", + " eventsFunctionContext.returnValue = String(v);", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in players list.", "name": "Index", "type": "expression" }, + { "description": "Variable name", "longDescription": "Field name (e.g. text_time, nickname).", "name": "VariableName", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Publish player record to scoped leaderboard (async). Add fields: fill next \"name\" to add a field. Value type (number or string) is detected automatically. Override = overwrite even if not better. Check \"Scoped leaderboard publish completed\" or \"Scoped leaderboard publish error\".", + "fullName": "Publish record to scoped leaderboard", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardScopedPublishRecord", + "sentence": "Publish record to scoped leaderboard (tag: _PARAM1_, variant: _PARAM2_, override: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var variant = String(eventsFunctionContext.getArgument(\"Variant\") || \"\");", + " var override = !!eventsFunctionContext.getArgument(\"Override\");", + " var record = {};", + " var add = function(name, val) {", + " var n = String(name || \"\").trim();", + " if (!n) return;", + " var v = val;", + " if (typeof v === 'number' && !isNaN(v)) { record[n] = v; return; }", + " var s = String(v != null ? v : \"\");", + " var num = Number(s);", + " if (s.trim() !== '' && !isNaN(num) && /^-?[0-9]+(\\.[0-9]*)?$/.test(s.trim())) record[n] = num;", + " else record[n] = s;", + " };", + " add(eventsFunctionContext.getArgument(\"Field1Name\"), eventsFunctionContext.getArgument(\"Field1Value\"));", + " add(eventsFunctionContext.getArgument(\"Field2Name\"), eventsFunctionContext.getArgument(\"Field2Value\"));", + " add(eventsFunctionContext.getArgument(\"Field3Name\"), eventsFunctionContext.getArgument(\"Field3Value\"));", + " add(eventsFunctionContext.getArgument(\"Field4Name\"), eventsFunctionContext.getArgument(\"Field4Value\"));", + " add(eventsFunctionContext.getArgument(\"Field5Name\"), eventsFunctionContext.getArgument(\"Field5Value\"));", + " add(eventsFunctionContext.getArgument(\"Field6Name\"), eventsFunctionContext.getArgument(\"Field6Value\"));", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.leaderboard || !gp.leaderboard.publishRecord) return;", + " ext._leaderboardPublishTriggered = false;", + " ext._leaderboardPublishSuccess = false;", + " if (Object.keys(record).length === 0) {", + " ext._leaderboardPublishTriggered = true;", + " ext._leaderboardPublishSuccess = false;", + " } else {", + " gp.leaderboard.publishRecord({ tag: tag, variant: variant, override: override, record: record }).then(function() {", + " if (ext) { ext._leaderboardPublishTriggered = true; ext._leaderboardPublishSuccess = true; }", + " }).catch(function() {", + " if (ext) { ext._leaderboardPublishTriggered = true; ext._leaderboardPublishSuccess = false; }", + " });", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Table tag (e.g. scope).", "name": "Tag", "type": "string" }, + { "description": "Variant", "longDescription": "Scope name (e.g. all).", "name": "Variant", "type": "string" }, + { "description": "Override", "longDescription": "Overwrite record even if new value is not better (default: false).", "name": "Override", "type": "yesno", "defaultValue": false, "optional": true }, + { "description": "Field 1 — name", "longDescription": "Field name from dashboard. Empty = skip.", "name": "Field1Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 1 — value", "longDescription": "Number or text; type is detected automatically.", "name": "Field1Value", "type": "string", "optional": true }, + { "description": "Field 2 — name (+ add field)", "longDescription": "Fill to add second field.", "name": "Field2Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 2 — value", "longDescription": "Number or text.", "name": "Field2Value", "type": "string", "optional": true }, + { "description": "Field 3 — name (+ add field)", "longDescription": "Fill to add third field.", "name": "Field3Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 3 — value", "longDescription": "Number or text.", "name": "Field3Value", "type": "string", "optional": true }, + { "description": "Field 4 — name (+ add field)", "longDescription": "Fill to add fourth field.", "name": "Field4Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 4 — value", "longDescription": "Number or text.", "name": "Field4Value", "type": "string", "optional": true }, + { "description": "Field 5 — name (+ add field)", "longDescription": "Fill to add fifth field.", "name": "Field5Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 5 — value", "longDescription": "Number or text.", "name": "Field5Value", "type": "string", "optional": true }, + { "description": "Field 6 — name (+ add field)", "longDescription": "Fill to add sixth field.", "name": "Field6Name", "type": "string", "optional": true }, + { "defaultValue": "0", "description": "Field 6 — value", "longDescription": "Number or text.", "name": "Field6Value", "type": "string", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: scoped leaderboard publish completed successfully. Resets after check.", + "fullName": "Scoped leaderboard publish completed", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardScopedPublishSuccess", + "sentence": "Scoped leaderboard publish completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._leaderboardPublishTriggered && ext._leaderboardPublishSuccess);", + " if (ext && ext._leaderboardPublishTriggered) ext._leaderboardPublishTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: scoped leaderboard publish failed. Resets after check.", + "fullName": "Scoped leaderboard publish error", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardScopedPublishError", + "sentence": "Scoped leaderboard publish error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._leaderboardPublishTriggered && !ext._leaderboardPublishSuccess);", + " if (ext && ext._leaderboardPublishTriggered) ext._leaderboardPublishTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Fetch player rating in global leaderboard (async). See https://docs.gamepush.com/ru/docs/leaderboards/player-rating/.", + "fullName": "Fetch player rating", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRating", + "sentence": "Fetch player rating (orderBy: _PARAM1_, order: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var orderBy = String(eventsFunctionContext.getArgument(\"OrderBy\") || \"score\");", + " var order = String(eventsFunctionContext.getArgument(\"Order\") || \"DESC\");", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.leaderboard || !gp.leaderboard.fetchPlayerRating) return;", + " ext._playerRatingTriggered = false;", + " ext._playerRatingSuccess = false;", + " ext._playerRatingResult = null;", + " gp.leaderboard.fetchPlayerRating({ orderBy: orderBy.split(/[, ]/).filter(Boolean), order: order }).then(function(result) {", + " if (ext) { ext._playerRatingTriggered = true; ext._playerRatingSuccess = true; ext._playerRatingResult = result; }", + " }).catch(function() {", + " if (ext) { ext._playerRatingTriggered = true; ext._playerRatingSuccess = false; }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Order by", "longDescription": "Fields for sort (e.g. score or level,gold).", "name": "OrderBy", "type": "string" }, + { "description": "Order", "longDescription": "DESC or ASC.", "name": "Order", "type": "string", "supplementaryInformation": "DESC|DESC\nASC|ASC" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: player rating fetch completed successfully. Resets after check.", + "fullName": "Player rating fetch completed", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRatingSuccess", + "sentence": "Player rating fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._playerRatingTriggered && ext._playerRatingSuccess);", + " if (ext && ext._playerRatingTriggered) ext._playerRatingTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: player rating fetch failed. Resets after check.", + "fullName": "Player rating fetch error", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRatingError", + "sentence": "Player rating fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._playerRatingTriggered && !ext._playerRatingSuccess);", + " if (ext && ext._playerRatingTriggered) ext._playerRatingTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player position in global leaderboard from last fetch (1-based). Use after \"Player rating fetch completed\".", + "fullName": "Player rating position", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardPlayerRatingPosition", + "sentence": "Player rating position", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var r = ext && ext._playerRatingResult;", + " var pos = (r && r.player && r.player.position != null) ? r.player.position : 0;", + " eventsFunctionContext.returnValue = typeof pos === 'number' ? pos : Number(pos) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Fetch player rating in scoped leaderboard (async).", + "fullName": "Fetch player rating (scoped)", + "functionType": "Action", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRatingScoped", + "sentence": "Fetch player rating scoped (tag: _PARAM1_, variant: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var variant = String(eventsFunctionContext.getArgument(\"Variant\") || \"\");", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.leaderboard || !gp.leaderboard.fetchPlayerRatingScoped) return;", + " ext._playerRatingScopedTriggered = false;", + " ext._playerRatingScopedSuccess = false;", + " ext._playerRatingScopedResult = null;", + " gp.leaderboard.fetchPlayerRatingScoped({ tag: tag, variant: variant }).then(function(result) {", + " if (ext) { ext._playerRatingScopedTriggered = true; ext._playerRatingScopedSuccess = true; ext._playerRatingScopedResult = result; }", + " }).catch(function() {", + " if (ext) { ext._playerRatingScopedTriggered = true; ext._playerRatingScopedSuccess = false; }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Table tag.", "name": "Tag", "type": "string" }, + { "description": "Variant", "longDescription": "Scope name.", "name": "Variant", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: scoped player rating fetch completed successfully. Resets after check.", + "fullName": "Player rating (scoped) fetch completed", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRatingScopedSuccess", + "sentence": "Player rating (scoped) fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._playerRatingScopedTriggered && ext._playerRatingScopedSuccess);", + " if (ext && ext._playerRatingScopedTriggered) ext._playerRatingScopedTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: scoped player rating fetch failed. Resets after check.", + "fullName": "Player rating (scoped) fetch error", + "functionType": "Condition", + "group": "Leaderboards", + "name": "LeaderboardFetchPlayerRatingScopedError", + "sentence": "Player rating (scoped) fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._playerRatingScopedTriggered && !ext._playerRatingScopedSuccess);", + " if (ext && ext._playerRatingScopedTriggered) ext._playerRatingScopedTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player position in scoped leaderboard from last fetch (1-based). Use after \"Player rating (scoped) fetch completed\".", + "fullName": "Player rating (scoped) position", + "functionType": "Expression", + "group": "Leaderboards", + "name": "LeaderboardPlayerRatingScopedPosition", + "sentence": "Player rating (scoped) position", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var r = ext && ext._playerRatingScopedResult;", + " var pos = (r && r.player && r.player.position != null) ? r.player.position : 0;", + " eventsFunctionContext.returnValue = typeof pos === 'number' ? pos : Number(pos) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Open overlay with games collection. Leave tag and id empty for all games (newest). Use tag (e.g. HALLOWEEN_GAMES) or id for custom collection. Docs: https://docs.gamepush.com/docs/games-collections/.", + "fullName": "Open games collection", + "functionType": "Action", + "group": "Games Collections", + "name": "GamesCollectionsOpen", + "sentence": "Open games collection (tag: _PARAM1_, id: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var idParam = eventsFunctionContext.getArgument(\"Id\");", + " var id = (idParam !== '' && idParam != null && !isNaN(Number(idParam))) ? Number(idParam) : 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.gamesCollections || !gp.gamesCollections.open) return;", + " if (id > 0) gp.gamesCollections.open({ id: id });", + " else if (tag) gp.gamesCollections.open({ tag: tag });", + " else gp.gamesCollections.open();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Collection tag (e.g. ALL, HALLOWEEN_GAMES). Empty = all games by newest.", "name": "Tag", "type": "string", "optional": true }, + { "description": "ID", "longDescription": "Collection ID from dashboard. 0 or empty = use tag or all.", "name": "Id", "type": "expression", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: games collection overlay opened. Resets after check.", + "fullName": "Games collection overlay opened", + "functionType": "Condition", + "group": "Games Collections", + "name": "GamesCollectionsOnOpen", + "sentence": "Games collection overlay opened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._gamesCollectionsOpenTriggered); if (ext && ext._gamesCollectionsOpenTriggered) ext._gamesCollectionsOpenTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: games collection overlay closed. Resets after check.", + "fullName": "Games collection overlay closed", + "functionType": "Condition", + "group": "Games Collections", + "name": "GamesCollectionsOnClose", + "sentence": "Games collection overlay closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._gamesCollectionsCloseTriggered); if (ext && ext._gamesCollectionsCloseTriggered) ext._gamesCollectionsCloseTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Fetch games collection data (async). Use tag or id. Check \"Games collection fetch completed\" or \"Games collection fetch error\" and use collection/game expressions.", + "fullName": "Fetch games collection", + "functionType": "Action", + "group": "Games Collections", + "name": "GamesCollectionsFetch", + "sentence": "Fetch games collection (tag: _PARAM1_, id: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var idParam = eventsFunctionContext.getArgument(\"Id\");", + " var id = (idParam !== '' && idParam != null && !isNaN(Number(idParam))) ? Number(idParam) : 0;", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.gamesCollections || !gp.gamesCollections.fetch) return;", + " ext._gamesCollectionsFetchTriggered = false;", + " ext._gamesCollectionsFetchSuccess = false;", + " ext._gamesCollectionsFetchError = '';", + " ext._gamesCollectionsFetchResult = null;", + " var opts = id > 0 ? { id: id } : (tag ? { tag: tag } : {});", + " gp.gamesCollections.fetch(opts).then(function(result) {", + " if (ext) { ext._gamesCollectionsFetchTriggered = true; ext._gamesCollectionsFetchSuccess = true; ext._gamesCollectionsFetchResult = result; }", + " }).catch(function(err) {", + " if (ext) { ext._gamesCollectionsFetchTriggered = true; ext._gamesCollectionsFetchSuccess = false; ext._gamesCollectionsFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Collection tag (e.g. ALL). Empty = all by newest.", "name": "Tag", "type": "string", "optional": true }, + { "description": "ID", "longDescription": "Collection ID. 0 or empty = use tag or all.", "name": "Id", "type": "expression", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: games collection fetch completed successfully. Resets after check.", + "fullName": "Games collection fetch completed", + "functionType": "Condition", + "group": "Games Collections", + "name": "GamesCollectionsFetchSuccess", + "sentence": "Games collection fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._gamesCollectionsFetchTriggered && ext._gamesCollectionsFetchSuccess); if (ext && ext._gamesCollectionsFetchTriggered) ext._gamesCollectionsFetchTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: games collection fetch failed. Resets after check.", + "fullName": "Games collection fetch error", + "functionType": "Condition", + "group": "Games Collections", + "name": "GamesCollectionsFetchError", + "sentence": "Games collection fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._gamesCollectionsFetchTriggered && !ext._gamesCollectionsFetchSuccess); if (ext && ext._gamesCollectionsFetchTriggered) ext._gamesCollectionsFetchTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Collection ID from last fetch. Use after \"Games collection fetch completed\".", + "fullName": "Games collection ID", + "functionType": "Expression", + "group": "Games Collections", + "name": "GamesCollectionsCollectionId", + "sentence": "Games collection ID", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && ext._gamesCollectionsFetchResult; var id = (r && r.id != null) ? r.id : 0; eventsFunctionContext.returnValue = typeof id === 'number' ? id : Number(id) || 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Collection tag from last fetch. Use after \"Games collection fetch completed\".", + "fullName": "Games collection tag", + "functionType": "StringExpression", + "group": "Games Collections", + "name": "GamesCollectionsCollectionTag", + "sentence": "Games collection tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && ext._gamesCollectionsFetchResult; eventsFunctionContext.returnValue = (r && r.tag != null) ? String(r.tag) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Collection name from last fetch. Use after \"Games collection fetch completed\".", + "fullName": "Games collection name", + "functionType": "StringExpression", + "group": "Games Collections", + "name": "GamesCollectionsCollectionName", + "sentence": "Games collection name", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && ext._gamesCollectionsFetchResult; eventsFunctionContext.returnValue = (r && r.name != null) ? String(r.name) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of games in last fetched collection. Use after \"Games collection fetch completed\".", + "fullName": "Games collection games count", + "functionType": "Expression", + "group": "Games Collections", + "name": "GamesCollectionsGamesCount", + "sentence": "Games collection games count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && ext._gamesCollectionsFetchResult; var list = (r && Array.isArray(r.games)) ? r.games : []; eventsFunctionContext.returnValue = list.length; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Game ID at index in last fetched collection (0-based). Use after \"Games collection fetch completed\".", + "fullName": "Games collection game ID at index", + "functionType": "Expression", + "group": "Games Collections", + "name": "GamesCollectionsGameIdAt", + "sentence": "Games collection game ID at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._gamesCollectionsFetchResult;", + " var list = (r && Array.isArray(r.games)) ? r.games : [];", + " var g = list[i];", + " var id = (g && g.id != null) ? g.id : 0;", + " eventsFunctionContext.returnValue = typeof id === 'number' ? id : Number(id) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in games list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Game name at index in last fetched collection (0-based). Use after \"Games collection fetch completed\".", + "fullName": "Games collection game name at index", + "functionType": "StringExpression", + "group": "Games Collections", + "name": "GamesCollectionsGameNameAt", + "sentence": "Games collection game name at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._gamesCollectionsFetchResult;", + " var list = (r && Array.isArray(r.games)) ? r.games : [];", + " var g = list[i];", + " eventsFunctionContext.returnValue = (g && g.name != null) ? String(g.name) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in games list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Game URL at index in last fetched collection (0-based). Use after \"Games collection fetch completed\".", + "fullName": "Games collection game URL at index", + "functionType": "StringExpression", + "group": "Games Collections", + "name": "GamesCollectionsGameUrlAt", + "sentence": "Games collection game URL at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._gamesCollectionsFetchResult;", + " var list = (r && Array.isArray(r.games)) ? r.games : [];", + " var g = list[i];", + " eventsFunctionContext.returnValue = (g && g.url != null) ? String(g.url) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in games list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Game icon URL (256x256) at index in last fetched collection (0-based). Use after \"Games collection fetch completed\".", + "fullName": "Games collection game icon at index", + "functionType": "StringExpression", + "group": "Games Collections", + "name": "GamesCollectionsGameIconAt", + "sentence": "Games collection game icon at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && ext._gamesCollectionsFetchResult;", + " var list = (r && Array.isArray(r.games)) ? r.games : [];", + " var g = list[i];", + " eventsFunctionContext.returnValue = (g && g.icon != null) ? String(g.icon) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in games list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Send feedback (error, complaint, suggestion, review). Check \"Feedback sent\" or \"Feedback send error\". Docs: https://docs.gamepush.com/docs/feedbacks/.", + "fullName": "Send feedback", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksSend", + "sentence": "Send feedback (type: _PARAM1_, text: _PARAM2_, files: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var typeVal = String(eventsFunctionContext.getArgument(\"Type\") || \"ERROR\").toUpperCase();", + " if (['ERROR','COMPLAINT','SUGGESTION','REVIEW'].indexOf(typeVal) < 0) typeVal = 'ERROR';", + " var text = String(eventsFunctionContext.getArgument(\"Text\") || \"\").trim();", + " var filesStr = String(eventsFunctionContext.getArgument(\"Files\") || \"\").trim();", + " var files = [];", + " if (filesStr) { var arr = filesStr.split(/[,\\s]+/); for (var i = 0; i < arr.length; i++) { var u = arr[i].trim(); if (u) files.push(u); } }", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.send) return;", + " ext._feedbacksSendTriggered = false;", + " ext._feedbacksSendSuccess = false;", + " ext._feedbacksSendError = '';", + " ext._feedbacksSendResult = null;", + " var opts = { type: typeVal, text: text };", + " if (files.length > 0) opts.files = files;", + " gp.feedbacks.send(opts).then(function(feedback) {", + " if (ext) { ext._feedbacksSendTriggered = true; ext._feedbacksSendSuccess = true; ext._feedbacksSendResult = feedback; }", + " }).catch(function(err) {", + " if (ext) { ext._feedbacksSendTriggered = true; ext._feedbacksSendSuccess = false; ext._feedbacksSendError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Type", "longDescription": "ERROR | COMPLAINT | SUGGESTION | REVIEW", "name": "Type", "type": "string" }, + { "description": "Text", "longDescription": "Feedback text.", "name": "Text", "type": "string" }, + { "description": "Files", "longDescription": "Comma-separated URLs of attached files (optional). Upload via Files module first.", "name": "Files", "type": "string", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: feedback sent successfully. Resets after check.", + "fullName": "Feedback sent", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnSendSuccess", + "sentence": "Feedback sent", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksSendTriggered && ext._feedbacksSendSuccess); if (ext && ext._feedbacksSendTriggered) ext._feedbacksSendTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: feedback send failed. Resets after check.", + "fullName": "Feedback send error", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnSendError", + "sentence": "Feedback send error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksSendTriggered && !ext._feedbacksSendSuccess); if (ext && ext._feedbacksSendTriggered) ext._feedbacksSendTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last sent feedback ID. Use after \"Feedback sent\".", + "fullName": "Last feedback ID", + "functionType": "Expression", + "group": "Feedbacks", + "name": "FeedbacksLastId", + "sentence": "Last feedback ID", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && ext._feedbacksSendResult; var id = (r && r.id != null) ? r.id : 0; eventsFunctionContext.returnValue = typeof id === 'number' ? id : Number(id) || 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Feedback send error code. Use after \"Feedback send error\".", + "fullName": "Feedback send error code", + "functionType": "StringExpression", + "group": "Feedbacks", + "name": "FeedbacksSendErrorCode", + "sentence": "Feedback send error code", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._feedbacksSendError) ? String(ext._feedbacksSendError) : ''; } catch (e) { eventsFunctionContext.returnValue = ''; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Open ready-made window with feedbacks list and \"Write to us\" button. Optional filters by type and status.", + "fullName": "Open feedbacks list", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksOpenList", + "sentence": "Open feedbacks list (type: _PARAM1_, status: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var typeVal = String(eventsFunctionContext.getArgument(\"Type\") || \"\").trim().toUpperCase();", + " var statusVal = String(eventsFunctionContext.getArgument(\"Status\") || \"\").trim().toUpperCase();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.open) return;", + " var ext = gdjs.GamePush;", + " if (ext) { ext._feedbacksOpenListTriggered = false; }", + " var opts = {};", + " if (['ERROR','COMPLAINT','SUGGESTION','REVIEW'].indexOf(typeVal) >= 0) opts.type = typeVal;", + " if (['NEW','IN_PROGRESS','RESOLVED','UNRESOLVED','REQUIRES_ACTION'].indexOf(statusVal) >= 0) opts.status = statusVal;", + " gp.feedbacks.open(Object.keys(opts).length ? opts : undefined);", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Type", "longDescription": "Filter by type: ERROR, COMPLAINT, SUGGESTION, REVIEW. Empty = all.", "name": "Type", "type": "string", "optional": true }, + { "description": "Status", "longDescription": "Filter by status: NEW, IN_PROGRESS, RESOLVED, UNRESOLVED. Empty = all.", "name": "Status", "type": "string", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: feedbacks list window opened. Resets after check.", + "fullName": "Feedbacks list opened", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnOpenListSuccess", + "sentence": "Feedbacks list opened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksOpenListTriggered && ext._feedbacksOpenListSuccess); if (ext && ext._feedbacksOpenListTriggered) ext._feedbacksOpenListTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: error opening feedbacks list. Resets after check.", + "fullName": "Feedbacks list open error", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnOpenListError", + "sentence": "Feedbacks list open error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksOpenListTriggered && !ext._feedbacksOpenListSuccess); if (ext && ext._feedbacksOpenListTriggered) ext._feedbacksOpenListTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Open ready-made window with specific feedback and its messages.", + "fullName": "Open specific feedback", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksOpenFeedback", + "sentence": "Open specific feedback (ID: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var feedbackId = String(eventsFunctionContext.getArgument(\"FeedbackId\") || \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.openFeedback || !feedbackId) return;", + " gp.feedbacks.openFeedback({ feedbackId: feedbackId });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Feedback ID", "longDescription": "Feedback ID (string).", "name": "FeedbackId", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Fetch feedbacks list (async) for custom UI. Check \"Feedbacks fetched\" or \"Feedbacks fetch error\".", + "fullName": "Fetch feedbacks", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksFetch", + "sentence": "Fetch feedbacks (limit: _PARAM1_, type: _PARAM2_, status: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var limitParam = eventsFunctionContext.getArgument(\"Limit\");", + " var limit = (limitParam !== '' && limitParam != null && !isNaN(Number(limitParam))) ? Math.max(1, Math.min(100, Number(limitParam))) : 20;", + " var typeVal = String(eventsFunctionContext.getArgument(\"Type\") || \"\").trim().toUpperCase();", + " var statusVal = String(eventsFunctionContext.getArgument(\"Status\") || \"\").trim().toUpperCase();", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.fetch) return;", + " ext._feedbacksFetchTriggered = false;", + " ext._feedbacksFetchSuccess = false;", + " ext._feedbacksFetchError = '';", + " ext._feedbacksFetchResult = null;", + " var opts = { limit: limit };", + " if (['ERROR','COMPLAINT','SUGGESTION','REVIEW'].indexOf(typeVal) >= 0) opts.type = typeVal;", + " if (['NEW','IN_PROGRESS','RESOLVED','UNRESOLVED','REQUIRES_ACTION'].indexOf(statusVal) >= 0) opts.status = statusVal;", + " gp.feedbacks.fetch(opts).then(function(result) {", + " if (ext) { ext._feedbacksFetchTriggered = true; ext._feedbacksFetchSuccess = true; ext._feedbacksFetchResult = result; }", + " }).catch(function(err) {", + " if (ext) { ext._feedbacksFetchTriggered = true; ext._feedbacksFetchSuccess = false; ext._feedbacksFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "defaultValue": "20", "description": "Limit", "longDescription": "Number of feedbacks (1-100).", "name": "Limit", "type": "expression" }, + { "description": "Type", "longDescription": "Filter by type. Empty = all.", "name": "Type", "type": "string", "optional": true }, + { "description": "Status", "longDescription": "Filter by status. Empty = all.", "name": "Status", "type": "string", "optional": true } + ], + "objectGroups": [] + }, + { + "description": "Trigger: feedbacks fetched successfully. Resets after check.", + "fullName": "Feedbacks fetched", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnFetchSuccess", + "sentence": "Feedbacks fetched", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksFetchTriggered && ext._feedbacksFetchSuccess); if (ext && ext._feedbacksFetchTriggered) ext._feedbacksFetchTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: feedbacks fetch failed. Resets after check.", + "fullName": "Feedbacks fetch error", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnFetchError", + "sentence": "Feedbacks fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksFetchTriggered && !ext._feedbacksFetchSuccess); if (ext && ext._feedbacksFetchTriggered) ext._feedbacksFetchTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Load next batch of feedbacks (pagination). Use after fetch.", + "fullName": "Fetch more feedbacks", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksFetchMore", + "sentence": "Fetch more feedbacks (limit: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var limitParam = eventsFunctionContext.getArgument(\"Limit\");", + " var limit = (limitParam !== '' && limitParam != null && !isNaN(Number(limitParam))) ? Math.max(1, Math.min(100, Number(limitParam))) : 20;", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.fetchMore) return;", + " ext._feedbacksFetchMoreTriggered = false;", + " ext._feedbacksFetchMoreSuccess = false;", + " ext._feedbacksFetchMoreResult = null;", + " gp.feedbacks.fetchMore({ limit: limit }).then(function(result) {", + " if (ext) { ext._feedbacksFetchMoreTriggered = true; ext._feedbacksFetchMoreSuccess = true; ext._feedbacksFetchMoreResult = result; }", + " }).catch(function(err) {", + " if (ext) { ext._feedbacksFetchMoreTriggered = true; ext._feedbacksFetchMoreSuccess = false; }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "defaultValue": "20", "description": "Limit", "longDescription": "Number of feedbacks (1-100).", "name": "Limit", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: more feedbacks fetched successfully. Resets after check.", + "fullName": "More feedbacks fetched", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnFetchMoreSuccess", + "sentence": "More feedbacks fetched", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksFetchMoreTriggered && ext._feedbacksFetchMoreSuccess); if (ext && ext._feedbacksFetchMoreTriggered) ext._feedbacksFetchMoreTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of feedbacks in last fetch. Use after \"Feedbacks fetched\" or \"More feedbacks fetched\".", + "fullName": "Feedbacks count", + "functionType": "Expression", + "group": "Feedbacks", + "name": "FeedbacksCount", + "sentence": "Feedbacks count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult); var list = (r && Array.isArray(r.items)) ? r.items : []; eventsFunctionContext.returnValue = list.length; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if more feedbacks can be loaded. Use after fetch.", + "fullName": "Can load more feedbacks", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksCanLoadMore", + "sentence": "Can load more feedbacks", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult); eventsFunctionContext.returnValue = !!(r && r.canLoadMore); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Feedback ID at index (0-based). Use after \"Feedbacks fetched\".", + "fullName": "Feedback ID at index", + "functionType": "Expression", + "group": "Feedbacks", + "name": "FeedbacksIdAt", + "sentence": "Feedback ID at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult);", + " var list = (r && Array.isArray(r.items)) ? r.items : [];", + " var f = list[i];", + " var id = (f && f.id != null) ? f.id : 0;", + " eventsFunctionContext.returnValue = typeof id === 'number' ? id : Number(id) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in feedbacks list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Feedback type at index (ERROR, COMPLAINT, SUGGESTION, REVIEW). Use after \"Feedbacks fetched\".", + "fullName": "Feedback type at index", + "functionType": "StringExpression", + "group": "Feedbacks", + "name": "FeedbacksTypeAt", + "sentence": "Feedback type at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult);", + " var list = (r && Array.isArray(r.items)) ? r.items : [];", + " var f = list[i];", + " eventsFunctionContext.returnValue = (f && f.type != null) ? String(f.type) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in feedbacks list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Feedback text at index. Use after \"Feedbacks fetched\".", + "fullName": "Feedback text at index", + "functionType": "StringExpression", + "group": "Feedbacks", + "name": "FeedbacksTextAt", + "sentence": "Feedback text at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult);", + " var list = (r && Array.isArray(r.items)) ? r.items : [];", + " var f = list[i];", + " eventsFunctionContext.returnValue = (f && f.text != null) ? String(f.text) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in feedbacks list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Feedback status at index (NEW, IN_PROGRESS, RESOLVED, UNRESOLVED). Use after \"Feedbacks fetched\".", + "fullName": "Feedback status at index", + "functionType": "StringExpression", + "group": "Feedbacks", + "name": "FeedbacksStatusAt", + "sentence": "Feedback status at index (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = eventsFunctionContext.getArgument(\"Index\");", + " var i = (typeof idx === 'number') ? idx : (Number(idx) || 0);", + " var ext = gdjs.GamePush;", + " var r = ext && (ext._feedbacksFetchResult || ext._feedbacksFetchMoreResult);", + " var list = (r && Array.isArray(r.items)) ? r.items : [];", + " var f = list[i];", + " eventsFunctionContext.returnValue = (f && f.status != null) ? String(f.status) : '';", + "} catch (e) { eventsFunctionContext.returnValue = ''; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index in feedbacks list.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Send message to feedback chat. Check \"Message sent\" or \"Message send error\".", + "fullName": "Send message to feedback", + "functionType": "Action", + "group": "Feedbacks", + "name": "FeedbacksSendMessage", + "sentence": "Send message to feedback (feedback ID: _PARAM1_, text: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var feedbackId = String(eventsFunctionContext.getArgument(\"FeedbackId\") || \"\").trim();", + " var text = String(eventsFunctionContext.getArgument(\"Text\") || \"\").trim();", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.feedbacks || !gp.feedbacks.sendMessage || !feedbackId || !text) return;", + " ext._feedbacksSendMessageTriggered = false;", + " ext._feedbacksSendMessageSuccess = false;", + " ext._feedbacksSendMessageError = '';", + " gp.feedbacks.sendMessage({ feedbackId: feedbackId, text: text, files: [] }).then(function(msg) {", + " if (ext) { ext._feedbacksSendMessageTriggered = true; ext._feedbacksSendMessageSuccess = true; }", + " }).catch(function(err) {", + " if (ext) { ext._feedbacksSendMessageTriggered = true; ext._feedbacksSendMessageSuccess = false; ext._feedbacksSendMessageError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Feedback ID", "longDescription": "Feedback ID (string).", "name": "FeedbackId", "type": "string" }, + { "description": "Text", "longDescription": "Message text.", "name": "Text", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: message sent to feedback successfully. Resets after check.", + "fullName": "Message sent to feedback", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnSendMessageSuccess", + "sentence": "Message sent to feedback", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksSendMessageTriggered && ext._feedbacksSendMessageSuccess); if (ext && ext._feedbacksSendMessageTriggered) ext._feedbacksSendMessageTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: message send to feedback failed. Resets after check.", + "fullName": "Message send to feedback error", + "functionType": "Condition", + "group": "Feedbacks", + "name": "FeedbacksOnSendMessageError", + "sentence": "Message send to feedback error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._feedbacksSendMessageTriggered && !ext._feedbacksSendMessageSuccess); if (ext && ext._feedbacksSendMessageTriggered) ext._feedbacksSendMessageTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show confirmation overlay (Modal). User can confirm or cancel. Check \"Confirm overlay closed\" then \"Last confirm result\". Docs: https://docs.gamepush.com/docs/overlay/.", + "fullName": "Show confirm overlay", + "functionType": "Action", + "group": "Overlay", + "name": "OverlayShowConfirm", + "sentence": "Show confirm overlay", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.windows && gp.windows.showConfirm) gp.windows.showConfirm();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show confirmation overlay with custom title, description and buttons. Check \"Confirm overlay closed\" then \"Last confirm result\".", + "fullName": "Show confirm overlay (custom)", + "functionType": "Action", + "group": "Overlay", + "name": "OverlayShowConfirmCustom", + "sentence": "Show confirm overlay (title: _PARAM1_, description: _PARAM2_, confirm: _PARAM3_, cancel: _PARAM4_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var title = String(eventsFunctionContext.getArgument(\"Title\") || \"\");", + " var description = String(eventsFunctionContext.getArgument(\"Description\") || \"\");", + " var textConfirm = String(eventsFunctionContext.getArgument(\"TextConfirm\") || \"Confirm\");", + " var textCancel = String(eventsFunctionContext.getArgument(\"TextCancel\") || \"Cancel\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.windows || !gp.windows.showConfirm) return;", + " var ext = gdjs.GamePush;", + " if (ext) { ext._confirmCloseTriggered = false; }", + " gp.windows.showConfirm({ title: title, description: description, textConfirm: textConfirm, textCancel: textCancel });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Title", "longDescription": "Window title.", "name": "Title", "type": "string" }, + { "description": "Description", "longDescription": "Window description (multiline supported).", "name": "Description", "type": "string" }, + { "description": "Confirm button", "longDescription": "Text for confirm button.", "name": "TextConfirm", "type": "string" }, + { "description": "Cancel button", "longDescription": "Text for cancel button.", "name": "TextCancel", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Trigger: confirm overlay was closed. Resets after check. Then use \"Last confirm result\" to know if user confirmed.", + "fullName": "Confirm overlay closed", + "functionType": "Condition", + "group": "Overlay", + "name": "OverlayConfirmClosed", + "sentence": "Confirm overlay closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._confirmCloseTriggered); if (ext && ext._confirmCloseTriggered) ext._confirmCloseTriggered = false; } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if user clicked Confirm in last confirm overlay. Use after \"Confirm overlay closed\".", + "fullName": "Last confirm result", + "functionType": "Condition", + "group": "Overlay", + "name": "OverlayLastConfirmResult", + "sentence": "Last confirm result", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._confirmCloseResult); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if preloader ad is available on the current platform. Check before \"Show preloader ad\".", + "fullName": "Preloader ad available", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsPreloaderAvailable", + "sentence": "Preloader ad available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isPreloaderAvailable);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if sticky banner is available on the current platform.", + "fullName": "Sticky banner available", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsStickyAvailable", + "sentence": "Sticky banner available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isStickyAvailable);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if fullscreen ad is available on the current platform.", + "fullName": "Fullscreen ad available", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsFullscreenAvailable", + "sentence": "Fullscreen ad available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isFullscreenAvailable);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if rewarded video ad is available on the current platform.", + "fullName": "Rewarded ad available", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsRewardedAvailable", + "sentence": "Rewarded ad available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isRewardedAvailable);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if sticky banner is currently playing.", + "fullName": "Sticky ad is playing", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsStickyPlaying", + "sentence": "Sticky ad is playing", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isStickyPlaying);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if fullscreen ad is currently playing.", + "fullName": "Fullscreen ad is playing", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsFullscreenPlaying", + "sentence": "Fullscreen ad is playing", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isFullscreenPlaying);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if rewarded video ad is currently playing.", + "fullName": "Rewarded ad is playing", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsRewardedPlaying", + "sentence": "Rewarded ad is playing", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isRewardedPlaying);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if preloader ad is currently playing.", + "fullName": "Preloader ad is playing", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsPreloaderPlaying", + "sentence": "Preloader ad is playing", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isPreloaderPlaying);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if AdBlock is enabled (blocks ads).", + "fullName": "AdBlock is enabled", + "functionType": "Condition", + "group": "Ads", + "name": "AdsIsAdblockEnabled", + "sentence": "AdBlock is enabled", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.ads && gp.ads.isAdblockEnabled);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show preloader ad (usually at game load). Call after \"GamePush is ready\".", + "fullName": "Show preloader ad", + "functionType": "Action", + "group": "Ads", + "name": "AdsShowPreloader", + "sentence": "Show preloader ad", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.ads && gp.ads.showPreloader) gp.ads.showPreloader();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show sticky banner (at bottom of screen).", + "fullName": "Show sticky banner", + "functionType": "Action", + "group": "Ads", + "name": "AdsShowSticky", + "sentence": "Show sticky banner", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.ads && gp.ads.showSticky) gp.ads.showSticky();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Close sticky banner.", + "fullName": "Close sticky banner", + "functionType": "Action", + "group": "Ads", + "name": "AdsCloseSticky", + "sentence": "Close sticky banner", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.ads && gp.ads.closeSticky) gp.ads.closeSticky();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show fullscreen ad (e.g. between levels).", + "fullName": "Show fullscreen ad", + "functionType": "Action", + "group": "Ads", + "name": "AdsShowFullscreen", + "sentence": "Show fullscreen ad", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " if (gdjs.GamePush) gdjs.GamePush._fullscreenEnded = false;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.ads && gp.ads.showFullscreen) {", + " gp.ads.showFullscreen().finally(function() { try { if (gdjs.GamePush) gdjs.GamePush._fullscreenEnded = true; } catch (err) {} });", + " } else { if (gdjs.GamePush) gdjs.GamePush._fullscreenEnded = true; }", + "} catch (e) { if (gdjs.GamePush) gdjs.GamePush._fullscreenEnded = true; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if fullscreen ad has closed. Resets after check.", + "fullName": "Fullscreen ad closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsFullscreenEnded", + "sentence": "Fullscreen ad closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = ext && ext._fullscreenEnded;", + " if (ext) ext._fullscreenEnded = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Show rewarded video ad. Use a tag (e.g. money, lives) to check which reward to give in \"Player received reward (tag)\" condition.", + "fullName": "Show rewarded ad", + "functionType": "Action", + "group": "Ads", + "name": "AdsShowRewarded", + "sentence": "Show rewarded ad (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._rewardedEnded = false; ext._rewardedSuccess = false; ext._rewardedTag = tag; }", + " var gp = ext && ext.gp();", + " if (gp && gp.ads && gp.ads.showRewardedVideo) {", + " gp.ads.showRewardedVideo().then(function(success) { try { if (gdjs.GamePush) gdjs.GamePush._rewardedSuccess = !!success; } catch (err) {} }).finally(function() { try { if (gdjs.GamePush) gdjs.GamePush._rewardedEnded = true; } catch (err) {} });", + " } else { if (ext) ext._rewardedEnded = true; }", + "} catch (e) { if (gdjs.GamePush) gdjs.GamePush._rewardedEnded = true; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Reward tag", + "longDescription": "E.g. money, lives, hint. Use the same tag in \"Player received reward (tag)\" condition.", + "name": "Tag", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if rewarded ad has closed. Resets after check.", + "fullName": "Rewarded ad closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedEnded", + "sentence": "Rewarded ad closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = ext && ext._rewardedEnded;", + " if (ext) ext._rewardedEnded = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player watched the rewarded ad and received the reward. Resets after check — use as trigger (fires once).", + "fullName": "Player received reward", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedSuccess", + "sentence": "Player received reward from ad", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._rewardedSuccess);", + " if (ext && ext._rewardedSuccess) { ext._rewardedSuccess = false; ext._rewardedTag = \"\"; }", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player received reward with the given tag (e.g. money). Resets after check — use as trigger (fires once).", + "fullName": "Player received reward (tag)", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedSuccessWithTag", + "sentence": "Player received reward from ad (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._rewardedSuccess && ext._rewardedTag === tag);", + " if (ext && ext._rewardedSuccess && ext._rewardedTag === tag) { ext._rewardedSuccess = false; ext._rewardedTag = \"\"; }", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Tag", + "longDescription": "Tag used when showing the ad (e.g. money).", + "name": "Tag", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Trigger: any ad started showing. Resets after check.", + "fullName": "Ad started", + "functionType": "Condition", + "group": "Ads", + "name": "AdsStartTriggered", + "sentence": "Ad started (any)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._adsStartTriggered);", + " if (ext && ext._adsStartTriggered) ext._adsStartTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: any ad closed. Resets after check. Use \"Ad closed successfully\" for result.", + "fullName": "Ad closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsCloseTriggered", + "sentence": "Ad closed (any)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._adsCloseTriggered);", + " if (ext && ext._adsCloseTriggered) ext._adsCloseTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if the last \"Ad closed (any)\" trigger was successful (user watched). Check right after \"Ad closed (any)\".", + "fullName": "Ad closed successfully", + "functionType": "Condition", + "group": "Ads", + "name": "AdsCloseSuccess", + "sentence": "Last ad closed successfully", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._adsCloseSuccess);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: fullscreen ad started. Resets after check.", + "fullName": "Fullscreen ad started", + "functionType": "Condition", + "group": "Ads", + "name": "AdsFullscreenStartTriggered", + "sentence": "Fullscreen ad started", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._fullscreenStartTriggered);", + " if (ext && ext._fullscreenStartTriggered) ext._fullscreenStartTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: fullscreen ad closed. Resets after check. Use \"Fullscreen ad closed successfully\" for result.", + "fullName": "Fullscreen ad closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsFullscreenCloseTriggered", + "sentence": "Fullscreen ad closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._fullscreenCloseTriggered);", + " if (ext && ext._fullscreenCloseTriggered) ext._fullscreenCloseTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if the last \"Fullscreen ad closed\" was successful. Check right after \"Fullscreen ad closed\".", + "fullName": "Fullscreen ad closed successfully", + "functionType": "Condition", + "group": "Ads", + "name": "AdsFullscreenCloseSuccess", + "sentence": "Last fullscreen ad closed successfully", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._fullscreenCloseSuccess);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: preloader ad started. Resets after check.", + "fullName": "Preloader ad started", + "functionType": "Condition", + "group": "Ads", + "name": "AdsPreloaderStartTriggered", + "sentence": "Preloader ad started", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._preloaderStartTriggered);", + " if (ext && ext._preloaderStartTriggered) ext._preloaderStartTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: preloader ad closed. Resets after check. Use \"Preloader ad closed successfully\" for result.", + "fullName": "Preloader ad closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsPreloaderCloseTriggered", + "sentence": "Preloader ad closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._preloaderCloseTriggered);", + " if (ext && ext._preloaderCloseTriggered) ext._preloaderCloseTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if the last \"Preloader ad closed\" was successful. Check right after \"Preloader ad closed\".", + "fullName": "Preloader ad closed successfully", + "functionType": "Condition", + "group": "Ads", + "name": "AdsPreloaderCloseSuccess", + "sentence": "Last preloader ad closed successfully", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._preloaderCloseSuccess);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: rewarded video ad started. Resets after check.", + "fullName": "Rewarded ad started", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedStartTriggered", + "sentence": "Rewarded ad started", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._rewardedStartTriggered);", + " if (ext && ext._rewardedStartTriggered) ext._rewardedStartTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: rewarded video ad closed (event). Resets after check. Use \"Player received reward from ad\" for reward. Use \"Last rewarded ad closed successfully\" for success.", + "fullName": "Rewarded ad closed (event)", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedCloseTriggered", + "sentence": "Rewarded ad closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._rewardedCloseTriggered);", + " if (ext && ext._rewardedCloseTriggered) ext._rewardedCloseTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if the last \"Rewarded ad closed\" event was successful. Check right after \"Rewarded ad closed\".", + "fullName": "Rewarded ad closed successfully", + "functionType": "Condition", + "group": "Ads", + "name": "AdsRewardedCloseSuccess", + "sentence": "Last rewarded ad closed successfully", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._rewardedCloseSuccess);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: sticky banner opened. Resets after check.", + "fullName": "Sticky banner started", + "functionType": "Condition", + "group": "Ads", + "name": "AdsStickyStartTriggered", + "sentence": "Sticky banner started", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._stickyStartTriggered);", + " if (ext && ext._stickyStartTriggered) ext._stickyStartTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: sticky banner rendered on screen. Resets after check.", + "fullName": "Sticky banner rendered", + "functionType": "Condition", + "group": "Ads", + "name": "AdsStickyRenderTriggered", + "sentence": "Sticky banner rendered", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._stickyRenderTriggered);", + " if (ext && ext._stickyRenderTriggered) ext._stickyRenderTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: sticky banner refreshed. Resets after check.", + "fullName": "Sticky banner refreshed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsStickyRefreshTriggered", + "sentence": "Sticky banner refreshed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._stickyRefreshTriggered);", + " if (ext && ext._stickyRefreshTriggered) ext._stickyRefreshTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: sticky banner closed. Resets after check.", + "fullName": "Sticky banner closed", + "functionType": "Condition", + "group": "Ads", + "name": "AdsStickyCloseTriggered", + "sentence": "Sticky banner closed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._stickyCloseTriggered);", + " if (ext && ext._stickyCloseTriggered) ext._stickyCloseTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Sync player data with server (e.g. before submitting to leaderboard).", + "fullName": "Sync player", + "functionType": "Action", + "group": "Player", + "name": "PlayerSync", + "sentence": "Sync player", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (gp && gp.player && gp.player.sync) gp.player.sync();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player ID (gp.player.id).", + "fullName": "Player ID", + "functionType": "StringExpression", + "group": "Player", + "name": "PlayerId", + "sentence": "Player ID", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.player && gp.player.id != null) ? String(gp.player.id) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player name (gp.player.name).", + "fullName": "Player name", + "functionType": "StringExpression", + "group": "Player", + "name": "PlayerName", + "sentence": "Player name", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.player && gp.player.name != null) ? String(gp.player.name) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player score (gp.player.score).", + "fullName": "Player score", + "functionType": "Expression", + "group": "Player", + "name": "PlayerScore", + "sentence": "Player score", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var v = (gp && gp.player && gp.player.score != null) ? gp.player.score : 0; eventsFunctionContext.returnValue = typeof v === 'number' ? v : Number(v) || 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player avatar URL (gp.player.avatar).", + "fullName": "Player avatar", + "functionType": "StringExpression", + "group": "Player", + "name": "PlayerAvatar", + "sentence": "Player avatar", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.player && gp.player.avatar != null) ? String(gp.player.avatar) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "URL of GamePush generated avatar for the given player ID and size (e.g. 64). Use GenerateAvatar(id, size) to get a fallback avatar when the player has no custom avatar.", + "fullName": "Generated avatar URL", + "functionType": "StringExpression", + "group": "Player", + "name": "GeneratedAvatarUrl", + "sentence": "Generated avatar URL (_PARAM1_, _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var id = String(eventsFunctionContext.getArgument(\"Id\") ?? \"\");", + " var size = eventsFunctionContext.getArgument(\"Size\");", + " var sizeNum = (typeof size === 'number') ? size : (Number(size) || 64);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !id) { eventsFunctionContext.returnValue = \"\"; return; }", + " if (typeof gp.GenerateAvatar === 'function') { eventsFunctionContext.returnValue = String(gp.GenerateAvatar(id, sizeNum)); return; }", + " if (typeof gp.generateAvatar === 'function') { eventsFunctionContext.returnValue = String(gp.generateAvatar(id, sizeNum)); return; }", + " eventsFunctionContext.returnValue = \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { + "description": "Player ID", + "longDescription": "Player ID (e.g. from Player ID expression).", + "name": "Id", + "type": "string" + }, + { + "defaultValue": "64", + "description": "Size", + "longDescription": "Avatar size in pixels (e.g. 64, 128).", + "name": "Size", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Load an image from URL into a GDevelop image resource (e.g. for avatar sprite). Uses crossOrigin so external URLs work if the server allows CORS. Load is asynchronous; the sprite updates when the image has loaded.", + "fullName": "Load image from URL into resource", + "functionType": "Action", + "group": "Player", + "name": "LoadImageFromUrlIntoResource", + "sentence": "Load image from URL into resource (_PARAM1_, URL: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var resourceName = String(eventsFunctionContext.getArgument(\"Resource\") ?? \"\");", + " var url = String(eventsFunctionContext.getArgument(\"Url\") ?? \"\");", + " if (!resourceName || !url || typeof runtimeScene === 'undefined') return;", + " var img = new Image();", + " img.crossOrigin = 'anonymous';", + " img.onload = function() {", + " try {", + " var game = runtimeScene.getGame && runtimeScene.getGame();", + " if (!game || !game.getImageManager) return;", + " var imageManager = game.getImageManager();", + " if (!imageManager || typeof imageManager.getPIXITexture !== 'function') return;", + " var texture = imageManager.getPIXITexture(resourceName);", + " if (!texture) return;", + " var PIXI = typeof globalThis !== 'undefined' && globalThis.PIXI ? globalThis.PIXI : (typeof window !== 'undefined' && window.PIXI) ? window.PIXI : undefined;", + " if (!PIXI || !PIXI.BaseTexture) return;", + " var newBase = PIXI.BaseTexture.from(img);", + " if (newBase) texture.baseTexture = newBase;", + " } catch (e) {}", + " };", + " img.onerror = function() {};", + " img.src = url;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Image resource", + "longDescription": "The image resource to replace (e.g. the image used by your avatar sprite).", + "name": "Resource", + "type": "imageResource" + }, + { + "description": "URL", + "longDescription": "Image URL (e.g. from Generated avatar URL or Player avatar expression).", + "name": "Url", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Load an image from URL into the selected Sprite object (e.g. avatar sprite). Uses crossOrigin so external URLs work if the server allows CORS. Load is asynchronous; the sprite updates when the image has loaded.", + "fullName": "Load image from URL into sprite", + "functionType": "Action", + "group": "Player", + "name": "LoadImageFromUrlIntoSprite", + "sentence": "Load image from URL into sprite (_PARAM1_, URL: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var objects = eventsFunctionContext.getObjects(\"Sprite\");", + " var url = String(eventsFunctionContext.getArgument(\"Url\") ?? \"\");", + " if (!objects.length || !url) return;", + " var img = new Image();", + " img.crossOrigin = 'anonymous';", + " img.onload = function() {", + " try {", + " var PIXI = typeof globalThis !== 'undefined' && globalThis.PIXI ? globalThis.PIXI : (typeof window !== 'undefined' && window.PIXI) ? window.PIXI : undefined;", + " if (!PIXI || !PIXI.BaseTexture || !PIXI.Texture) return;", + " var newBase = PIXI.BaseTexture.from(img);", + " if (!newBase) return;", + " var newTexture = new PIXI.Texture(newBase);", + " for (var i = 0; i < objects.length; i++) {", + " var obj = objects[i];", + " if (!obj || typeof obj.getRendererObject !== 'function') continue;", + " var renderer = obj.getRendererObject();", + " if (!renderer) continue;", + " var pixiSprite = renderer._sprite !== undefined ? renderer._sprite : (renderer.texture ? renderer : (renderer.children && renderer.children[0] ? renderer.children[0] : null));", + " if (pixiSprite && pixiSprite.texture !== undefined) pixiSprite.texture = newTexture;", + " }", + " } catch (e) {}", + " };", + " img.onerror = function() {};", + " img.src = url;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Sprite", + "longDescription": "The Sprite object to replace with the image from URL (e.g. avatar sprite).", + "name": "Sprite", + "type": "object", + "supplementaryInformation": "Sprite" + }, + { + "description": "URL", + "longDescription": "Image URL (e.g. from Generated avatar URL or Player avatar expression).", + "name": "Url", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if player is stub (empty or default data). Use to see if real player data is loaded.", + "fullName": "Player is stub", + "functionType": "Condition", + "group": "Player", + "name": "PlayerIsStub", + "sentence": "Player is stub (empty)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.player && gp.player.isStub === true); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if player is logged in.", + "fullName": "Player is logged in", + "functionType": "Condition", + "group": "Player", + "name": "PlayerIsLoggedIn", + "sentence": "Player is logged in", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.player && gp.player.isLoggedIn === true); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when player login completed successfully. Use after \"Player login\" action.", + "fullName": "Player login succeeded", + "functionType": "Condition", + "group": "Player", + "name": "PlayerLoginSucceeded", + "sentence": "Player login succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._loginTriggered || !ext._loginSuccess) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._loginTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when player login failed or was cancelled. Use after \"Player login\" action.", + "fullName": "Player login failed", + "functionType": "Condition", + "group": "Player", + "name": "PlayerLoginFailed", + "sentence": "Player login failed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._loginTriggered || ext._loginSuccess) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._loginTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when player logout completed successfully. Use after \"Player logout\" action.", + "fullName": "Player logout succeeded", + "functionType": "Condition", + "group": "Player", + "name": "PlayerLogoutSucceeded", + "sentence": "Player logout succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._logoutTriggered || !ext._logoutSuccess) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._logoutTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when player logout failed or was cancelled. Use after \"Player logout\" action.", + "fullName": "Player logout failed", + "functionType": "Condition", + "group": "Player", + "name": "PlayerLogoutFailed", + "sentence": "Player logout failed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._logoutTriggered || ext._logoutSuccess) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._logoutTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Set player name. Call \"Sync player\" after changes.", + "fullName": "Set player name", + "functionType": "Action", + "group": "Player", + "name": "PlayerSetName", + "sentence": "Set player name (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var value = String(eventsFunctionContext.getArgument(\"Value\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) return;", + " if (typeof gp.player.set === 'function') gp.player.set('name', value);", + " else gp.player.name = value;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name", + "longDescription": "Player display name.", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Set player score. Call \"Sync player\" after changes.", + "fullName": "Set player score", + "functionType": "Action", + "group": "Player", + "name": "PlayerSetScore", + "sentence": "Set player score (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var value = eventsFunctionContext.getArgument(\"Value\");", + " var num = (typeof value === 'number') ? value : Number(value) || 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) return;", + " if (typeof gp.player.set === 'function') gp.player.set('score', num);", + " else gp.player.score = num;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "defaultValue": "0", + "description": "Score", + "longDescription": "Numeric score.", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Add a number to player score. Call \"Sync player\" after changes.", + "fullName": "Add to player score", + "functionType": "Action", + "group": "Player", + "name": "PlayerAddScore", + "sentence": "Add to player score (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var value = eventsFunctionContext.getArgument(\"Value\");", + " var num = (typeof value === 'number') ? value : Number(value) || 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) return;", + " if (typeof gp.player.add === 'function') gp.player.add('score', num);", + " else gp.player.score = (Number(gp.player.score) || 0) + num;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "defaultValue": "0", + "description": "Value to add", + "longDescription": "Number to add to current score (can be negative).", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Set player avatar URL. Call \"Sync player\" after changes.", + "fullName": "Set player avatar", + "functionType": "Action", + "group": "Player", + "name": "PlayerSetAvatar", + "sentence": "Set player avatar (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var value = String(eventsFunctionContext.getArgument(\"Value\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) return;", + " if (typeof gp.player.set === 'function') gp.player.set('avatar', value);", + " else gp.player.avatar = value;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Avatar URL", + "longDescription": "URL of avatar image.", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if player name equals the given value.", + "fullName": "Player name equals", + "functionType": "Condition", + "group": "Player", + "name": "PlayerNameEquals", + "sentence": "Player name equals _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var compare = String(eventsFunctionContext.getArgument(\"Value\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) { eventsFunctionContext.returnValue = false; return; }", + " var name = (gp.player.name != null) ? String(gp.player.name) : \"\";", + " eventsFunctionContext.returnValue = name === compare;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Name", + "longDescription": "Value to compare with player name.", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if player score equals the given value.", + "fullName": "Player score equals", + "functionType": "Condition", + "group": "Player", + "name": "PlayerScoreEquals", + "sentence": "Player score equals _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var compare = eventsFunctionContext.getArgument(\"Value\");", + " var compareNum = (typeof compare === 'number') ? compare : Number(compare) || 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) { eventsFunctionContext.returnValue = false; return; }", + " var score = (gp.player.score != null) ? (typeof gp.player.score === 'number' ? gp.player.score : Number(gp.player.score) || 0) : 0;", + " eventsFunctionContext.returnValue = score === compareNum;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "defaultValue": "0", + "description": "Score", + "longDescription": "Value to compare with player score.", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Check if player avatar URL equals the given value.", + "fullName": "Player avatar equals", + "functionType": "Condition", + "group": "Player", + "name": "PlayerAvatarEquals", + "sentence": "Player avatar equals _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var compare = String(eventsFunctionContext.getArgument(\"Value\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player) { eventsFunctionContext.returnValue = false; return; }", + " var avatar = (gp.player.avatar != null) ? String(gp.player.avatar) : \"\";", + " eventsFunctionContext.returnValue = avatar === compare;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Avatar URL", + "longDescription": "Value to compare with player avatar.", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Show login overlay (platform login or secret code).", + "fullName": "Player login", + "functionType": "Action", + "group": "Player", + "name": "PlayerLogin", + "sentence": "Player login", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.player && typeof gp.player.login === 'function') gp.player.login(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Logout player (if platform supports it).", + "fullName": "Player logout", + "functionType": "Action", + "group": "Player", + "name": "PlayerLogout", + "sentence": "Player logout", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.player && typeof gp.player.logout === 'function') gp.player.logout(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Write a number to a player variable (field). Fields are set in GamePush dashboard (e.g. score, gold, level). Call \"Sync player\" after changes.", + "fullName": "Set player number (Player.Set)", + "functionType": "Action", + "group": "Player", + "name": "PlayerSet", + "sentence": "Set player number (field: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var value = eventsFunctionContext.getArgument(\"Value\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) return;", + " if (typeof gp.player.set === 'function') gp.player.set(field, value);", + " else if (gp.player.state && typeof gp.player.state === 'object') gp.player.state[field] = value;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. score, gold, level).", + "name": "Field", + "type": "string" + }, + { + "defaultValue": "0", + "description": "Value", + "longDescription": "Number or string.", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Add a number to a player variable (field). Fields are set in GamePush dashboard (e.g. score, gold, level). Call \"Sync player\" after changes.", + "fullName": "Add to player number (Player.Add)", + "functionType": "Action", + "group": "Player", + "name": "PlayerAdd", + "sentence": "Add to player number (field: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var value = eventsFunctionContext.getArgument(\"Value\");", + " var num = (typeof value === 'number') ? value : Number(value) || 0;", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) return;", + " if (typeof gp.player.add === 'function') gp.player.add(field, num);", + " else if (gp.player.state && typeof gp.player.state === 'object') { var cur = gp.player.state[field]; gp.player.state[field] = (Number(cur) || 0) + num; }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. score, gold, level).", + "name": "Field", + "type": "string" + }, + { + "defaultValue": "0", + "description": "Value to add", + "longDescription": "Number to add (can be negative).", + "name": "Value", + "type": "expression" + } + ], + "objectGroups": [] + }, + { + "description": "Write a string to a player variable (e.g. name, nickname). Call \"Sync player\" after changes.", + "fullName": "Set player string (Player.Set)", + "functionType": "Action", + "group": "Player", + "name": "PlayerSetString", + "sentence": "Set player string (field: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var value = String(eventsFunctionContext.getArgument(\"Value\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) return;", + " if (typeof gp.player.set === 'function') gp.player.set(field, value);", + " else if (gp.player.state && typeof gp.player.state === 'object') gp.player.state[field] = value;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. name, nickname).", + "name": "Field", + "type": "string" + }, + { + "description": "Value", + "longDescription": "String value.", + "name": "Value", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Write a boolean (yes/no) to a player variable. Call \"Sync player\" after changes.", + "fullName": "Set player boolean (Player.Set)", + "functionType": "Action", + "group": "Player", + "name": "PlayerSetBoolean", + "sentence": "Set player boolean (field: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var value = !!eventsFunctionContext.getArgument(\"Value\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) return;", + " if (typeof gp.player.set === 'function') gp.player.set(field, value);", + " else if (gp.player.state && typeof gp.player.state === 'object') gp.player.state[field] = value;", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. soundEnabled, premium).", + "name": "Field", + "type": "string" + }, + { + "defaultValue": "true", + "description": "Value", + "longDescription": "Yes (true) or No (false).", + "name": "Value", + "supplementaryInformation": "trueorfalse", + "type": "trueorfalse" + } + ], + "objectGroups": [] + }, + { + "description": "Read a player variable (field) value. Fields are set in GamePush dashboard (e.g. score, gold, level).", + "fullName": "Player variable (Player.Get)", + "functionType": "Expression", + "group": "Player", + "name": "PlayerGet", + "sentence": "Player variable (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) { eventsFunctionContext.returnValue = 0; return; }", + " var v;", + " if (typeof gp.player.get === 'function') v = gp.player.get(field);", + " else if (gp.player.state && typeof gp.player.state === 'object') v = gp.player.state[field];", + " else v = undefined;", + " eventsFunctionContext.returnValue = (v !== undefined && v !== null) ? (typeof v === 'number' ? v : Number(v)) : 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "number" + }, + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. score, gold, level).", + "name": "Field", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Read player variable as string (e.g. name).", + "fullName": "Player variable string (Player.Get)", + "functionType": "StringExpression", + "group": "Player", + "name": "PlayerString", + "sentence": "Player variable string (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) { eventsFunctionContext.returnValue = \"\"; return; }", + " var v;", + " if (typeof gp.player.get === 'function') v = gp.player.get(field);", + " else if (gp.player.state && typeof gp.player.state === 'object') v = gp.player.state[field];", + " else v = undefined;", + " eventsFunctionContext.returnValue = (v !== undefined && v !== null) ? String(v) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { + "type": "string" + }, + "parameters": [ + { + "description": "Field", + "longDescription": "Field key (e.g. name).", + "name": "Field", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Check if player variable (field) is true. For boolean fields.", + "fullName": "Player variable is true (Player.Get boolean)", + "functionType": "Condition", + "group": "Player", + "name": "PlayerBoolean", + "sentence": "Player variable (field: _PARAM1_) is true", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var field = String(eventsFunctionContext.getArgument(\"Field\") || \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.player || !field) { eventsFunctionContext.returnValue = false; return; }", + " var v;", + " if (typeof gp.player.get === 'function') v = gp.player.get(field);", + " else if (gp.player.state && typeof gp.player.state === 'object') v = gp.player.state[field];", + " else v = undefined;", + " eventsFunctionContext.returnValue = !!(v === true || v === 'true' || (typeof v === 'number' && v !== 0));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "description": "Field", + "longDescription": "Boolean field key.", + "name": "Field", + "type": "string" + } + ], + "objectGroups": [] + }, + { + "description": "Pause the game. Use \"Game is paused\" condition in a loop to skip gameplay updates.", + "fullName": "Pause", + "functionType": "Action", + "group": "Common", + "name": "PauseSet", + "sentence": "Pause", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { if (gdjs.GamePush) gdjs.GamePush._isPaused = true; } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Resume the game from pause.", + "fullName": "Resume", + "functionType": "Action", + "group": "Common", + "name": "PauseResume", + "sentence": "Resume", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { if (gdjs.GamePush) gdjs.GamePush._isPaused = false; } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Toggle pause (if paused, resume; otherwise pause).", + "fullName": "Toggle pause", + "functionType": "Action", + "group": "Common", + "name": "PauseToggle", + "sentence": "Toggle pause", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { if (gdjs.GamePush) gdjs.GamePush._isPaused = !gdjs.GamePush._isPaused; } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the game is paused.", + "fullName": "Game is paused", + "functionType": "Condition", + "group": "Common", + "name": "PauseIsPaused", + "sentence": "Game is paused", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { eventsFunctionContext.returnValue = !!(gdjs.GamePush && gdjs.GamePush._isPaused); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Call once at scene start (in the scene where music plays) so that when the game is minimized and platform mutes music, in-game music is paused immediately. Without this, music may keep playing until the window is focused again.", + "fullName": "Register game for sound sync", + "functionType": "Action", + "group": "Sound", + "name": "SoundRegisterGameForSync", + "sentence": "Register game for sound sync (call once at scene start)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " if (typeof runtimeScene !== 'undefined' && gdjs.GamePush && typeof runtimeScene.getGame === 'function') gdjs.GamePush._game = runtimeScene.getGame();", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Mute or unmute music. Use \"Music is muted\" condition when playing music.", + "fullName": "Set music muted", + "functionType": "Action", + "group": "Sound", + "name": "SoundSetMusicMuted", + "sentence": "Set music muted (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " if (typeof runtimeScene !== 'undefined' && runtimeScene && typeof runtimeScene.getGame === 'function' && gdjs.GamePush) gdjs.GamePush._game = runtimeScene.getGame();", + " var muted = !!eventsFunctionContext.getArgument(\"Muted\");", + " var ext = gdjs.GamePush;", + " if (ext) ext._musicMuted = muted;", + " var gp = ext && ext.gp();", + " if (gp && gp.sounds) {", + " if (muted && typeof gp.sounds.muteMusic === 'function') gp.sounds.muteMusic();", + " else if (!muted && typeof gp.sounds.unmuteMusic === 'function') gp.sounds.unmuteMusic();", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "defaultValue": "true", + "description": "Muted", + "longDescription": "Yes — mute music, No — unmute.", + "name": "Muted", + "supplementaryInformation": "trueorfalse", + "type": "trueorfalse" + } + ], + "objectGroups": [] + }, + { + "description": "Mute or unmute sound effects (SFX). Use \"SFX muted\" condition when playing effects.", + "fullName": "Set SFX muted", + "functionType": "Action", + "group": "Sound", + "name": "SoundSetSFXMuted", + "sentence": "Set SFX muted (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var muted = !!eventsFunctionContext.getArgument(\"Muted\");", + " var ext = gdjs.GamePush;", + " if (ext) ext._sfxMuted = muted;", + " var gp = ext && ext.gp();", + " if (gp && gp.sounds) {", + " if (muted && typeof gp.sounds.muteSFX === 'function') gp.sounds.muteSFX();", + " else if (!muted && typeof gp.sounds.unmuteSFX === 'function') gp.sounds.unmuteSFX();", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { + "defaultValue": "true", + "description": "Muted", + "longDescription": "Yes — mute SFX, No — unmute.", + "name": "Muted", + "supplementaryInformation": "trueorfalse", + "type": "trueorfalse" + } + ], + "objectGroups": [] + }, + { + "description": "Toggle music mute (if muted, unmute; otherwise mute).", + "fullName": "Toggle music", + "functionType": "Action", + "group": "Sound", + "name": "SoundToggleMusic", + "sentence": "Toggle music", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " if (typeof runtimeScene !== 'undefined' && runtimeScene && typeof runtimeScene.getGame === 'function' && gdjs.GamePush) gdjs.GamePush._game = runtimeScene.getGame();", + " var ext = gdjs.GamePush;", + " if (ext) {", + " ext._musicMuted = !ext._musicMuted;", + " var gp = ext.gp();", + " if (gp && gp.sounds) {", + " if (ext._musicMuted && typeof gp.sounds.muteMusic === 'function') gp.sounds.muteMusic();", + " else if (!ext._musicMuted && typeof gp.sounds.unmuteMusic === 'function') gp.sounds.unmuteMusic();", + " }", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Toggle SFX mute.", + "fullName": "Toggle SFX", + "functionType": "Action", + "group": "Sound", + "name": "SoundToggleSFX", + "sentence": "Toggle SFX", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (ext) {", + " ext._sfxMuted = !ext._sfxMuted;", + " var gp = ext.gp();", + " if (gp && gp.sounds) {", + " if (ext._sfxMuted && typeof gp.sounds.muteSFX === 'function') gp.sounds.muteSFX();", + " else if (!ext._sfxMuted && typeof gp.sounds.unmuteSFX === 'function') gp.sounds.unmuteSFX();", + " }", + " }", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if music is muted. Use in music play event: if true, do not play.", + "fullName": "Music is muted", + "functionType": "Condition", + "group": "Sound", + "name": "SoundIsMusicMuted", + "sentence": "Music is muted", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (gp && gp.sounds && typeof gp.sounds.isMusicMuted !== 'undefined') eventsFunctionContext.returnValue = !!gp.sounds.isMusicMuted;", + " else eventsFunctionContext.returnValue = !!(ext && ext._musicMuted);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if SFX are muted. Use when playing effects: if true, do not play.", + "fullName": "SFX muted", + "functionType": "Condition", + "group": "Sound", + "name": "SoundIsSFXMuted", + "sentence": "SFX muted", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (gp && gp.sounds && typeof gp.sounds.isSFXMuted !== 'undefined') eventsFunctionContext.returnValue = !!gp.sounds.isSFXMuted;", + " else eventsFunctionContext.returnValue = !!(ext && ext._sfxMuted);", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: music was muted (e.g. via platform UI). Resets after check.", + "fullName": "Music mute happened", + "functionType": "Condition", + "group": "Sound", + "name": "SoundMusicMuteTriggered", + "sentence": "Music mute happened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._musicMuteTriggered);", + " if (ext && ext._musicMuteTriggered) ext._musicMuteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: music was unmuted. Resets after check.", + "fullName": "Music unmute happened", + "functionType": "Condition", + "group": "Sound", + "name": "SoundMusicUnmuteTriggered", + "sentence": "Music unmute happened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._musicUnmuteTriggered);", + " if (ext && ext._musicUnmuteTriggered) ext._musicUnmuteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: SFX were muted (e.g. via platform UI). Resets after check.", + "fullName": "SFX mute happened", + "functionType": "Condition", + "group": "Sound", + "name": "SoundSFXMuteTriggered", + "sentence": "SFX mute happened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._sfxMuteTriggered);", + " if (ext && ext._sfxMuteTriggered) ext._sfxMuteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: SFX were unmuted. Resets after check.", + "fullName": "SFX unmute happened", + "functionType": "Condition", + "group": "Sound", + "name": "SoundSFXUnmuteTriggered", + "sentence": "SFX unmute happened", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._sfxUnmuteTriggered);", + " if (ext && ext._sfxUnmuteTriggered) ext._sfxUnmuteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform supports share (share link to social networks).", + "fullName": "Socials supports share", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsIsSupportsShare", + "sentence": "Socials supports share", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.isSupportsShare); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform supports native share (e.g. VK, OK).", + "fullName": "Socials supports native share", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsIsSupportsNativeShare", + "sentence": "Socials supports native share", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.isSupportsNativeShare); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform supports native post to feed (e.g. VK, OK).", + "fullName": "Socials supports native posts", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsIsSupportsNativePosts", + "sentence": "Socials supports native posts", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.isSupportsNativePosts); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform supports native invite friends (e.g. VK, OK).", + "fullName": "Socials supports native invite", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsIsSupportsNativeInvite", + "sentence": "Socials supports native invite", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.isSupportsNativeInvite); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform allows joining community (overlay or open link).", + "fullName": "Socials can join community", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsCanJoinCommunity", + "sentence": "Socials can join community", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.canJoinCommunity); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if the platform supports native join community (e.g. VK, OK).", + "fullName": "Socials supports native community join", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsIsSupportsNativeCommunityJoin", + "sentence": "Socials supports native community join", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.socials && gp.socials.isSupportsNativeCommunityJoin); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Share game link. Uses platform default or overlay with social networks.", + "fullName": "Share", + "functionType": "Action", + "group": "Socials", + "name": "SocialsShare", + "sentence": "Share", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.socials && typeof gp.socials.share === 'function') gp.socials.share(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Share with custom text, URL and/or image. Leave empty to use defaults.", + "fullName": "Share with options", + "functionType": "Action", + "group": "Socials", + "name": "SocialsShareWithOptions", + "sentence": "Share (text: _PARAM1_, URL: _PARAM2_, image: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var text = String(eventsFunctionContext.getArgument(\"Text\") ?? \"\");", + " var url = String(eventsFunctionContext.getArgument(\"Url\") ?? \"\");", + " var image = String(eventsFunctionContext.getArgument(\"Image\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.socials || typeof gp.socials.share !== 'function') return;", + " var opts = {};", + " if (text) opts.text = text;", + " if (url) opts.url = url;", + " if (image) opts.image = image;", + " gp.socials.share(Object.keys(opts).length ? opts : undefined);", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Text", "longDescription": "Optional share text.", "name": "Text", "type": "string" }, + { "description": "URL", "longDescription": "Optional share URL.", "name": "Url", "type": "string" }, + { "description": "Image URL", "longDescription": "Optional image URL (VK/OK native only).", "name": "Image", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Post to feed (e.g. VK/OK) or show share overlay.", + "fullName": "Post", + "functionType": "Action", + "group": "Socials", + "name": "SocialsPost", + "sentence": "Post", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.socials && typeof gp.socials.post === 'function') gp.socials.post(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Post with custom text, URL and/or image. Leave empty to use defaults.", + "fullName": "Post with options", + "functionType": "Action", + "group": "Socials", + "name": "SocialsPostWithOptions", + "sentence": "Post (text: _PARAM1_, URL: _PARAM2_, image: _PARAM3_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var text = String(eventsFunctionContext.getArgument(\"Text\") ?? \"\");", + " var url = String(eventsFunctionContext.getArgument(\"Url\") ?? \"\");", + " var image = String(eventsFunctionContext.getArgument(\"Image\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.socials || typeof gp.socials.post !== 'function') return;", + " var opts = {};", + " if (text) opts.text = text;", + " if (url) opts.url = url;", + " if (image) opts.image = image;", + " gp.socials.post(Object.keys(opts).length ? opts : undefined);", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Text", "longDescription": "Optional post text.", "name": "Text", "type": "string" }, + { "description": "URL", "longDescription": "Optional post URL.", "name": "Url", "type": "string" }, + { "description": "Image URL", "longDescription": "Optional image URL.", "name": "Image", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Invite friends to the game (native list or share overlay).", + "fullName": "Invite friends", + "functionType": "Action", + "group": "Socials", + "name": "SocialsInvite", + "sentence": "Invite friends", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.socials && typeof gp.socials.invite === 'function') gp.socials.invite(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Invite friends with custom text.", + "fullName": "Invite friends with text", + "functionType": "Action", + "group": "Socials", + "name": "SocialsInviteWithText", + "sentence": "Invite friends (text: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var text = String(eventsFunctionContext.getArgument(\"Text\") ?? \"\");", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.socials || typeof gp.socials.invite !== 'function') return;", + " gp.socials.invite(text ? { text: text } : undefined);", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Text", "longDescription": "Invite message text.", "name": "Text", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Show join community overlay or open community link.", + "fullName": "Join community", + "functionType": "Action", + "group": "Socials", + "name": "SocialsJoinCommunity", + "sentence": "Join community", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); if (gp && gp.socials && typeof gp.socials.joinCommunity === 'function') gp.socials.joinCommunity(); } catch (e) {}", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when share completed. Use after \"Share\" action. Check \"Share succeeded\" or \"Share failed\" for result.", + "fullName": "Share completed", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsShareCompleted", + "sentence": "Share completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._shareTriggered) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._shareTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if last share completed successfully. Use with \"Share completed\".", + "fullName": "Share succeeded", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsShareSucceeded", + "sentence": "Share succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._shareSuccess); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when post completed. Use after \"Post\" action.", + "fullName": "Post completed", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsPostCompleted", + "sentence": "Post completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._postTriggered) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._postTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if last post completed successfully.", + "fullName": "Post succeeded", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsPostSucceeded", + "sentence": "Post succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._postSuccess); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when invite completed. Use after \"Invite friends\" action.", + "fullName": "Invite completed", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsInviteCompleted", + "sentence": "Invite completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._inviteTriggered) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._inviteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if last invite completed successfully.", + "fullName": "Invite succeeded", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsInviteSucceeded", + "sentence": "Invite succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._inviteSuccess); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: true once when join community completed. Use after \"Join community\" action.", + "fullName": "Join community completed", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsJoinCommunityCompleted", + "sentence": "Join community completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " if (!ext || !ext._joinCommunityTriggered) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = true;", + " ext._joinCommunityTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "True if last join community completed successfully.", + "fullName": "Join community succeeded", + "functionType": "Condition", + "group": "Socials", + "name": "SocialsJoinCommunitySucceeded", + "sentence": "Join community succeeded", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._joinCommunitySuccess); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Build share URL with custom parameters (e.g. fromId, gift). Pass params as JSON string, e.g. {\"fromId\":123,\"gift\":\"SWORD\"}. Empty = no params.", + "fullName": "Make share URL", + "functionType": "StringExpression", + "group": "Socials", + "name": "SocialsMakeShareUrl", + "sentence": "Make share URL (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var paramsStr = String(eventsFunctionContext.getArgument(\"ParamsJson\") ?? \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.socials || typeof gp.socials.makeShareUrl !== 'function') { eventsFunctionContext.returnValue = \"\"; return; }", + " var opts = {};", + " if (paramsStr) { try { opts = JSON.parse(paramsStr); } catch (e) {} }", + " eventsFunctionContext.returnValue = gp.socials.makeShareUrl(opts) || \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Params (JSON)", "longDescription": "JSON object as string, e.g. {\"fromId\":123,\"gift\":\"SWORD\"}. Empty = no params.", "name": "ParamsJson", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Get a parameter from the share/invite link the player opened (e.g. fromId, gift). Set in dashboard or via Make share URL.", + "fullName": "Get share param", + "functionType": "StringExpression", + "group": "Socials", + "name": "SocialsShareParam", + "sentence": "Share param (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var name = String(eventsFunctionContext.getArgument(\"ParamName\") ?? \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " if (!gp || !gp.socials || typeof gp.socials.getShareParam !== 'function' || !name) { eventsFunctionContext.returnValue = \"\"; return; }", + " var v = gp.socials.getShareParam(name);", + " eventsFunctionContext.returnValue = (v !== undefined && v !== null) ? String(v) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Param name", "longDescription": "Parameter key (e.g. fromId, gift).", "name": "ParamName", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if in-app purchases are available on the current platform (Yandex, VK, Telegram, etc.). Use before showing shop.", + "fullName": "Payments available", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsIsAvailable", + "sentence": "Payments available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.payments && gp.payments.isAvailable); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Start purchase by product tag (e.g. GOLD_1000, VIP). For one-time consumables: after giving reward call Consume purchase, then sync player.", + "fullName": "Purchase product", + "functionType": "Action", + "group": "Payments", + "name": "PaymentsPurchase", + "sentence": "Purchase product (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var idArg = eventsFunctionContext.getArgument(\"Id\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._purchaseTriggered = false; ext._purchaseSuccess = false; ext._purchaseTag = \"\"; ext._purchaseError = \"\"; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.payments || typeof gp.payments.purchase !== 'function') return;", + " var num = Number(idArg);", + " if (tag) gp.payments.purchase({ tag: tag });", + " else if (!isNaN(num) && num > 0) gp.payments.purchase({ id: num });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Product tag (e.g. GOLD_1000, VIP). Leave empty to use ID.", "name": "Tag", "type": "string" }, + { "defaultValue": "0", "description": "ID", "longDescription": "Product ID (used if Tag is empty).", "name": "Id", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Purchase flow finished (success or error). Resets after check. Use to branch on \"Purchase success\" / \"Purchase error\".", + "fullName": "Purchase finished", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsPurchaseFinished", + "sentence": "Purchase finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._purchaseTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last purchase succeeded. Resets after check. Give reward and for consumables call Consume purchase + sync player.", + "fullName": "Purchase success", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsPurchaseSuccess", + "sentence": "Purchase success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._purchaseSuccess); if (ext && ext._purchaseSuccess) { ext._purchaseSuccess = false; ext._purchaseTriggered = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last purchase failed. Resets after check. Use \"Last purchase error\" to get error code.", + "fullName": "Purchase error", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsPurchaseError", + "sentence": "Purchase error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._purchaseTriggered && !ext._purchaseSuccess); if (ext && ext._purchaseTriggered && !ext._purchaseSuccess) { ext._purchaseTriggered = false; ext._purchaseError = \"\"; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Error code of the last failed purchase (e.g. product_not_found, purchases_not_allowed_on_platform).", + "fullName": "Last purchase error", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsLastPurchaseError", + "sentence": "Last purchase error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._purchaseError) ? String(ext._purchaseError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag of the product that was just purchased (after Purchase success). Useful when starting purchase from a variable.", + "fullName": "Last purchased product tag", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsLastPurchaseTag", + "sentence": "Last purchased product tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._purchaseTag) ? String(ext._purchaseTag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag of the product that was just consumed (after Consume success). Available until next consume.", + "fullName": "Last consumed product tag", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsLastConsumeTag", + "sentence": "Last consumed product tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._consumeTag) ? String(ext._consumeTag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Consume (use) a one-time purchase after giving the reward. Call after player sync. Required for consumables (e.g. gold, lives).", + "fullName": "Consume purchase", + "functionType": "Action", + "group": "Payments", + "name": "PaymentsConsume", + "sentence": "Consume purchase (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var idArg = eventsFunctionContext.getArgument(\"Id\");", + " var ext = gdjs.GamePush;", + " if (ext) { ext._consumeTriggered = false; ext._consumeSuccess = false; ext._consumeError = \"\"; }", + " var gp = ext && ext.gp();", + " if (!gp || !gp.payments || typeof gp.payments.consume !== 'function') return;", + " var num = Number(idArg);", + " if (tag) gp.payments.consume({ tag: tag });", + " else if (!isNaN(num) && num > 0) gp.payments.consume({ id: num });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Product tag. Leave empty to use ID.", "name": "Tag", "type": "string" }, + { "defaultValue": "0", "description": "ID", "longDescription": "Product ID (used if Tag is empty).", "name": "Id", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Consume request finished (success or error). Resets after check.", + "fullName": "Consume finished", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsConsumeFinished", + "sentence": "Consume finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._consumeTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last consume succeeded. Resets after check.", + "fullName": "Consume success", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsConsumeSuccess", + "sentence": "Consume success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._consumeSuccess); if (ext && ext._consumeSuccess) { ext._consumeSuccess = false; ext._consumeTriggered = false; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last consume failed. Resets after check.", + "fullName": "Consume error", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsConsumeError", + "sentence": "Consume error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._consumeTriggered && !ext._consumeSuccess); if (ext && ext._consumeTriggered && !ext._consumeSuccess) { ext._consumeTriggered = false; ext._consumeError = \"\"; } } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Check if player has a non-consumable purchase (e.g. VIP, no ads). Use for permanent unlocks.", + "fullName": "Player has purchase", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsHas", + "sentence": "Player has purchase (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " eventsFunctionContext.returnValue = !!(gp && gp.payments && typeof gp.payments.has === 'function' && tag && gp.payments.has(tag));", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Product tag (e.g. VIP, NO_ADS).", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Number of products in the catalog (loaded at game start).", + "fullName": "Products count", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsProductsCount", + "sentence": "Products count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var arr = gp && gp.payments && gp.payments.products; eventsFunctionContext.returnValue = Array.isArray(arr) ? arr.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Number of purchases the player has (including non-consumed consumables and permanent).", + "fullName": "Player purchases count", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsPurchasesCount", + "sentence": "Player purchases count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var arr = gp && gp.payments && gp.payments.purchases; eventsFunctionContext.returnValue = Array.isArray(arr) ? arr.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Product display name by tag (localized). For shop UI.", + "fullName": "Product name", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductName", + "sentence": "Product name (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || !tag) { eventsFunctionContext.returnValue = \"\"; return; }", + " for (var i = 0; i < products.length; i++) { if (products[i].tag === tag) { eventsFunctionContext.returnValue = products[i].name ? String(products[i].name) : \"\"; return; } }", + " eventsFunctionContext.returnValue = \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Tag", "longDescription": "Product tag.", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Product price by tag (number). For shop UI.", + "fullName": "Product price", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsProductPrice", + "sentence": "Product price (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || !tag) { eventsFunctionContext.returnValue = 0; return; }", + " for (var i = 0; i < products.length; i++) { if (products[i].tag === tag) { eventsFunctionContext.returnValue = Number(products[i].price) || 0; return; } }", + " eventsFunctionContext.returnValue = 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "description": "Tag", "longDescription": "Product tag.", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Product currency symbol by tag (e.g. ₽, Голос). For shop UI.", + "fullName": "Product currency symbol", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductCurrencySymbol", + "sentence": "Product currency symbol (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\").trim();", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || !tag) { eventsFunctionContext.returnValue = \"\"; return; }", + " for (var i = 0; i < products.length; i++) { if (products[i].tag === tag) { eventsFunctionContext.returnValue = (products[i].currencySymbol != null) ? String(products[i].currencySymbol) : \"\"; return; } }", + " eventsFunctionContext.returnValue = \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Tag", "longDescription": "Product tag.", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Product tag at index (0-based). Use in a loop: from 0 to Products count - 1.", + "fullName": "Product tag at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductTagAt", + "sentence": "Product tag at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (products[idx].tag != null) ? String(products[idx].tag) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index (0 to Products count - 1).", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product name at index (0-based). For building shop list.", + "fullName": "Product name at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductNameAt", + "sentence": "Product name at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (products[idx].name != null) ? String(products[idx].name) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product description at index (0-based).", + "fullName": "Product description at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductDescriptionAt", + "sentence": "Product description at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (products[idx].description != null) ? String(products[idx].description) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product price at index (0-based).", + "fullName": "Product price at index", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsProductPriceAt", + "sentence": "Product price at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = 0; return; }", + " eventsFunctionContext.returnValue = Number(products[idx].price) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product currency symbol at index (0-based).", + "fullName": "Product currency symbol at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductCurrencySymbolAt", + "sentence": "Product currency symbol at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (products[idx].currencySymbol != null) ? String(products[idx].currencySymbol) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product ID at index (0-based).", + "fullName": "Product ID at index", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsProductIdAt", + "sentence": "Product ID at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = 0; return; }", + " eventsFunctionContext.returnValue = Number(products[idx].id) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "True if product at index is a subscription.", + "fullName": "Product is subscription at index", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsProductIsSubscriptionAt", + "sentence": "Product at index _PARAM1_ is subscription", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = !!products[idx].isSubscription;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Product icon URL (256x256) at index.", + "fullName": "Product icon URL at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsProductIconAt", + "sentence": "Product icon URL at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(products) || idx < 0 || idx >= products.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (products[idx].icon != null) ? String(products[idx].icon) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player purchase: product ID at index (0-based). Use to match with Product ID at index.", + "fullName": "Purchase product ID at index", + "functionType": "Expression", + "group": "Payments", + "name": "PaymentsPurchaseProductIdAt", + "sentence": "Purchase product ID at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = 0; return; }", + " eventsFunctionContext.returnValue = Number(purchases[idx].productId) || 0;", + "} catch (e) { eventsFunctionContext.returnValue = 0; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index (0 to Player purchases count - 1).", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player purchase: product tag at index (resolved from product ID). Empty if product not in catalog.", + "fullName": "Purchase product tag at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsPurchaseTagAt", + "sentence": "Purchase product tag at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " var products = gp && gp.payments && gp.payments.products;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " var pid = Number(purchases[idx].productId);", + " if (!Array.isArray(products)) { eventsFunctionContext.returnValue = \"\"; return; }", + " for (var i = 0; i < products.length; i++) { if (Number(products[i].id) === pid) { eventsFunctionContext.returnValue = (products[i].tag != null) ? String(products[i].tag) : \"\"; return; } }", + " eventsFunctionContext.returnValue = \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Player purchase: date of purchase (ISO 8601) at index.", + "fullName": "Purchase created at at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsPurchaseCreatedAtAt", + "sentence": "Purchase created at at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (purchases[idx].createdAt != null) ? String(purchases[idx].createdAt) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "True if purchase at index was gifted by developer.", + "fullName": "Purchase is gift at index", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsPurchaseIsGiftAt", + "sentence": "Purchase at index _PARAM1_ is gift", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = !!purchases[idx].gift;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "True if subscription is active for purchase at index.", + "fullName": "Purchase subscribed at index", + "functionType": "Condition", + "group": "Payments", + "name": "PaymentsPurchaseSubscribedAt", + "sentence": "Purchase at index _PARAM1_ is subscribed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = false; return; }", + " eventsFunctionContext.returnValue = !!purchases[idx].subscribed;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Subscription expiry date (ISO 8601) for purchase at index. Empty if not a subscription.", + "fullName": "Purchase expired at at index", + "functionType": "StringExpression", + "group": "Payments", + "name": "PaymentsPurchaseExpiredAtAt", + "sentence": "Purchase expired at at index _PARAM1_", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var idx = Math.floor(Number(eventsFunctionContext.getArgument(\"Index\")) || 0);", + " var gp = gdjs.GamePush && gdjs.GamePush.gp();", + " var purchases = gp && gp.payments && gp.payments.purchases;", + " if (!Array.isArray(purchases) || idx < 0 || idx >= purchases.length) { eventsFunctionContext.returnValue = \"\"; return; }", + " eventsFunctionContext.returnValue = (purchases[idx].expiredAt != null) ? String(purchases[idx].expiredAt) : \"\";", + "} catch (e) { eventsFunctionContext.returnValue = \"\"; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "defaultValue": "0", "description": "Index", "longDescription": "0-based index.", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Application title (from project name in GamePush).", + "fullName": "Application title", + "functionType": "StringExpression", + "group": "Application", + "name": "AppTitle", + "sentence": "Application title", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.app && gp.app.title != null) ? String(gp.app.title) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Application description (from project description in GamePush).", + "fullName": "Application description", + "functionType": "StringExpression", + "group": "Application", + "name": "AppDescription", + "sentence": "Application description", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.app && gp.app.description != null) ? String(gp.app.description) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Application image URL (from project icon in GamePush Assets).", + "fullName": "Application image URL", + "functionType": "StringExpression", + "group": "Application", + "name": "AppImageUrl", + "sentence": "Application image URL", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.app && gp.app.image != null) ? String(gp.app.image) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Game URL on the platform.", + "fullName": "Application URL", + "functionType": "StringExpression", + "group": "Application", + "name": "AppUrl", + "sentence": "Application URL", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.app && gp.app.url != null) ? String(gp.app.url) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Request a review from the player (async). Supported: Yandex.Games, OK. Check \"Review request completed\" or \"Review request error\" and use \"Last review rating\" / \"Last review error\".", + "fullName": "Request review", + "functionType": "Action", + "group": "Application", + "name": "AppRequestReview", + "sentence": "Request review", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.app || typeof gp.app.requestReview !== 'function') return;", + " ext._reviewRequestTriggered = false;", + " ext._reviewRequestSuccess = false;", + " ext._reviewRating = 0;", + " ext._reviewError = '';", + " gp.app.requestReview().then(function(result) {", + " if (ext) {", + " ext._reviewRequestTriggered = true;", + " ext._reviewRequestSuccess = !!(result && result.success);", + " ext._reviewRating = (result && typeof result.rating === 'number') ? result.rating : 0;", + " ext._reviewError = (result && result.error != null) ? String(result.error) : '';", + " }", + " }).catch(function(err) {", + " if (ext) {", + " ext._reviewRequestTriggered = true;", + " ext._reviewRequestSuccess = false;", + " ext._reviewRating = 0;", + " ext._reviewError = (err && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform supports requesting a review (Yandex.Games, OK).", + "fullName": "Can request review", + "functionType": "Condition", + "group": "Application", + "name": "AppCanRequestReview", + "sentence": "Can request review", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.app && gp.app.canRequestReview); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Player has already left a review on this platform.", + "fullName": "Already reviewed", + "functionType": "Condition", + "group": "Application", + "name": "AppIsAlreadyReviewed", + "sentence": "Player already reviewed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.app && gp.app.isAlreadyReviewed); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: review request completed (player rated). Resets after check.", + "fullName": "Review request completed", + "functionType": "Condition", + "group": "Application", + "name": "AppReviewRequestCompleted", + "sentence": "Review request completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._reviewRequestTriggered && ext._reviewRequestSuccess);", + " if (ext && ext._reviewRequestTriggered) ext._reviewRequestTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: review request finished with error or cancel. Resets after check.", + "fullName": "Review request error", + "functionType": "Condition", + "group": "Application", + "name": "AppReviewRequestError", + "sentence": "Review request error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._reviewRequestTriggered && !ext._reviewRequestSuccess);", + " if (ext && ext._reviewRequestTriggered) ext._reviewRequestTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last review rating (1-5, or 0 if unknown/unsupported). Use after \"Review request completed\".", + "fullName": "Last review rating", + "functionType": "Expression", + "group": "Application", + "name": "AppReviewRating", + "sentence": "Last review rating", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && typeof ext._reviewRating === 'number') ? ext._reviewRating : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "number" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last review error code (e.g. unsupported, cancelled, already_rated). Use after \"Review request error\".", + "fullName": "Last review error", + "functionType": "StringExpression", + "group": "Application", + "name": "AppReviewError", + "sentence": "Last review error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._reviewError != null) ? String(ext._reviewError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Ask player to add game to favorites/shortcut (async). Supported: Yandex.Games, VK. Check \"Shortcut completed\" or \"Shortcut error\".", + "fullName": "Add shortcut / to favorites", + "functionType": "Action", + "group": "Application", + "name": "AppAddShortcut", + "sentence": "Add shortcut / to favorites", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.app || typeof gp.app.addShortcut !== 'function') return;", + " ext._shortcutTriggered = false;", + " ext._shortcutSuccess = false;", + " gp.app.addShortcut().then(function(success) {", + " if (ext) { ext._shortcutTriggered = true; ext._shortcutSuccess = !!success; }", + " }).catch(function() {", + " if (ext) { ext._shortcutTriggered = true; ext._shortcutSuccess = false; }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Platform supports adding shortcut/favorites (Yandex.Games, VK).", + "fullName": "Can add shortcut", + "functionType": "Condition", + "group": "Application", + "name": "AppCanAddShortcut", + "sentence": "Can add shortcut", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.app && gp.app.canAddShortcut); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: add shortcut completed successfully. Resets after check.", + "fullName": "Shortcut completed", + "functionType": "Condition", + "group": "Application", + "name": "AppShortcutCompleted", + "sentence": "Shortcut completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._shortcutTriggered && ext._shortcutSuccess);", + " if (ext && ext._shortcutTriggered) ext._shortcutTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: add shortcut failed. Resets after check.", + "fullName": "Shortcut error", + "functionType": "Condition", + "group": "Application", + "name": "AppShortcutError", + "sentence": "Shortcut error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._shortcutTriggered && !ext._shortcutSuccess);", + " if (ext && ext._shortcutTriggered) ext._shortcutTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Fetch game variables from GamePush. By default variables load on boot; use this if auto-load is disabled. Check \"Variables fetch completed\" or \"Variables fetch error\".", + "fullName": "Fetch variables", + "functionType": "Action", + "group": "Variables", + "name": "VariablesFetch", + "sentence": "Fetch variables", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.variables || typeof gp.variables.fetch !== 'function') return;", + " ext._variablesFetchTriggered = false;", + " ext._variablesFetchSuccess = false;", + " ext._variablesFetchError = '';", + " gp.variables.fetch().catch(function(err) {", + " if (ext && ext._variablesFetchTriggered === false) {", + " ext._variablesFetchTriggered = true;", + " ext._variablesFetchSuccess = false;", + " ext._variablesFetchError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown');", + " }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: variables fetch completed successfully. Resets after check.", + "fullName": "Variables fetch completed", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesFetchSuccess", + "sentence": "Variables fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._variablesFetchTriggered && ext._variablesFetchSuccess);", + " if (ext && ext._variablesFetchTriggered) ext._variablesFetchTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: variables fetch failed. Resets after check.", + "fullName": "Variables fetch error", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesFetchError", + "sentence": "Variables fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._variablesFetchTriggered && !ext._variablesFetchSuccess);", + " if (ext && ext._variablesFetchTriggered) ext._variablesFetchTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get game variable value (string). Variables are set in GamePush panel under Game variables.", + "fullName": "Get variable", + "functionType": "StringExpression", + "group": "Variables", + "name": "VariablesGet", + "sentence": "Variable value (key: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var key = String(eventsFunctionContext.getArgument(\"Key\") || \"\"); eventsFunctionContext.returnValue = (gp && gp.variables && typeof gp.variables.get === 'function') ? String(gp.variables.get(key) != null ? gp.variables.get(key) : \"\") : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Variable key", "longDescription": "Variable key from GamePush panel.", "name": "Key", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if game variable exists and has a value.", + "fullName": "Variable exists", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesHas", + "sentence": "Variable exists (key: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var key = String(eventsFunctionContext.getArgument(\"Key\") || \"\"); eventsFunctionContext.returnValue = !!(gp && gp.variables && typeof gp.variables.has === 'function' && gp.variables.has(key)); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Variable key", "longDescription": "Variable key from GamePush panel.", "name": "Key", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Get game variable type: data, stats, flag, doc_html, image, file.", + "fullName": "Variable type", + "functionType": "StringExpression", + "group": "Variables", + "name": "VariablesType", + "sentence": "Variable type (key: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var key = String(eventsFunctionContext.getArgument(\"Key\") || \"\"); eventsFunctionContext.returnValue = (gp && gp.variables && typeof gp.variables.type === 'function') ? String(gp.variables.type(key) || \"\") : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Variable key", "longDescription": "Variable key from GamePush panel.", "name": "Key", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Platform supports remote variables (LiveOps). Only Yandex Games supports this.", + "fullName": "Platform variables available", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesPlatformAvailable", + "sentence": "Platform variables available", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = !!(gp && gp.variables && gp.variables.isPlatformVariablesAvailable); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Fetch platform variables (Yandex Games LiveOps). Check \"Platform variables fetch completed\" or \"Platform variables fetch error\" and use \"Platform variable value\".", + "fullName": "Fetch platform variables", + "functionType": "Action", + "group": "Variables", + "name": "VariablesFetchPlatform", + "sentence": "Fetch platform variables", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.variables || typeof gp.variables.fetchPlatformVariables !== 'function') return;", + " ext._platformVarsTriggered = false;", + " ext._platformVarsSuccess = false;", + " ext._platformVarsResult = null;", + " ext._platformVarsError = '';", + " gp.variables.fetchPlatformVariables().then(function(vars) {", + " if (ext) { ext._platformVarsTriggered = true; ext._platformVarsSuccess = true; ext._platformVarsResult = vars && typeof vars === 'object' ? vars : {}; ext._platformVarsError = ''; }", + " }).catch(function(err) {", + " if (ext) { ext._platformVarsTriggered = true; ext._platformVarsSuccess = false; ext._platformVarsResult = {}; ext._platformVarsError = (err && typeof err === 'object' && err.code) ? String(err.code) : (err ? String(err) : 'unknown'); }", + " });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: platform variables fetch completed successfully. Resets after check.", + "fullName": "Platform variables fetch completed", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesPlatformFetchSuccess", + "sentence": "Platform variables fetch completed", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._platformVarsTriggered && ext._platformVarsSuccess);", + " if (ext && ext._platformVarsTriggered) ext._platformVarsTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Trigger: platform variables fetch failed. Resets after check.", + "fullName": "Platform variables fetch error", + "functionType": "Condition", + "group": "Variables", + "name": "VariablesPlatformFetchError", + "sentence": "Platform variables fetch error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._platformVarsTriggered && !ext._platformVarsSuccess);", + " if (ext && ext._platformVarsTriggered) ext._platformVarsTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get platform variable value (after fetch). Key from Yandex LiveOps.", + "fullName": "Platform variable value", + "functionType": "StringExpression", + "group": "Variables", + "name": "VariablesPlatformGet", + "sentence": "Platform variable value (key: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; var key = String(eventsFunctionContext.getArgument(\"Key\") || \"\"); var r = ext && ext._platformVarsResult && typeof ext._platformVarsResult === 'object'; eventsFunctionContext.returnValue = r && ext._platformVarsResult[key] != null ? String(ext._platformVarsResult[key]) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Variable key", "longDescription": "Variable key from platform LiveOps.", "name": "Key", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Register or update a unique value for the player. If value already exists for another player, registration will fail.", + "fullName": "Register unique value", + "functionType": "Action", + "group": "Unique Values", + "name": "UniquesRegister", + "sentence": "Register unique value (tag: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.uniques || typeof gp.uniques.register !== 'function') return;", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var value = String(eventsFunctionContext.getArgument(\"Value\") || \"\");", + " ext._uniqueRegisterTriggered = false;", + " ext._uniqueRegisterSuccess = false;", + " ext._uniqueRegisterError = '';", + " ext._uniqueRegisterTag = '';", + " ext._uniqueRegisterValue = '';", + " gp.uniques.register({ tag: tag, value: value });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Unique value tag (e.g. login, nickname, cityName).", "name": "Tag", "type": "string" }, + { "description": "Value", "longDescription": "Unique value to register.", "name": "Value", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Check if a unique value is available (not taken by another player). Use for real-time validation before registration.", + "fullName": "Check unique value", + "functionType": "Action", + "group": "Unique Values", + "name": "UniquesCheck", + "sentence": "Check unique value (tag: _PARAM1_, value: _PARAM2_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.uniques || typeof gp.uniques.check !== 'function') return;", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " var value = String(eventsFunctionContext.getArgument(\"Value\") || \"\");", + " ext._uniqueCheckTriggered = false;", + " ext._uniqueCheckSuccess = false;", + " ext._uniqueCheckError = '';", + " ext._uniqueCheckTag = '';", + " ext._uniqueCheckValue = '';", + " gp.uniques.check({ tag: tag, value: value });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Unique value tag (e.g. login, nickname).", "name": "Tag", "type": "string" }, + { "description": "Value", "longDescription": "Unique value to check availability.", "name": "Value", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Delete a unique value by tag. Releases the value for other players.", + "fullName": "Delete unique value", + "functionType": "Action", + "group": "Unique Values", + "name": "UniquesDelete", + "sentence": "Delete unique value (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " var gp = ext && ext.gp();", + " if (!gp || !gp.uniques || typeof gp.uniques.delete !== 'function') return;", + " var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\");", + " ext._uniqueDeleteTriggered = false;", + " ext._uniqueDeleteSuccess = false;", + " ext._uniqueDeleteError = '';", + " ext._uniqueDeleteTag = '';", + " ext._uniqueDeleteValue = '';", + " gp.uniques.delete({ tag: tag });", + "} catch (e) {}" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [ + { "description": "Tag", "longDescription": "Unique value tag to delete.", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Unique value registration request finished (success or error). Resets after check.", + "fullName": "Unique register finished", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesRegisterFinished", + "sentence": "Unique register finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._uniqueRegisterTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique value registration succeeded. Resets after check.", + "fullName": "Unique register success", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesRegisterSuccess", + "sentence": "Unique register success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueRegisterTriggered && ext._uniqueRegisterSuccess);", + " if (ext && ext._uniqueRegisterTriggered) ext._uniqueRegisterTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique value registration failed. Resets after check. Use \"Last unique register error\" for error code.", + "fullName": "Unique register error", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesRegisterError", + "sentence": "Unique register error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueRegisterTriggered && !ext._uniqueRegisterSuccess);", + " if (ext && ext._uniqueRegisterTriggered) ext._uniqueRegisterTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Unique value check request finished (success or error). Resets after check.", + "fullName": "Unique check finished", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesCheckFinished", + "sentence": "Unique check finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._uniqueCheckTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Unique value check succeeded (value is available). Resets after check.", + "fullName": "Unique check success", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesCheckSuccess", + "sentence": "Unique check success (value available)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueCheckTriggered && ext._uniqueCheckSuccess);", + " if (ext && ext._uniqueCheckTriggered) ext._uniqueCheckTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Unique value check failed (value taken or error). Resets after check. Use \"Last unique check error\" for error code.", + "fullName": "Unique check error", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesCheckError", + "sentence": "Unique check error (value taken or error)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueCheckTriggered && !ext._uniqueCheckSuccess);", + " if (ext && ext._uniqueCheckTriggered) ext._uniqueCheckTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Unique value delete request finished (success or error). Resets after check.", + "fullName": "Unique delete finished", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesDeleteFinished", + "sentence": "Unique delete finished", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = !!(ext && ext._uniqueDeleteTriggered); } catch (e) { eventsFunctionContext.returnValue = false; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique value delete succeeded. Resets after check.", + "fullName": "Unique delete success", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesDeleteSuccess", + "sentence": "Unique delete success", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueDeleteTriggered && ext._uniqueDeleteSuccess);", + " if (ext && ext._uniqueDeleteTriggered) ext._uniqueDeleteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique value delete failed. Resets after check. Use \"Last unique delete error\" for error code.", + "fullName": "Unique delete error", + "functionType": "Condition", + "group": "Unique Values", + "name": "UniquesDeleteError", + "sentence": "Unique delete error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": [ + "try {", + " var ext = gdjs.GamePush;", + " eventsFunctionContext.returnValue = !!(ext && ext._uniqueDeleteTriggered && !ext._uniqueDeleteSuccess);", + " if (ext && ext._uniqueDeleteTriggered) ext._uniqueDeleteTriggered = false;", + "} catch (e) { eventsFunctionContext.returnValue = false; }" + ], + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Get unique value by tag for the current player.", + "fullName": "Unique value by tag", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesGet", + "sentence": "Unique value (tag: _PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var tag = String(eventsFunctionContext.getArgument(\"Tag\") || \"\"); eventsFunctionContext.returnValue = (gp && gp.uniques && typeof gp.uniques.get === 'function') ? String(gp.uniques.get(tag) || \"\") : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Tag", "longDescription": "Unique value tag.", "name": "Tag", "type": "string" } + ], + "objectGroups": [] + }, + { + "description": "Number of unique values registered by the current player.", + "fullName": "Unique values list count", + "functionType": "NumberExpression", + "group": "Unique Values", + "name": "UniquesListCount", + "sentence": "Unique values list count", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); eventsFunctionContext.returnValue = (gp && gp.uniques && Array.isArray(gp.uniques.list)) ? gp.uniques.list.length : 0; } catch (e) { eventsFunctionContext.returnValue = 0; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "parameters": [], + "objectGroups": [] + }, + { + "description": "Unique value tag at index in the player's list.", + "fullName": "Unique tag at index", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesTagAt", + "sentence": "Unique tag at (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var idx = Number(eventsFunctionContext.getArgument(\"Index\")) || 0; var list = (gp && gp.uniques && Array.isArray(gp.uniques.list)) ? gp.uniques.list : []; eventsFunctionContext.returnValue = (list[idx] && list[idx].tag != null) ? String(list[idx].tag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Index", "longDescription": "Index in the unique values list (0-based).", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Unique value at index in the player's list.", + "fullName": "Unique value at index", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesValueAt", + "sentence": "Unique value at (_PARAM1_)", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var gp = gdjs.GamePush && gdjs.GamePush.gp(); var idx = Number(eventsFunctionContext.getArgument(\"Index\")) || 0; var list = (gp && gp.uniques && Array.isArray(gp.uniques.list)) ? gp.uniques.list : []; eventsFunctionContext.returnValue = (list[idx] && list[idx].value != null) ? String(list[idx].value) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [ + { "description": "Index", "longDescription": "Index in the unique values list (0-based).", "name": "Index", "type": "expression" } + ], + "objectGroups": [] + }, + { + "description": "Last unique register error code (e.g. already_exists, empty_tag, size_limit_exceeded, bad_value_filter_censor).", + "fullName": "Last unique register error", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesLastRegisterError", + "sentence": "Last unique register error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._uniqueRegisterError) ? String(ext._uniqueRegisterError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique check error code (e.g. already_exists, empty_tag).", + "fullName": "Last unique check error", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesLastCheckError", + "sentence": "Last unique check error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._uniqueCheckError) ? String(ext._uniqueCheckError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Last unique delete error code (e.g. unique_value_not_found, empty_tag).", + "fullName": "Last unique delete error", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesLastDeleteError", + "sentence": "Last unique delete error", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._uniqueDeleteError) ? String(ext._uniqueDeleteError) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Tag from the last successful register event.", + "fullName": "Last registered tag", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesLastRegisterTag", + "sentence": "Last registered tag", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._uniqueRegisterTag) ? String(ext._uniqueRegisterTag) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + }, + { + "description": "Value from the last successful register event.", + "fullName": "Last registered value", + "functionType": "StringExpression", + "group": "Unique Values", + "name": "UniquesLastRegisterValue", + "sentence": "Last registered value", + "events": [ + { + "type": "BuiltinCommonInstructions::JsCode", + "inlineCode": "try { var ext = gdjs.GamePush; eventsFunctionContext.returnValue = (ext && ext._uniqueRegisterValue) ? String(ext._uniqueRegisterValue) : \"\"; } catch (e) { eventsFunctionContext.returnValue = \"\"; }", + "parameterObjects": "", + "useStrict": true, + "eventsSheetExpanded": false + } + ], + "expressionType": { "type": "string" }, + "parameters": [], + "objectGroups": [] + } + ], + "eventsBasedBehaviors": [], + "eventsBasedObjects": [] +} \ No newline at end of file