make-mp-data 3.0.4 → 3.0.6

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.
Files changed (66) hide show
  1. package/README.md +46 -0
  2. package/dungeons/array-of-object-lookup-schema.json +327 -0
  3. package/dungeons/array-of-object-lookup.js +28 -8
  4. package/dungeons/ecommerce-schema.json +462 -0
  5. package/dungeons/{copilot.js → ecommerce.js} +77 -15
  6. package/dungeons/education-schema.json +2409 -0
  7. package/dungeons/education.js +206 -442
  8. package/dungeons/fintech-schema.json +14034 -0
  9. package/dungeons/fintech.js +110 -389
  10. package/dungeons/foobar-schema.json +403 -0
  11. package/dungeons/foobar.js +27 -4
  12. package/dungeons/food-delivery-schema.json +192 -0
  13. package/dungeons/food-delivery.js +602 -0
  14. package/dungeons/food-schema.json +1152 -0
  15. package/dungeons/food.js +150 -383
  16. package/dungeons/gaming-schema.json +1270 -0
  17. package/dungeons/gaming.js +143 -3
  18. package/dungeons/insurance-application-schema.json +204 -0
  19. package/dungeons/insurance-application.js +605 -0
  20. package/dungeons/media-schema.json +906 -0
  21. package/dungeons/media.js +221 -391
  22. package/dungeons/retention-cadence-schema.json +78 -0
  23. package/dungeons/retention-cadence.js +35 -1
  24. package/dungeons/rpg-schema.json +4526 -0
  25. package/dungeons/rpg.js +130 -388
  26. package/dungeons/sanity-schema.json +255 -0
  27. package/dungeons/sanity.js +21 -10
  28. package/dungeons/sass-schema.json +1291 -0
  29. package/dungeons/sass.js +210 -337
  30. package/dungeons/scd-schema.json +919 -0
  31. package/dungeons/scd.js +38 -10
  32. package/dungeons/simple-schema.json +608 -0
  33. package/dungeons/simple.js +48 -11
  34. package/dungeons/simplest-schema.json +1418 -0
  35. package/dungeons/simplest.js +392 -0
  36. package/dungeons/social-schema.json +1118 -0
  37. package/dungeons/social.js +124 -365
  38. package/dungeons/text-generation-schema.json +3096 -0
  39. package/dungeons/text-generation.js +71 -0
  40. package/index.js +6 -3
  41. package/lib/core/config-validator.js +18 -0
  42. package/lib/core/storage.js +5 -5
  43. package/lib/generators/events.js +4 -4
  44. package/lib/orchestrators/mixpanel-sender.js +14 -8
  45. package/lib/orchestrators/user-loop.js +14 -6
  46. package/lib/templates/soup-presets.js +188 -0
  47. package/lib/utils/utils.js +52 -6
  48. package/package.json +2 -2
  49. package/types.d.ts +20 -3
  50. package/dungeons/adspend.js +0 -117
  51. package/dungeons/anon.js +0 -128
  52. package/dungeons/benchmark-heavy.js +0 -240
  53. package/dungeons/benchmark-light.js +0 -126
  54. package/dungeons/big.js +0 -226
  55. package/dungeons/business.js +0 -391
  56. package/dungeons/complex.js +0 -428
  57. package/dungeons/experiments.js +0 -137
  58. package/dungeons/funnels.js +0 -309
  59. package/dungeons/mil.js +0 -323
  60. package/dungeons/mirror.js +0 -160
  61. package/dungeons/soup-test.js +0 -52
  62. package/dungeons/streaming.js +0 -372
  63. package/dungeons/strict-event-test.js +0 -30
  64. package/dungeons/student-teacher.js +0 -438
  65. package/dungeons/too-big-events.js +0 -203
  66. package/dungeons/user-agent.js +0 -209
