@indiegems/gem-web-sdk 24.0.1 → 24.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +338 -126
- package/dist/conformance.d.ts +1 -1
- package/dist/gem-web-sdk.conformance.js +3 -3
- package/dist/gem-web-sdk.esm.js +1 -1
- package/dist/gem-web-sdk.function.js +1 -1
- package/dist/gem-web-sdk.game.js +3 -3
- package/dist/gem-web-sdk.min.js +2 -2
- package/dist/gem-web-sdk.sdk.js +2 -2
- package/dist/gem-web-sdk.server.js +1 -1
- package/docs/api/api-reference-function.md +6 -1
- package/docs/api/api-reference-game.md +22 -10
- package/docs/api/api-reference-server.md +1 -1
- package/docs/api/reference.json +6 -6
- package/docs/arcade-and-store.md +48 -22
- package/docs/changelog.md +338 -126
- package/docs/getting-started.md +1 -1
- package/docs/inventory-and-catalogs.md +28 -15
- package/docs/manifest.json +12 -12
- package/docs/platform-rules.md +3 -2
- package/docs/server-bundles.md +2 -2
- package/package.json +1 -1
- package/schema/bridge.v1.json +7 -3
|
@@ -1208,23 +1208,36 @@ now without the bonus. `declined` or `unavailable` means run it as it is — and
|
|
|
1208
1208
|
`error` may still mean the player paid, so read `gem.me.passes` again rather than telling them
|
|
1209
1209
|
they did not.
|
|
1210
1210
|
|
|
1211
|
-
`upsells` is empty for a minor, a store that is off, a pass the player
|
|
1212
|
-
|
|
1211
|
+
`upsells` is empty for a minor, a store that is off, a pass the player already holds, and anywhere
|
|
1212
|
+
the store sells no pass: draw nothing then. Declining a pass's sheet does not empty it: there is no
|
|
1213
|
+
limit on how often a game offers a pass. A guest **does** get
|
|
1213
1214
|
upsells, and buying takes them through sign-up first.
|
|
1214
1215
|
|
|
1215
|
-
**
|
|
1216
|
-
|
|
1217
|
-
- **
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
- **
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
- **
|
|
1224
|
-
-
|
|
1225
|
-
- **
|
|
1226
|
-
|
|
1227
|
-
|
|
1216
|
+
**How it works:**
|
|
1217
|
+
|
|
1218
|
+
- **The offer comes before the grant.** That is the point of the upsell: a bonus applies only if the
|
|
1219
|
+
player holds VIP when the claim runs, and the platform holds nothing back, so a pass bought after
|
|
1220
|
+
the grant cannot reach a reward already given.
|
|
1221
|
+
- **The numbers and the name come from the preview.** Show the preview's numbers and `upsell.name`
|
|
1222
|
+
rather than your own copy of them, and pass `upsell.pass` straight to `showPass` rather than a
|
|
1223
|
+
literal `'vip'`: what is on sale, and what it adds, can change without a release of your game.
|
|
1224
|
+
- **The price comes from the Arcade's sheet.** It varies by player and by sale, so your game does not
|
|
1225
|
+
hard-code one; the sheet shows it.
|
|
1226
|
+
- **A locked roll shows as "+1 roll", not what it would land on.** The roll has not happened: it
|
|
1227
|
+
happens when the recipe runs.
|
|
1228
|
+
|
|
1229
|
+
**The one rule: disclose the odds** for a bonus roll, as for any roll
|
|
1230
|
+
([§12](#12-loot-tables-and-odds)). Store rules require it for a paid random item (Apple's App Store
|
|
1231
|
+
Review Guideline 3.1.1 among them).
|
|
1232
|
+
|
|
1233
|
+
**Recommended, for accessibility:**
|
|
1234
|
+
|
|
1235
|
+
- Show a lock as an icon plus text, not colour alone.
|
|
1236
|
+
- Return focus to the button that opened the sheet when it closes.
|
|
1237
|
+
- Announce an applied bonus in a polite live region (`aria-live="polite"`).
|
|
1238
|
+
|
|
1239
|
+
The card itself is your game's design: how it looks, which button leads and when it appears. The
|
|
1240
|
+
platform sets no rule on them.
|
|
1228
1241
|
|
|
1229
1242
|
### Reading the player's balance
|
|
1230
1243
|
|
package/docs/manifest.json
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"file": "arcade-and-store.md",
|
|
21
|
-
"sha256": "
|
|
22
|
-
"updated": "2026-11-
|
|
21
|
+
"sha256": "d5b3d7753bf00b87d39f16741e743605214059d4b4a499a69b3a5e7350ec288f",
|
|
22
|
+
"updated": "2026-11-13T00:22:09Z"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"file": "arcade-avatars.md",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"file": "changelog.md",
|
|
51
|
-
"sha256": "
|
|
52
|
-
"updated": "2026-11-
|
|
51
|
+
"sha256": "8339a777114f7d8ad7acfcc61d47af25b3e027dc3bdc42c092e9064bd578f78e",
|
|
52
|
+
"updated": "2026-11-13T03:35:34Z"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"file": "daily-challenges.md",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
"file": "getting-started.md",
|
|
81
|
-
"sha256": "
|
|
82
|
-
"updated": "2026-11-
|
|
81
|
+
"sha256": "35401b63060f02364bad539eef2718c5907e8e418b0456582759b65e2313bbe2",
|
|
82
|
+
"updated": "2026-11-13T03:35:34Z"
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
"file": "graphics-route.md",
|
|
@@ -88,8 +88,8 @@
|
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
"file": "inventory-and-catalogs.md",
|
|
91
|
-
"sha256": "
|
|
92
|
-
"updated": "2026-11-
|
|
91
|
+
"sha256": "f32ea4291e47763e7ec664f1c1fee71e0cd1b443f4c617194ab3d27f556aec79",
|
|
92
|
+
"updated": "2026-11-13T00:16:49Z"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"file": "leaderboards.md",
|
|
@@ -113,8 +113,8 @@
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"file": "platform-rules.md",
|
|
116
|
-
"sha256": "
|
|
117
|
-
"updated": "2026-11-
|
|
116
|
+
"sha256": "ba07fc48837dce46500478ae958e03394e7af9650f8314a1868d30e4c3b70354",
|
|
117
|
+
"updated": "2026-11-12T20:29:05Z"
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
"file": "player-sign-in.md",
|
|
@@ -143,8 +143,8 @@
|
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
"file": "server-bundles.md",
|
|
146
|
-
"sha256": "
|
|
147
|
-
"updated": "2026-11-
|
|
146
|
+
"sha256": "4eca8bb4a1b9018257bb9411ecaf3e65cdef472d8b0cc5653b49ab991680eb6c",
|
|
147
|
+
"updated": "2026-11-13T03:35:34Z"
|
|
148
148
|
},
|
|
149
149
|
{
|
|
150
150
|
"file": "serverless-functions-js.md",
|
package/docs/platform-rules.md
CHANGED
|
@@ -357,8 +357,9 @@ A game **must not gate** anything on the multiplier:
|
|
|
357
357
|
`requires: [{ kind: 'holds_pass', pass: 'vip' }]` on the item, recipe, bonus or track, which the
|
|
358
358
|
platform checks when it runs; or a decision your function or server makes from its pass read
|
|
359
359
|
(`gem.me.passes` in a function, `gem.match.playerPasses` on a server). The browser's
|
|
360
|
-
`gem.me.passes` draws the door; it never opens it.
|
|
361
|
-
[inventory-and-catalogs.md](inventory-and-catalogs.md#offering-vip-before-a-reward-the-upsell)
|
|
360
|
+
`gem.me.passes` draws the door; it never opens it. To offer VIP at a reward, offer it before the
|
|
361
|
+
grant, as [inventory-and-catalogs.md](inventory-and-catalogs.md#offering-vip-before-a-reward-the-upsell)
|
|
362
|
+
describes.
|
|
362
363
|
|
|
363
364
|
Three reasons not to gate on the multiplier, any one of which would be enough. It is **advisory**:
|
|
364
365
|
the browser value is pushed on connect and on change, so it can lag, and the platform's own figure
|
package/docs/server-bundles.md
CHANGED
|
@@ -80,8 +80,8 @@ To check the download yourself: the package npm serves is, byte for byte, the fi
|
|
|
80
80
|
also publishes on its download host, with the hash beside it:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
curl -fsSL -O https://downloads.gemarcade.com/sdk/v24.0
|
|
84
|
-
curl -fsSL https://downloads.gemarcade.com/sdk/v24.0
|
|
83
|
+
curl -fsSL -O https://downloads.gemarcade.com/sdk/v24.1.0/gem-web-sdk.tgz
|
|
84
|
+
curl -fsSL https://downloads.gemarcade.com/sdk/v24.1.0/gem-web-sdk.tgz.sri
|
|
85
85
|
openssl dgst -sha384 -binary gem-web-sdk.tgz | openssl base64 -A
|
|
86
86
|
```
|
|
87
87
|
|
package/package.json
CHANGED
package/schema/bridge.v1.json
CHANGED
|
@@ -6099,11 +6099,15 @@
|
|
|
6099
6099
|
"multipliers it carries in `earnMultipliers`, so a game can find VIP by",
|
|
6100
6100
|
"slug and preview what it would add without naming a SKU or a number.",
|
|
6101
6101
|
"A parent lists a pass only where it would open that pass's sheet: an",
|
|
6102
|
-
"offering with `visible_to_games
|
|
6103
|
-
"
|
|
6102
|
+
"offering with `visible_to_games`. A player declining its sheet never",
|
|
6103
|
+
"takes it out of the listing. For a KNOWN MINOR it leaves the pass out",
|
|
6104
6104
|
"exactly as if it were not on sale - the same `ok`, the same other",
|
|
6105
6105
|
"offers, no reason - so a game can never tell a minor from a pass that",
|
|
6106
|
-
"is not sold here. A
|
|
6106
|
+
"is not sold here. A HOLDER may be listed the pass or not, as the",
|
|
6107
|
+
"parent's store decides, and a frame must not assume either. The rule",
|
|
6108
|
+
"is only that the sheet follows the listing: a listed pass opens its",
|
|
6109
|
+
"sheet, and gem.requestStoreOfferSheet for a pass that is not listed is",
|
|
6110
|
+
"answered `unavailable` with nothing shown.",
|
|
6107
6111
|
"",
|
|
6108
6112
|
"COIN PACKS ARE `gem_pack`. The kind enum is closed (a fifth value",
|
|
6109
6113
|
"would be refused whole by an N-1 frame), so a pack of any platform",
|