@@ -0,0 +1,1270 @@
1
+ {
2
+ "schema": {
3
+ "token": "",
4
+ "seed": "i am gamer face",
5
+ "numDays": 180,
6
+ "numEvents": 1080000,
7
+ "numUsers": 12000,
8
+ "hasAnonIds": false,
9
+ "hasSessionIds": false,
10
+ "format": "json",
11
+ "alsoInferFunnels": true,
12
+ "hasLocation": true,
13
+ "hasAndroidDevices": false,
14
+ "hasIOSDevices": false,
15
+ "hasDesktopDevices": false,
16
+ "hasBrowser": false,
17
+ "hasCampaigns": false,
18
+ "isAnonymous": false,
19
+ "hasAdSpend": false,
20
+ "percentUsersBornInDataset": 25,
21
+ "hasAvatar": true,
22
+ "batchSize": 2500000,
23
+ "concurrency": 1,
24
+ "writeToDisk": false,
25
+ "funnels": [
26
+ {
27
+ "sequence": [
28
+ "app install",
29
+ "character creation",
30
+ "join party"
31
+ ],
32
+ "isFirstFunnel": true,
33
+ "conversionRate": 0.8,
34
+ "timeToConvert": 0.25
35
+ },
36
+ {
37
+ "sequence": [
38
+ "start quest",
39
+ "gameplay summary",
40
+ "complete quest"
41
+ ],
42
+ "conversionRate": 0.99,
43
+ "timeToConvert": 1,
44
+ "props": {
45
+ "quest type": [
46
+ "Rescue",
47
+ "Retrieve",
48
+ "Explore",
49
+ "Destroy",
50
+ "Investigate"
51
+ ],
52
+ "quest difficulty": [
53
+ "Easy",
54
+ "Medium",
55
+ "Hard",
56
+ "Legendary"
57
+ ],
58
+ "quest location": [
59
+ "Forest",
60
+ "Dungeon",
61
+ "Mountain",
62
+ "City",
63
+ "Desert"
64
+ ]
65
+ }
66
+ }
67
+ ],
68
+ "events": [
69
+ {
70
+ "event": "app install",
71
+ "weight": 10,
72
+ "isFirstEvent": true
73
+ },
74
+ {
75
+ "event": "character creation",
76
+ "weight": 2,
77
+ "properties": {
78
+ "mode": [
79
+ "fast",
80
+ "slow",
81
+ "template"
82
+ ]
83
+ }
84
+ },
85
+ {
86
+ "event": "join party",
87
+ "weight": 8,
88
+ "properties": {
89
+ "party size": [
90
+ 1,
91
+ 3,
92
+ 3,
93
+ 6,
94
+ 2,
95
+ 2,
96
+ 3,
97
+ 3,
98
+ 6,
99
+ 4,
100
+ 1,
101
+ 4,
102
+ 4,
103
+ 3,
104
+ 5,
105
+ 2,
106
+ 3,
107
+ 2,
108
+ 3,
109
+ 5,
110
+ 4,
111
+ 4,
112
+ 1,
113
+ 3,
114
+ 4,
115
+ 3,
116
+ 3,
117
+ 3,
118
+ 2,
119
+ 4,
120
+ 4,
121
+ 2,
122
+ 2,
123
+ 5,
124
+ 3,
125
+ 2,
126
+ 5,
127
+ 2,
128
+ 3,
129
+ 2,
130
+ 4,
131
+ 3,
132
+ 3,
133
+ 2,
134
+ 4,
135
+ 3,
136
+ 3,
137
+ 3,
138
+ 3,
139
+ 4
140
+ ],
141
+ "party leader": [
142
+ "Bard",
143
+ "Cleric",
144
+ "Fighter",
145
+ "Rogue",
146
+ "Wizard",
147
+ "Paladin",
148
+ "Ranger",
149
+ "Sorcerer",
150
+ "Warlock"
151
+ ]
152
+ }
153
+ },
154
+ {
155
+ "event": "start quest",
156
+ "weight": 12,
157
+ "properties": {
158
+ "quest type": [
159
+ "Rescue",
160
+ "Retrieve",
161
+ "Explore",
162
+ "Destroy",
163
+ "Investigate"
164
+ ],
165
+ "quest difficulty": [
166
+ "Easy",
167
+ "Medium",
168
+ "Hard",
169
+ "Legendary"
170
+ ],
171
+ "quest location": [
172
+ "Forest",
173
+ "Dungeon",
174
+ "Mountain",
175
+ "City",
176
+ "Desert"
177
+ ],
178
+ "party size": [
179
+ 2,
180
+ 3,
181
+ 3,
182
+ 3,
183
+ 3,
184
+ 2,
185
+ 3,
186
+ 3,
187
+ 4,
188
+ 2,
189
+ 3,
190
+ 3,
191
+ 5,
192
+ 2,
193
+ 5,
194
+ 5,
195
+ 4,
196
+ 2,
197
+ 5,
198
+ 3,
199
+ 4,
200
+ 5,
201
+ 4,
202
+ 3,
203
+ 5,
204
+ 3,
205
+ 3,
206
+ 3,
207
+ 3,
208
+ 2,
209
+ 3,
210
+ 3,
211
+ 3,
212
+ 3,
213
+ 2,
214
+ 4,
215
+ 1,
216
+ 1,
217
+ 3,
218
+ 3,
219
+ 4,
220
+ 3,
221
+ 4,
222
+ 4,
223
+ 3,
224
+ 2,
225
+ 1,
226
+ 2,
227
+ 2,
228
+ 3
229
+ ],
230
+ "used hint": {
231
+ "functionName": "arrow",
232
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
233
+ },
234
+ "used boost": {
235
+ "functionName": "arrow",
236
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
237
+ },
238
+ "level at start": [
239
+ 17,
240
+ 5,
241
+ 6,
242
+ 3,
243
+ 7,
244
+ 8,
245
+ 9,
246
+ 14,
247
+ 8,
248
+ 9,
249
+ 17,
250
+ 9,
251
+ 6,
252
+ 7,
253
+ 7,
254
+ 3,
255
+ 7,
256
+ 16,
257
+ 10,
258
+ 10,
259
+ 12,
260
+ 7,
261
+ 5,
262
+ 7,
263
+ 13,
264
+ 6,
265
+ 8,
266
+ 6,
267
+ 8,
268
+ 9,
269
+ 15,
270
+ 16,
271
+ 7,
272
+ 4,
273
+ 11,
274
+ 12,
275
+ 10,
276
+ 5,
277
+ 5,
278
+ 9,
279
+ 6,
280
+ 11,
281
+ 15,
282
+ 10,
283
+ 5,
284
+ 18,
285
+ 10,
286
+ 5,
287
+ 12,
288
+ 13
289
+ ]
290
+ }
291
+ },
292
+ {
293
+ "event": "complete quest",
294
+ "weight": 12,
295
+ "properties": {
296
+ "completion time (mins)": [
297
+ 62,
298
+ 79,
299
+ 39,
300
+ 42,
301
+ 33,
302
+ 54,
303
+ 62,
304
+ 63,
305
+ 20,
306
+ 18,
307
+ 29,
308
+ 117,
309
+ 30,
310
+ 38,
311
+ 34,
312
+ 34,
313
+ 31,
314
+ 23,
315
+ 64,
316
+ 41,
317
+ 100,
318
+ 72,
319
+ 46,
320
+ 46,
321
+ 54,
322
+ 54,
323
+ 33,
324
+ 80,
325
+ 75,
326
+ 85
327
+ ],
328
+ "quest reward (gold)": [
329
+ 100,
330
+ 111,
331
+ 210,
332
+ 457,
333
+ 439,
334
+ 165,
335
+ 84,
336
+ 122,
337
+ 142,
338
+ 317,
339
+ 170,
340
+ 150,
341
+ 307,
342
+ 318,
343
+ 277,
344
+ 157,
345
+ 287,
346
+ 227,
347
+ 141,
348
+ 439,
349
+ 389,
350
+ 138,
351
+ 394,
352
+ 288,
353
+ 241,
354
+ 235,
355
+ 72,
356
+ 334,
357
+ 130,
358
+ 251,
359
+ 315,
360
+ 223,
361
+ 120,
362
+ 174,
363
+ 195,
364
+ 136,
365
+ 218,
366
+ 256,
367
+ 149,
368
+ 206,
369
+ 231,
370
+ 157,
371
+ 135,
372
+ 97,
373
+ 143,
374
+ 214,
375
+ 269,
376
+ 404,
377
+ 200,
378
+ 95,
379
+ 284,
380
+ 332,
381
+ 371,
382
+ 136,
383
+ 295,
384
+ 51,
385
+ 199,
386
+ 373,
387
+ 193,
388
+ 275,
389
+ 204,
390
+ 155,
391
+ 256,
392
+ 289,
393
+ 411,
394
+ 126,
395
+ 116,
396
+ 184,
397
+ 128,
398
+ 128,
399
+ 281,
400
+ 128,
401
+ 323,
402
+ 429,
403
+ 75,
404
+ 187,
405
+ 138,
406
+ 367,
407
+ 170,
408
+ 85,
409
+ 168,
410
+ 163,
411
+ 137,
412
+ 143,
413
+ 176,
414
+ 250,
415
+ 17,
416
+ 307,
417
+ 192,
418
+ 320,
419
+ 219,
420
+ 255,
421
+ 126,
422
+ 198,
423
+ 429,
424
+ 101,
425
+ 381,
426
+ 342,
427
+ 231,
428
+ 144
429
+ ],
430
+ "quest success": {
431
+ "functionName": "arrow",
432
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
433
+ },
434
+ "used hint": {
435
+ "functionName": "arrow",
436
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
437
+ },
438
+ "used boost": {
439
+ "functionName": "arrow",
440
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
441
+ },
442
+ "number of deaths": [
443
+ 1,
444
+ 1
445
+ ],
446
+ "level at start": [
447
+ 14,
448
+ 6,
449
+ 6,
450
+ 8,
451
+ 11,
452
+ 11,
453
+ 5,
454
+ 16,
455
+ 2,
456
+ 7,
457
+ 15,
458
+ 12,
459
+ 4,
460
+ 9,
461
+ 5,
462
+ 11,
463
+ 6,
464
+ 8,
465
+ 6,
466
+ 9,
467
+ 5,
468
+ 14,
469
+ 13,
470
+ 9,
471
+ 14,
472
+ 7,
473
+ 13,
474
+ 9,
475
+ 7,
476
+ 8,
477
+ 10,
478
+ 4,
479
+ 10,
480
+ 11,
481
+ 10,
482
+ 16,
483
+ 12,
484
+ 7,
485
+ 11,
486
+ 6,
487
+ 8,
488
+ 9,
489
+ 7,
490
+ 14,
491
+ 13,
492
+ 4,
493
+ 3,
494
+ 7,
495
+ 17,
496
+ 14
497
+ ],
498
+ "level at end": [
499
+ 7,
500
+ 8,
501
+ 13,
502
+ 8,
503
+ 7,
504
+ 13,
505
+ 8,
506
+ 13,
507
+ 6,
508
+ 7,
509
+ 11,
510
+ 9,
511
+ 7,
512
+ 16,
513
+ 16,
514
+ 6,
515
+ 9,
516
+ 7,
517
+ 6,
518
+ 7,
519
+ 2,
520
+ 14,
521
+ 6,
522
+ 6,
523
+ 7,
524
+ 7,
525
+ 4,
526
+ 8,
527
+ 15,
528
+ 8,
529
+ 13,
530
+ 6,
531
+ 5,
532
+ 5,
533
+ 17,
534
+ 10,
535
+ 6,
536
+ 12,
537
+ 7,
538
+ 1,
539
+ 12,
540
+ 14,
541
+ 13,
542
+ 7,
543
+ 5,
544
+ 7,
545
+ 8,
546
+ 5,
547
+ 10,
548
+ 6
549
+ ]
550
+ }
551
+ },
552
+ {
553
+ "event": "gameplay summary",
554
+ "weight": 14,
555
+ "properties": {
556
+ "# enemies defeated": [
557
+ 29,
558
+ 27,
559
+ 49,
560
+ 14,
561
+ 32,
562
+ 50,
563
+ 60,
564
+ 43,
565
+ 47,
566
+ 11,
567
+ 14,
568
+ 67,
569
+ 74,
570
+ 19,
571
+ 32,
572
+ 2,
573
+ 30,
574
+ 51,
575
+ 24,
576
+ 35,
577
+ 57,
578
+ 22,
579
+ 63,
580
+ 41,
581
+ 68,
582
+ 19,
583
+ 69,
584
+ 22,
585
+ 57,
586
+ 33,
587
+ 65,
588
+ 26,
589
+ 28,
590
+ 22,
591
+ 54,
592
+ 32,
593
+ 28,
594
+ 33,
595
+ 79,
596
+ 34,
597
+ 80,
598
+ 18,
599
+ 12,
600
+ 27,
601
+ 40,
602
+ 27,
603
+ 64,
604
+ 60,
605
+ 42,
606
+ 19
607
+ ],
608
+ "# respawns": [
609
+ 1,
610
+ 5,
611
+ 4,
612
+ 4,
613
+ 5,
614
+ 5,
615
+ 4,
616
+ 5,
617
+ 4,
618
+ 5,
619
+ 5,
620
+ 2,
621
+ 3,
622
+ 5,
623
+ 2,
624
+ 5,
625
+ 4,
626
+ 7,
627
+ 5,
628
+ 5,
629
+ 5,
630
+ 5,
631
+ 3,
632
+ 5,
633
+ 5,
634
+ 5,
635
+ 5,
636
+ 5,
637
+ 4,
638
+ 7,
639
+ 3,
640
+ 5,
641
+ 4,
642
+ 5,
643
+ 5,
644
+ 5,
645
+ 5,
646
+ 7,
647
+ 5,
648
+ 5,
649
+ 5,
650
+ 0,
651
+ 5,
652
+ 4,
653
+ 4,
654
+ 5,
655
+ 8,
656
+ 4,
657
+ 5,
658
+ 5
659
+ ],
660
+ "# attacks": [
661
+ 48,
662
+ 50,
663
+ 50,
664
+ 50,
665
+ 50,
666
+ 63,
667
+ 46,
668
+ 50,
669
+ 50,
670
+ 78,
671
+ 50,
672
+ 51
673
+ ],
674
+ "# gold found": [
675
+ 685,
676
+ 482,
677
+ 844,
678
+ 551,
679
+ 216,
680
+ 453,
681
+ 516,
682
+ 412,
683
+ 494,
684
+ 268,
685
+ 272,
686
+ 553,
687
+ 489,
688
+ 407,
689
+ 365,
690
+ 209,
691
+ 314,
692
+ 60,
693
+ 894,
694
+ 413,
695
+ 312,
696
+ 535,
697
+ 556,
698
+ 504,
699
+ 162,
700
+ 544,
701
+ 231,
702
+ 716,
703
+ 214,
704
+ 770,
705
+ 246,
706
+ 351,
707
+ 400,
708
+ 653,
709
+ 199,
710
+ 671,
711
+ 289,
712
+ 426,
713
+ 241,
714
+ 626,
715
+ 661,
716
+ 423,
717
+ 724,
718
+ 382,
719
+ 249,
720
+ 712,
721
+ 422,
722
+ 277,
723
+ 355,
724
+ 507
725
+ ]
726
+ }
727
+ },
728
+ {
729
+ "event": "in-game purchase",
730
+ "weight": 2,
731
+ "properties": {
732
+ "purchase type": [
733
+ "Gold",
734
+ "Gems",
735
+ "Items: Weapons",
736
+ "Items: Armor",
737
+ "Items: Potions",
738
+ "Items: Scrolls",
739
+ "Boosts",
740
+ "Currency"
741
+ ],
742
+ "purchase amount": [
743
+ 31,
744
+ 42,
745
+ 22,
746
+ 3,
747
+ 37,
748
+ 16,
749
+ 12,
750
+ 23,
751
+ 21,
752
+ 26,
753
+ 1,
754
+ 14,
755
+ 24,
756
+ 20,
757
+ 38,
758
+ 31,
759
+ 16,
760
+ 37,
761
+ 30,
762
+ 27
763
+ ]
764
+ }
765
+ },
766
+ {
767
+ "event": "fight boss",
768
+ "weight": 3,
769
+ "properties": {
770
+ "boss type": [
771
+ "Dragon",
772
+ "Demon",
773
+ "Lich",
774
+ "Vampire",
775
+ "Beholder"
776
+ ],
777
+ "boss level": [
778
+ 18,
779
+ 14,
780
+ 18,
781
+ 12,
782
+ 19,
783
+ 13,
784
+ 12,
785
+ 14,
786
+ 11,
787
+ 12,
788
+ 15,
789
+ 14,
790
+ 13,
791
+ 12,
792
+ 15,
793
+ 15,
794
+ 15,
795
+ 12,
796
+ 15,
797
+ 17,
798
+ 12,
799
+ 17,
800
+ 17,
801
+ 17,
802
+ 14,
803
+ 11,
804
+ 11,
805
+ 16,
806
+ 17,
807
+ 14,
808
+ 17,
809
+ 14,
810
+ 16,
811
+ 17,
812
+ 15,
813
+ 11,
814
+ 18,
815
+ 14,
816
+ 16,
817
+ 17,
818
+ 18,
819
+ 18,
820
+ 13,
821
+ 11,
822
+ 15,
823
+ 15,
824
+ 12,
825
+ 19,
826
+ 15,
827
+ 14
828
+ ],
829
+ "boss difficulty": [
830
+ "Hard",
831
+ "Legendary",
832
+ "Impossible"
833
+ ],
834
+ "fight duration (mins)": [
835
+ 31,
836
+ 14,
837
+ 34,
838
+ 32,
839
+ 15,
840
+ 19,
841
+ 34,
842
+ 11,
843
+ 21,
844
+ 15,
845
+ 13,
846
+ 44,
847
+ 31,
848
+ 36,
849
+ 27,
850
+ 37,
851
+ 19,
852
+ 38,
853
+ 29,
854
+ 15,
855
+ 44,
856
+ 39,
857
+ 16,
858
+ 26,
859
+ 11,
860
+ 33,
861
+ 24,
862
+ 23,
863
+ 21,
864
+ 21,
865
+ 28,
866
+ 35,
867
+ 13,
868
+ 42,
869
+ 57,
870
+ 31,
871
+ 18,
872
+ 8,
873
+ 12,
874
+ 31,
875
+ 20,
876
+ 29,
877
+ 40,
878
+ 29,
879
+ 36,
880
+ 22,
881
+ 23,
882
+ 22,
883
+ 47,
884
+ 15
885
+ ]
886
+ }
887
+ },
888
+ {
889
+ "event": "level up",
890
+ "weight": 1,
891
+ "properties": {
892
+ "new abilities": [
893
+ "Attack",
894
+ "Spell",
895
+ "Feat",
896
+ "Skill"
897
+ ]
898
+ }
899
+ },
900
+ {
901
+ "event": "attack",
902
+ "weight": 5,
903
+ "properties": {
904
+ "generic_prop": [
905
+ "foo",
906
+ "bar",
907
+ "baz",
908
+ "qux"
909
+ ]
910
+ }
911
+ },
912
+ {
913
+ "event": "defend",
914
+ "weight": 3,
915
+ "properties": {
916
+ "generic_prop": [
917
+ "foo",
918
+ "bar",
919
+ "baz",
920
+ "qux"
921
+ ]
922
+ }
923
+ }
924
+ ],
925
+ "superProps": {
926
+ "platform": [
927
+ "Mobile",
928
+ "Xbox",
929
+ "Playstation",
930
+ "Switch",
931
+ "Web"
932
+ ],
933
+ "game mode": {
934
+ "functionName": "arrow",
935
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
936
+ },
937
+ "language": [
938
+ "English",
939
+ "Spanish",
940
+ "French",
941
+ "German",
942
+ "Japanese",
943
+ "Korean",
944
+ "Chinese"
945
+ ]
946
+ },
947
+ "scdProps": {},
948
+ "userProps": {
949
+ "experiment": [
950
+ "fast leveling",
951
+ "tension economy",
952
+ "free trial"
953
+ ],
954
+ "variant": [
955
+ "A",
956
+ "B",
957
+ "C",
958
+ "Control"
959
+ ],
960
+ "race": [
961
+ "Human",
962
+ "Elf",
963
+ "Dwarf",
964
+ "Halfling",
965
+ "Dragonborn",
966
+ "Gnome",
967
+ "Half-Elf",
968
+ "Half-Orc",
969
+ "Tiefling"
970
+ ],
971
+ "class": [
972
+ "Barbarian",
973
+ "Bard",
974
+ "Cleric",
975
+ "Druid",
976
+ "Fighter",
977
+ "Monk",
978
+ "Paladin",
979
+ "Ranger",
980
+ "Rogue",
981
+ "Sorcerer",
982
+ "Warlock",
983
+ "Wizard"
984
+ ],
985
+ "alignment": [
986
+ "Lawful Good",
987
+ "Neutral Good",
988
+ "Chaotic Good",
989
+ "Lawful Neutral",
990
+ "True Neutral",
991
+ "Chaotic Neutral",
992
+ "Lawful Evil",
993
+ "Neutral Evil",
994
+ "Chaotic Evil"
995
+ ],
996
+ "level": [
997
+ 13,
998
+ 13,
999
+ 8,
1000
+ 6,
1001
+ 7,
1002
+ 10,
1003
+ 9,
1004
+ 8,
1005
+ 5,
1006
+ 8,
1007
+ 3,
1008
+ 5,
1009
+ 11,
1010
+ 4,
1011
+ 9,
1012
+ 6,
1013
+ 6,
1014
+ 16,
1015
+ 10,
1016
+ 14,
1017
+ 8,
1018
+ 4,
1019
+ 11,
1020
+ 7,
1021
+ 5,
1022
+ 8,
1023
+ 9,
1024
+ 7,
1025
+ 5,
1026
+ 8,
1027
+ 11,
1028
+ 11,
1029
+ 10,
1030
+ 5,
1031
+ 2,
1032
+ 7,
1033
+ 6,
1034
+ 7,
1035
+ 3,
1036
+ 13,
1037
+ 14,
1038
+ 4,
1039
+ 12,
1040
+ 14,
1041
+ 9,
1042
+ 3,
1043
+ 8,
1044
+ 3,
1045
+ 11,
1046
+ 6
1047
+ ],
1048
+ "background": [
1049
+ "Acolyte",
1050
+ "Charlatan",
1051
+ "Criminal",
1052
+ "Entertainer",
1053
+ "Folk Hero",
1054
+ "Guild Artisan",
1055
+ "Hermit",
1056
+ "Noble",
1057
+ "Outlander",
1058
+ "Sage",
1059
+ "Sailor",
1060
+ "Soldier",
1061
+ "Urchin"
1062
+ ],
1063
+ "subscription MRR": [
1064
+ 143,
1065
+ 84,
1066
+ 97,
1067
+ 56,
1068
+ 117,
1069
+ 66,
1070
+ 92,
1071
+ 49,
1072
+ 33,
1073
+ 16,
1074
+ 112,
1075
+ 147,
1076
+ 89,
1077
+ 78,
1078
+ 64,
1079
+ 157,
1080
+ 139,
1081
+ 199,
1082
+ 91,
1083
+ 155,
1084
+ 35,
1085
+ 109,
1086
+ 102,
1087
+ 94,
1088
+ 40,
1089
+ 164,
1090
+ 161,
1091
+ 45,
1092
+ 195,
1093
+ 62,
1094
+ 161,
1095
+ 149,
1096
+ 144,
1097
+ 224,
1098
+ 215,
1099
+ 54,
1100
+ 98,
1101
+ 36,
1102
+ 67,
1103
+ 98,
1104
+ 187,
1105
+ 72,
1106
+ 74,
1107
+ 136,
1108
+ 85,
1109
+ 42,
1110
+ 122,
1111
+ 93,
1112
+ 91,
1113
+ 83,
1114
+ 99,
1115
+ 94,
1116
+ 87,
1117
+ 123,
1118
+ 89,
1119
+ 72,
1120
+ 99,
1121
+ 36,
1122
+ 82,
1123
+ 140,
1124
+ 189,
1125
+ 122,
1126
+ 122,
1127
+ 54,
1128
+ 97,
1129
+ 62,
1130
+ 125,
1131
+ 114,
1132
+ 155,
1133
+ 106,
1134
+ 169,
1135
+ 153,
1136
+ 47,
1137
+ 79,
1138
+ 80,
1139
+ 211,
1140
+ 103,
1141
+ 59,
1142
+ 88,
1143
+ 165,
1144
+ 102,
1145
+ 196,
1146
+ 206,
1147
+ 184,
1148
+ 222,
1149
+ 148,
1150
+ 117,
1151
+ 126,
1152
+ 163,
1153
+ 110,
1154
+ 236,
1155
+ 99,
1156
+ 135,
1157
+ 103,
1158
+ 45,
1159
+ 218,
1160
+ 76,
1161
+ 188,
1162
+ 160,
1163
+ 120,
1164
+ 129,
1165
+ 59,
1166
+ 69,
1167
+ 59,
1168
+ 132,
1169
+ 90,
1170
+ 38,
1171
+ 31,
1172
+ 78,
1173
+ 246,
1174
+ 150,
1175
+ 68,
1176
+ 158,
1177
+ 23,
1178
+ 125,
1179
+ 77,
1180
+ 27,
1181
+ 78,
1182
+ 51,
1183
+ 85,
1184
+ 53,
1185
+ 106,
1186
+ 113,
1187
+ 80,
1188
+ 153,
1189
+ 184,
1190
+ 61,
1191
+ 46,
1192
+ 244,
1193
+ 39,
1194
+ 152,
1195
+ 103,
1196
+ 125,
1197
+ 147,
1198
+ 135,
1199
+ 142,
1200
+ 74,
1201
+ 35,
1202
+ 97,
1203
+ 197,
1204
+ 112,
1205
+ 128,
1206
+ 84,
1207
+ 83,
1208
+ 91,
1209
+ 158,
1210
+ 57,
1211
+ 123,
1212
+ 47,
1213
+ 155,
1214
+ 102,
1215
+ 175,
1216
+ 82,
1217
+ 60,
1218
+ 98,
1219
+ 109,
1220
+ 138,
1221
+ 56,
1222
+ 171,
1223
+ 84,
1224
+ 109,
1225
+ 100,
1226
+ 65,
1227
+ 78,
1228
+ 98,
1229
+ 117,
1230
+ 19,
1231
+ 157,
1232
+ 80,
1233
+ 201,
1234
+ 200,
1235
+ 64,
1236
+ 100,
1237
+ 46,
1238
+ 155,
1239
+ 115,
1240
+ 73,
1241
+ 94,
1242
+ 147,
1243
+ 114,
1244
+ 14,
1245
+ 74,
1246
+ 183,
1247
+ 31,
1248
+ 232,
1249
+ 103,
1250
+ 95,
1251
+ 118,
1252
+ 68,
1253
+ 114,
1254
+ 40,
1255
+ 65,
1256
+ 150,
1257
+ 170,
1258
+ 191,
1259
+ 91,
1260
+ 87,
1261
+ 187,
1262
+ 87,
1263
+ 132
1264
+ ]
1265
+ }
1266
+ },
1267
+ "hooks": "function (record, type, meta) {\n\n\t\tif (type === \"event\") {\n\t\t\t// Pattern 1: Higher-level players earn more gold and defeat more enemies\n\t\t\tif (record.event === \"complete quest\") {\n\t\t\t\tconst level = record[\"level at end\"] || 1;\n\t\t\t\trecord[\"quest reward (gold)\"] = Math.round((record[\"quest reward (gold)\"] || 50) * (1 + level * 0.1));\n\t\t\t}\n\n\t\t\t// Pattern 2: In-game purchases are bigger for \"free trial\" experiment users\n\t\t\tif (record.event === \"in-game purchase\") {\n\t\t\t\t// We don't have profile here, so use a hash-based approach\n\t\t\t\tconst uid = record.user_id || record.distinct_id || \"\";\n\t\t\t\tif (uid.charCodeAt(0) % 3 === 0) {\n\t\t\t\t\trecord[\"purchase amount\"] = Math.round((record[\"purchase amount\"] || 10) * 1.8);\n\t\t\t\t\trecord.is_whale = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (type === \"user\") {\n\t\t\t// Pattern 3: Chaotic Evil players get a \"villain\" tag; Lawful Good get \"hero\"\n\t\t\tif (record.alignment === \"Chaotic Evil\" || record.alignment === \"Neutral Evil\") {\n\t\t\t\trecord.archetype = \"villain\";\n\t\t\t} else if (record.alignment === \"Lawful Good\" || record.alignment === \"Neutral Good\") {\n\t\t\t\trecord.archetype = \"hero\";\n\t\t\t} else {\n\t\t\t\trecord.archetype = \"neutral\";\n\t\t\t}\n\t\t}\n\n\t\tif (type === \"funnel-post\") {\n\n\t\t}\n\n\t\tif (type === \"funnel-pre\") {\n\n\t\t}\n\n\t\tif (type === \"scd\") {\n\n\t\t}\n\n\t\tif (type === \"everything\") {\n\n\t\t}\n\n\t\treturn record;\n\t}",
1268
+ "timestamp": "2026-04-10T01:39:07.110Z",
1269
+ "version": "4.0"
1270
+ }