@maccesar/titools 5.1.1 → 5.2.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.
Files changed (69) hide show
  1. package/README.md +44 -12
  2. package/agents/ti-pro.md +4 -0
  3. package/commands/ti-audit.md +4 -0
  4. package/lib/config.js +2 -0
  5. package/package.json +1 -1
  6. package/skills/ti-admob-unified/SKILL.md +44 -0
  7. package/skills/ti-admob-unified/agents/openai.yaml +4 -0
  8. package/skills/ti-admob-unified/assets/example/app.js +1003 -0
  9. package/skills/ti-admob-unified/assets/example/lib/ads.js +618 -0
  10. package/skills/ti-admob-unified/assets/example/library-usage.js +104 -0
  11. package/skills/ti-admob-unified/references/api-reference.md +592 -0
  12. package/skills/ti-admob-unified/references/banners.md +435 -0
  13. package/skills/ti-admob-unified/references/contributing.md +228 -0
  14. package/skills/ti-admob-unified/references/dependencies.md +85 -0
  15. package/skills/ti-admob-unified/references/fullscreen.md +223 -0
  16. package/skills/ti-admob-unified/references/game-monetization.md +17 -0
  17. package/skills/ti-admob-unified/references/getting-started.md +275 -0
  18. package/skills/ti-admob-unified/references/index.md +30 -0
  19. package/skills/ti-admob-unified/references/integration.md +85 -0
  20. package/skills/ti-admob-unified/references/library.md +189 -0
  21. package/skills/ti-admob-unified/references/mediation.md +132 -0
  22. package/skills/ti-admob-unified/references/migration.md +255 -0
  23. package/skills/ti-admob-unified/references/module-changelog.md +54 -0
  24. package/skills/ti-admob-unified/references/module-license.txt +21 -0
  25. package/skills/ti-admob-unified/references/privacy.md +254 -0
  26. package/skills/ti-admob-unified/references/roadmap.md +146 -0
  27. package/skills/ti-admob-unified/references/source-notes.md +33 -0
  28. package/skills/ti-admob-unified/references/source-snapshot.json +440 -0
  29. package/skills/ti-admob-unified/references/third-party-notices.md +22 -0
  30. package/skills/ti-game/SKILL.md +10 -1
  31. package/skills/ti-game/references/api.md +10 -2
  32. package/skills/ti-game/references/debugging-performance.md +6 -0
  33. package/skills/ti-game/references/examples.md +11 -1
  34. package/skills/ti-game/references/patterns.md +24 -2
  35. package/skills/ti-game/references/physics.md +502 -0
  36. package/skills/ti-game/references/project-setup.md +23 -1
  37. package/skills/ti-game/references/recipes-action.md +46 -14
  38. package/skills/ti-game/references/recipes-adventure-effects.md +12 -1
  39. package/skills/ti-game/references/roadmap.md +2 -2
  40. package/skills/ti-game/references/tilemaps.md +2 -1
  41. package/skills/ti-game-assets/SKILL.md +53 -0
  42. package/skills/ti-game-assets/agents/openai.yaml +4 -0
  43. package/skills/ti-game-assets/references/alpha.md +26 -0
  44. package/skills/ti-game-assets/references/art-direction.md +37 -0
  45. package/skills/ti-game-assets/references/integration.md +49 -0
  46. package/skills/ti-game-assets/references/manifest.example.json +429 -0
  47. package/skills/ti-game-assets/references/manifest.md +39 -0
  48. package/skills/ti-game-assets/references/offline-audio.md +33 -0
  49. package/skills/ti-game-assets/references/prompts.md +33 -0
  50. package/skills/ti-game-assets/references/repeating-textures.md +17 -0
  51. package/skills/ti-game-assets/references/responsible-ads.md +31 -0
  52. package/skills/ti-game-assets/references/sound-assets.md +42 -0
  53. package/skills/ti-game-assets/references/vector-sources.md +21 -0
  54. package/skills/ti-game-assets/scripts/alpha_tools.py +160 -0
  55. package/skills/ti-game-assets/scripts/requirements.txt +1 -0
  56. package/skills/ti-game-assets/scripts/validate_manifest.py +267 -0
  57. package/skills/ti-synthengine/SKILL.md +37 -13
  58. package/skills/ti-synthengine/references/api.md +397 -31
  59. package/skills/ti-synthengine/references/audio-engine.md +235 -14
  60. package/skills/ti-synthengine/references/examples.md +396 -17
  61. package/skills/ti-synthengine/references/guide.md +331 -12
  62. package/skills/ti-synthengine/references/recipes.md +212 -22
  63. package/skills/ti-synthengine/references/recommendations.md +53 -16
  64. package/skills/ti-synthengine/references/sound-design.md +359 -15
  65. package/skills/ti-synthengine/references/source-notes.md +121 -0
  66. package/skills/ti-synthengine/references/source-snapshot.json +105 -0
  67. package/skills/ti-synthengine/references/stats-performance.json +2992 -0
  68. package/skills/ti-synthengine/references/stats-performance.md +38 -0
  69. package/skills/ti-synthengine/references/troubleshooting.md +61 -4
@@ -0,0 +1,440 @@
1
+ {
2
+ "module": "ti.admob.unified",
3
+ "version": "1.0.0",
4
+ "release_status": "first public release under preparation",
5
+ "repository": "macCesar/ti.admob.unified",
6
+ "commit": "5b4cbf9347a51c4f959dc262ac1500f82f28b4a0",
7
+ "copied": "2026-10-11",
8
+ "files": [
9
+ {
10
+ "source": "documentation/fullscreen.md",
11
+ "destination": "references/fullscreen.md",
12
+ "source_sha256": "61e21798b234ff1f06d59d0239c62e3f422a424ebc2ff70e5839d203fa4c85b7",
13
+ "mirrored_sha256": "8c3defb078bc7115475f1389ee02d8d855164de16287afa4156842fa69e344af",
14
+ "links": [
15
+ {
16
+ "original": "../example/app.js",
17
+ "mirrored": "../assets/example/app.js"
18
+ }
19
+ ]
20
+ },
21
+ {
22
+ "source": "documentation/mediation.md",
23
+ "destination": "references/mediation.md",
24
+ "source_sha256": "59ede67bf9389b3b98a45a4eb24b59395a98631b0cb47d1cd24357d35f85d57e",
25
+ "mirrored_sha256": "3f6623d6178a437249542d191ecc6c5d6e22ae51db78713c41236b6ed637c938",
26
+ "links": [
27
+ {
28
+ "original": "../DEPENDENCIES.md",
29
+ "mirrored": "dependencies.md"
30
+ },
31
+ {
32
+ "original": "api-reference.md#automatic-adapter-discovery",
33
+ "mirrored": "api-reference.md#automatic-adapter-discovery"
34
+ },
35
+ {
36
+ "original": "api-reference.md#mediation-diagnostics",
37
+ "mirrored": "api-reference.md#mediation-diagnostics"
38
+ },
39
+ {
40
+ "original": "../CONTRIBUTING.md#adding-a-network",
41
+ "mirrored": "contributing.md#adding-a-network"
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "source": "documentation/integration.md",
47
+ "destination": "references/integration.md",
48
+ "source_sha256": "47b247dff23ca909b4b8cb598e31571d7ed419feb4b63d59a0d662950d265fa5",
49
+ "mirrored_sha256": "d63800df29b1857552456e1c73ea7de83aed2596b7704c953be9864ba83fb2ff",
50
+ "links": [
51
+ {
52
+ "original": "../example/lib/ads.js",
53
+ "mirrored": "../assets/example/lib/ads.js"
54
+ },
55
+ {
56
+ "original": "library.md",
57
+ "mirrored": "library.md"
58
+ },
59
+ {
60
+ "original": "../example/library-usage.js",
61
+ "mirrored": "../assets/example/library-usage.js"
62
+ },
63
+ {
64
+ "original": "banners.md#reserve-real-layout-space",
65
+ "mirrored": "banners.md#reserve-real-layout-space"
66
+ },
67
+ {
68
+ "original": "../example/app.js",
69
+ "mirrored": "../assets/example/app.js"
70
+ },
71
+ {
72
+ "original": "library.md",
73
+ "mirrored": "library.md"
74
+ },
75
+ {
76
+ "original": "banners.md",
77
+ "mirrored": "banners.md"
78
+ },
79
+ {
80
+ "original": "fullscreen.md",
81
+ "mirrored": "fullscreen.md"
82
+ },
83
+ {
84
+ "original": "privacy.md",
85
+ "mirrored": "privacy.md"
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ "source": "documentation/third-party-notices.md",
91
+ "destination": "references/third-party-notices.md",
92
+ "source_sha256": "b203d99e49312a0450db497a0b54dae9fb1f705a27ba18f71fbaf76e46d830cd",
93
+ "mirrored_sha256": "93c74402995ac911bc96cac3453ca39f1c262653ef4e7d8ebccefe4c3630bbad",
94
+ "links": [
95
+ {
96
+ "original": "../DEPENDENCIES.md",
97
+ "mirrored": "dependencies.md"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "source": "documentation/privacy.md",
103
+ "destination": "references/privacy.md",
104
+ "source_sha256": "25adc561cf4b1b2b0ae2c25c3373b9a7eae6b429ecdee1a7d4968e3021255d37",
105
+ "mirrored_sha256": "68ec23fc532865910ec2e6cb801b33f9afb788eac7c3dc5e1e230ad245a1ad03",
106
+ "links": [
107
+ {
108
+ "original": "getting-started.md#optional-if-the-application-requests-att",
109
+ "mirrored": "getting-started.md#optional-if-the-application-requests-att"
110
+ },
111
+ {
112
+ "original": "getting-started.md#ios",
113
+ "mirrored": "getting-started.md#ios"
114
+ }
115
+ ]
116
+ },
117
+ {
118
+ "source": "documentation/migration.md",
119
+ "destination": "references/migration.md",
120
+ "source_sha256": "85c6e3b897c4ac7f7cfb4f2a4fc61936f2e43a81de620a6c89fed670157877b3",
121
+ "mirrored_sha256": "028890977867cecef1f6c8a67b526bece5919200d061cabca61f0f12f9b8eb12",
122
+ "links": [
123
+ {
124
+ "original": "mediation.md",
125
+ "mirrored": "mediation.md"
126
+ },
127
+ {
128
+ "original": "banners.md#creation-properties-1",
129
+ "mirrored": "banners.md#creation-properties-1"
130
+ },
131
+ {
132
+ "original": "getting-started.md",
133
+ "mirrored": "getting-started.md"
134
+ },
135
+ {
136
+ "original": "banners.md#who-pauses-a-banner",
137
+ "mirrored": "banners.md#who-pauses-a-banner"
138
+ },
139
+ {
140
+ "original": "fullscreen.md#the-four-hour-window",
141
+ "mirrored": "fullscreen.md#the-four-hour-window"
142
+ },
143
+ {
144
+ "original": "api-reference.md#automatic-adapter-discovery",
145
+ "mirrored": "api-reference.md#automatic-adapter-discovery"
146
+ }
147
+ ]
148
+ },
149
+ {
150
+ "source": "documentation/getting-started.md",
151
+ "destination": "references/getting-started.md",
152
+ "source_sha256": "82e606a8807a75985f8371876650f6499028e2b4452f28f525cd9edced2f0a7d",
153
+ "mirrored_sha256": "a1784814b78d17d3c6a928f0aed34cadccc100cf6ce57b9e05b309745ecac652",
154
+ "links": [
155
+ {
156
+ "original": "mediation.md",
157
+ "mirrored": "mediation.md"
158
+ },
159
+ {
160
+ "original": "migration.md",
161
+ "mirrored": "migration.md"
162
+ },
163
+ {
164
+ "original": "mediation.md",
165
+ "mirrored": "mediation.md"
166
+ },
167
+ {
168
+ "original": "api-reference.md#automatic-adapter-discovery",
169
+ "mirrored": "api-reference.md#automatic-adapter-discovery"
170
+ },
171
+ {
172
+ "original": "privacy.md",
173
+ "mirrored": "privacy.md"
174
+ },
175
+ {
176
+ "original": "api-reference.md#reserved-and-unavailable-apis",
177
+ "mirrored": "api-reference.md#reserved-and-unavailable-apis"
178
+ },
179
+ {
180
+ "original": "banners.md",
181
+ "mirrored": "banners.md"
182
+ }
183
+ ]
184
+ },
185
+ {
186
+ "source": "documentation/library.md",
187
+ "destination": "references/library.md",
188
+ "source_sha256": "0da03f4b91912045737da2a8992679c7a1503f5085abc9d7495817ae54e68021",
189
+ "mirrored_sha256": "40568c25adc6e5cf7a27ad0305205dfc6847c7c6039eae095bf102f6b8688873",
190
+ "links": [
191
+ {
192
+ "original": "../example/lib/ads.js",
193
+ "mirrored": "../assets/example/lib/ads.js"
194
+ },
195
+ {
196
+ "original": "../example/app.js",
197
+ "mirrored": "../assets/example/app.js"
198
+ },
199
+ {
200
+ "original": "../example/library-usage.js",
201
+ "mirrored": "../assets/example/library-usage.js"
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "source": "documentation/index.md",
207
+ "destination": "references/index.md",
208
+ "source_sha256": "358dbe96a4f5ff49179b05bed5a1a28a2c13b0c698663a6f8fba6b858a55ffaf",
209
+ "mirrored_sha256": "1f07d92cfc885074bedfea0bfc8164df4dbb1091ecf4193ee733162b3a60e2ab",
210
+ "links": [
211
+ {
212
+ "original": "getting-started.md",
213
+ "mirrored": "getting-started.md"
214
+ },
215
+ {
216
+ "original": "integration.md",
217
+ "mirrored": "integration.md"
218
+ },
219
+ {
220
+ "original": "library.md",
221
+ "mirrored": "library.md"
222
+ },
223
+ {
224
+ "original": "privacy.md",
225
+ "mirrored": "privacy.md"
226
+ },
227
+ {
228
+ "original": "mediation.md",
229
+ "mirrored": "mediation.md"
230
+ },
231
+ {
232
+ "original": "banners.md",
233
+ "mirrored": "banners.md"
234
+ },
235
+ {
236
+ "original": "fullscreen.md",
237
+ "mirrored": "fullscreen.md"
238
+ },
239
+ {
240
+ "original": "api-reference.md",
241
+ "mirrored": "api-reference.md"
242
+ },
243
+ {
244
+ "original": "migration.md",
245
+ "mirrored": "migration.md"
246
+ },
247
+ {
248
+ "original": "third-party-notices.md",
249
+ "mirrored": "third-party-notices.md"
250
+ },
251
+ {
252
+ "original": "../CONTRIBUTING.md#adding-a-network",
253
+ "mirrored": "contributing.md#adding-a-network"
254
+ },
255
+ {
256
+ "original": "../DEPENDENCIES.md",
257
+ "mirrored": "dependencies.md"
258
+ },
259
+ {
260
+ "original": "../CHANGELOG.md",
261
+ "mirrored": "module-changelog.md"
262
+ },
263
+ {
264
+ "original": "../ROADMAP.md",
265
+ "mirrored": "roadmap.md"
266
+ },
267
+ {
268
+ "original": "../CONTRIBUTING.md",
269
+ "mirrored": "contributing.md"
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ "source": "documentation/banners.md",
275
+ "destination": "references/banners.md",
276
+ "source_sha256": "6503b64e3adca882c099710c9df7d3f03ce6ff21cf98e54c199e3f9020581990",
277
+ "mirrored_sha256": "aaf1cc653f9c4d6085e21e88496259b7b3e4abfcd8ba9aa39a5f25cfc6c1db26",
278
+ "links": []
279
+ },
280
+ {
281
+ "source": "documentation/api-reference.md",
282
+ "destination": "references/api-reference.md",
283
+ "source_sha256": "e1e0e51562f18cca354d58ca0dffeb32830b07fea0f4cafecd356eca832b8ab7",
284
+ "mirrored_sha256": "d1fec104a8f8ffb153c0fbcc9e405c224145f0dd439a5d9caa4ac78ad64064fa",
285
+ "links": [
286
+ {
287
+ "original": "mediation.md#missing-configuration-and-startup-errors",
288
+ "mirrored": "mediation.md#missing-configuration-and-startup-errors"
289
+ },
290
+ {
291
+ "original": "banners.md#creation-properties-1",
292
+ "mirrored": "banners.md#creation-properties-1"
293
+ },
294
+ {
295
+ "original": "banners.md#creation-properties",
296
+ "mirrored": "banners.md#creation-properties"
297
+ },
298
+ {
299
+ "original": "fullscreen.md#the-four-hour-window",
300
+ "mirrored": "fullscreen.md#the-four-hour-window"
301
+ },
302
+ {
303
+ "original": "fullscreen.md",
304
+ "mirrored": "fullscreen.md"
305
+ },
306
+ {
307
+ "original": "banners.md#who-pauses-a-banner",
308
+ "mirrored": "banners.md#who-pauses-a-banner"
309
+ },
310
+ {
311
+ "original": "banners.md#creation-properties",
312
+ "mirrored": "banners.md#creation-properties"
313
+ },
314
+ {
315
+ "original": "fullscreen.md#events",
316
+ "mirrored": "fullscreen.md#events"
317
+ },
318
+ {
319
+ "original": "mediation.md",
320
+ "mirrored": "mediation.md"
321
+ },
322
+ {
323
+ "original": "migration.md#generic-mediation-diagnostics",
324
+ "mirrored": "migration.md#generic-mediation-diagnostics"
325
+ }
326
+ ],
327
+ "link_fixes": [
328
+ {
329
+ "original_markdown": "[Mediation diagnostics and compatibility](#mediation-diagnostics-and-compatibility)",
330
+ "mirrored_markdown": "[Mediation diagnostics and compatibility](#mediation-diagnostics)",
331
+ "reason": "Official document references a removed heading; target its existing Mediation diagnostics section. Original source is unchanged."
332
+ }
333
+ ]
334
+ },
335
+ {
336
+ "source": "DEPENDENCIES.md",
337
+ "destination": "references/dependencies.md",
338
+ "source_sha256": "345106277d89646fa2f79026d28fcef39c2c97701f0190141efdfaaf2cc988be",
339
+ "mirrored_sha256": "131c1a1042905893ef122ef6b44acfeba701177d42377061c60f827a686336fc",
340
+ "links": [
341
+ {
342
+ "original": "documentation/mediation.md#unity-consent-with-the-pinned-adapter",
343
+ "mirrored": "mediation.md#unity-consent-with-the-pinned-adapter"
344
+ }
345
+ ]
346
+ },
347
+ {
348
+ "source": "ROADMAP.md",
349
+ "destination": "references/roadmap.md",
350
+ "source_sha256": "e51337b46621f513bd0e7ece60604cb52b05137dce4a30e15474babb8ac2b3be",
351
+ "mirrored_sha256": "8d214f8b74201a1f60fa92df039eb8af88926159e2f26e946252eadd1afb214e",
352
+ "links": [
353
+ {
354
+ "original": "DEPENDENCIES.md#transitive-security-review",
355
+ "mirrored": "dependencies.md#transitive-security-review"
356
+ }
357
+ ]
358
+ },
359
+ {
360
+ "source": "CONTRIBUTING.md",
361
+ "destination": "references/contributing.md",
362
+ "source_sha256": "836799de6a281aec867f9df34a520963db337733caf33e7ea0bc314365bd5c6b",
363
+ "mirrored_sha256": "4cfb401b52a0de14fd72b040ff88c64d1be7fdba27e56c1ec1fcd9008cae8ae9",
364
+ "links": [
365
+ {
366
+ "original": "DEPENDENCIES.md",
367
+ "mirrored": "dependencies.md"
368
+ },
369
+ {
370
+ "original": "DEPENDENCIES.md",
371
+ "mirrored": "dependencies.md"
372
+ },
373
+ {
374
+ "original": "documentation/getting-started.md",
375
+ "mirrored": "getting-started.md"
376
+ },
377
+ {
378
+ "original": "documentation/privacy.md",
379
+ "mirrored": "privacy.md"
380
+ },
381
+ {
382
+ "original": "documentation/banners.md",
383
+ "mirrored": "banners.md"
384
+ },
385
+ {
386
+ "original": "LICENSE",
387
+ "mirrored": "module-license.txt"
388
+ }
389
+ ]
390
+ },
391
+ {
392
+ "source": "CHANGELOG.md",
393
+ "destination": "references/module-changelog.md",
394
+ "source_sha256": "206836587f356a152b6f9b3dbc3ecafdc47d006dc04ef9272be22fb61e1730a7",
395
+ "mirrored_sha256": "d7c53654b8b4c3166a8c86ed6a9d20d141692dbdfcd9ffacde4887367588adfa",
396
+ "links": [
397
+ {
398
+ "original": "DEPENDENCIES.md",
399
+ "mirrored": "dependencies.md"
400
+ },
401
+ {
402
+ "original": "DEPENDENCIES.md",
403
+ "mirrored": "dependencies.md"
404
+ },
405
+ {
406
+ "original": "documentation/mediation.md#release-validation",
407
+ "mirrored": "mediation.md#release-validation"
408
+ }
409
+ ]
410
+ },
411
+ {
412
+ "source": "LICENSE",
413
+ "destination": "references/module-license.txt",
414
+ "source_sha256": "4f0914a1e3dba2ee340a000feddd0700eb1977923090d77c0fa32e2a47830823",
415
+ "mirrored_sha256": "4f0914a1e3dba2ee340a000feddd0700eb1977923090d77c0fa32e2a47830823",
416
+ "links": []
417
+ },
418
+ {
419
+ "source": "example/lib/ads.js",
420
+ "destination": "assets/example/lib/ads.js",
421
+ "source_sha256": "7103fd5406a6fdae2652fdb75d6e76bbe8e1f820183d8caafcdacbb38c939567",
422
+ "mirrored_sha256": "7103fd5406a6fdae2652fdb75d6e76bbe8e1f820183d8caafcdacbb38c939567",
423
+ "links": []
424
+ },
425
+ {
426
+ "source": "example/library-usage.js",
427
+ "destination": "assets/example/library-usage.js",
428
+ "source_sha256": "1dc8f385dda582cfadcd0f77edc24681214ac7b066909d5d9d1599c923eece24",
429
+ "mirrored_sha256": "1dc8f385dda582cfadcd0f77edc24681214ac7b066909d5d9d1599c923eece24",
430
+ "links": []
431
+ },
432
+ {
433
+ "source": "example/app.js",
434
+ "destination": "assets/example/app.js",
435
+ "source_sha256": "ba0bfcb76dcc727e9f1785a3980ec0df3bdd4f62fceba6efb1938295ba2d2ab5",
436
+ "mirrored_sha256": "ba0bfcb76dcc727e9f1785a3980ec0df3bdd4f62fceba6efb1938295ba2d2ab5",
437
+ "links": []
438
+ }
439
+ ]
440
+ }
@@ -0,0 +1,22 @@
1
+ > Source snapshot: official ti.admob.unified 1.0.0 documentation at commit `5b4cbf9` (copied 2026-10-11). Relative links rebased for this skill.
2
+
3
+ # Third-party SDK notices
4
+
5
+ `ti.admob.unified` and the `ti.admob.unified.mediation.<network>` complements use the MIT license. The distributed advertising SDKs and adapters have their own licenses, terms, privacy policies and publisher agreements.
6
+
7
+ The core `ti.admob.unified` includes Google Mobile Ads and UMP. Each optional network module includes its network SDK and Google adapter, so applications distribute only selected dependencies. Unity includes UnityCoherenceLib; ironSource advertising is deferred.
8
+
9
+ | Component | Owner | Terms or license |
10
+ | ----------------------------------------------------- | -------------------------- | ------------------------------------------------------------------- |
11
+ | Google Mobile Ads, UMP, and Google mediation adapters | Google LLC | [Google APIs Terms of Service](https://developers.google.com/terms) |
12
+ | AppLovin SDK | AppLovin Corp. | [AppLovin Terms](https://www.applovin.com/terms/) |
13
+ | Meta Audience Network SDK | Meta Platforms, Inc. | [Meta Platform Terms](https://developers.facebook.com/terms/) |
14
+ | InMobi SDK | InMobi Technology Services | [InMobi publisher terms](https://www.inmobi.com/terms-of-service/) |
15
+ | Unity Ads and Unity support libraries | Unity Technologies | [Unity Terms of Service](https://unity.com/legal/terms-of-service) |
16
+ | Liftoff Monetize/Vungle SDK | Liftoff Mobile, Inc. | [Liftoff Monetize terms](https://publisher.vungle.com/LICENSE.html) |
17
+
18
+ The exact versions are recorded in [the dependency inventory](dependencies.md). Maintainers must review the upstream terms whenever a native SDK is added or updated. Application publishers must also accept and comply with the terms of every network they enable in AdMob.
19
+
20
+ Android also distributes Guava as a utility dependency. Guava uses the [Apache License 2.0](https://github.com/google/guava/blob/master/LICENSE) and is not an advertising SDK.
21
+
22
+ The InMobi and Liftoff Android complements also pin OkHttp 4.12.0. OkHttp and its Okio dependency use the Apache License 2.0; preserve their distributed license notices. See [OkHttp](https://github.com/lysine-dev/okhttp/blob/master/LICENSE.txt) and [Okio](https://github.com/lysine-dev/okio/blob/main/LICENSE.txt).
@@ -12,6 +12,12 @@ This skill is verified against upstream `main` at **`3bea2f4` (2026-09-02)**. Bo
12
12
 
13
13
  The skill applies to **Classic and Alloy** projects. Nothing here requires PurgeTSS.
14
14
 
15
+ ## Visual and sound asset collaboration
16
+
17
+ Use `ti-game-assets` to create/edit complete visual and sound asset sets, preserve art/acoustic palettes and provenance, validate alpha/frames/manifests, prepare exports, and coordinate variants and stereo event placement. `ti-game` governs native representation/motion/events; `ti-synthengine` governs synthesis and sound behavior with `ti.synthengine`. Both have equal domain authority. Read their relevant current references rather than duplicating manuals. Art alone does not require installing modules or adding sounds/mechanics.
18
+
19
+ For requested advertising or existing `ti.admob.unified`, use `ti-admob-unified` for the official module/privacy/provider contract and deliberate game-ad boundaries. Preserve native clock, inputs and audio ownership; graphics work alone does not authorize monetization.
20
+
15
21
  ## Required workflow
16
22
 
17
23
  Open the references relevant to the task before proposing code. Do not answer from familiarity with Phaser, Godot, Box2D, or an older `ti.game` build.
@@ -21,6 +27,7 @@ Open the references relevant to the task before proposing code. Do not answer fr
21
27
  | Exact methods, properties, defaults, event payloads, percentages | [references/api.md](references/api.md) |
22
28
  | Install, Classic/Alloy structure, assets, cleanup, lifecycle | [references/project-setup.md](references/project-setup.md) |
23
29
  | Choose a runnable upstream example | [references/examples.md](references/examples.md) |
30
+ | Choose or tune a physical model, derive equations/units, diagnose FPS-dependent motion | [references/physics.md](references/physics.md) |
24
31
  | Reusable level, pooling, HUD, collision, path, timer patterns | [references/patterns.md](references/patterns.md) |
25
32
  | Platformer, racer, shooter, runner, rhythm, ball-game recipes | [references/recipes-action.md](references/recipes-action.md) |
26
33
  | Cards, point-and-click, particles, ropes, camera, effects | [references/recipes-adventure-effects.md](references/recipes-adventure-effects.md) |
@@ -127,7 +134,9 @@ When sources disagree, use this order:
127
134
  3. Upstream `README.md` and `TUTORIAL.md` for intended public usage.
128
135
  4. Upstream `TODO.md` for what remains partial or absent.
129
136
 
130
- The prose drift recorded at the previous pin is gone: upstream now states 34 demos (correct), names the HUD corners correctly, and documents `legend`, `firstGid`, `cols` and `rows` as creation-time on Android. What remains uncovered by any demo is `wallSlideSpeed` and the `onWallLeft`/`onWallRight` flags — `wallhit` itself is now exercised by `worldwrap.js` — so that part of the contract still comes from the README and both native implementations.
137
+ Rechecked upstream HEAD on 2026-10-12: it remains `3bea2f4`. The catalog contains 34 demos. Examples establish intended API combinations; source inspection does not certify an installed binary or hardware behavior. Keep local fork changes separate from that upstream pin.
138
+
139
+ Known source-level traps are collected in [references/physics.md](references/physics.md): thrust can be erased by the damping rest threshold, rope damping is per update and zero-delta rope updates are not a guaranteed freeze, and Rhythm's 400 ms subdivision comment is wrong at its stated 150 BPM. The wall-slide flags still have no demo; their contract comes from the README and both native implementations. Classify a wrong demo comment separately from a reproduced native-engine defect before proposing an upstream change.
131
140
 
132
141
  ## Before returning code
133
142
 
@@ -102,7 +102,7 @@ A normal Titanium view — add it to a window or any container, size it with the
102
102
  | `pause()` / `resume()` | method | — | Render loop control. The activity/app lifecycle already pauses and resumes automatically |
103
103
  | `backgroundColor` | string | — | GL clear color |
104
104
  | `maxFps` | int | `0` | Frame cap. `60` stops 120 Hz ProMotion displays from doubling render work; `0` = display refresh rate |
105
- | `timeScale` | float | `1` | Global multiplier for everything the engine ticks: physics, sheet animations, tweens, particles, camera. `0.5` = slow motion, `0` freezes the scene while rendering and touch keep running (pause menus, hit-stop) |
105
+ | `timeScale` | float | `1` | Multiplies the scene dt for physics, sheet animations, tweens, particles and camera. `0.5` = slow motion; at `0` rendering/touch continue. Rope's previous-displacement integration still runs at zero dt in the pinned source, so complete rope freeze is not guaranteed; see [physics.md](physics.md#verlet-ropes-and-tethers) |
106
106
  | `surfaceWidth` / `surfaceHeight` | int | — | Read-only surface size in pixels |
107
107
  | `cameraX` / `cameraY` | float | `0` | World-space offset of the view |
108
108
  | `cameraScale` | float | `1` | Zoom, anchored on the view center |
@@ -192,6 +192,10 @@ On Android the buttons are captured at the activity window: the game view needs
192
192
 
193
193
  `platformer.js` runs on either the on-screen buttons or a pad.
194
194
 
195
+ That single-view example does not establish independent receivers for several
196
+ retained iOS GameViews: the pinned controller adapter overwrites a shared
197
+ GCController callback. See [lifecycle and input ownership](project-setup.md#retained-ios-scenes-and-multiple-gameviews).
198
+
195
199
  ## SpriteSheet
196
200
 
197
201
  Create one sheet per texture and share it across every sprite that uses it — sprites sharing a sheet batch into a single draw call.
@@ -271,7 +275,7 @@ Hit-testing runs against the transformed shape (rotation and scale included), to
271
275
  | `velocityX`, `velocityY` | `0` | px/s |
272
276
  | `gravity` | `0` | px/s², added to `velocityY`. Per sprite — there is no global gravity |
273
277
  | `gravityX` | `0` | px/s², added to `velocityX`. The **sibling** of `gravity`, not half of a vector: `gravity` keeps its exact vertical meaning. Wind, a conveyor, or a top-down game whose "down" is sideways (`gravity: 0`, `gravityX` non-zero). Since 2026-08-27 |
274
- | `linearDamping` | `0` | Fraction of speed shed per second, applied to both velocity axes before the position integration — rolling friction for ordinary sprites, which `drag` never was (that one only runs inside `carMode`). ~`0.6` is a pool ball on felt. Proportional, so a fast body sheds a lot and a slow one very little; below **4 px/s** the engine zeroes both axes outright, because a proportion never reaches zero on its own. Negative values are clamped to 0. Since 2026-08-27 |
278
+ | `linearDamping` | `0` | Coefficient in 1/s: each step retains `max(0, 1−linearDamping·dt)` of both velocity axes, after thrust/gravity and before position. Below combined speed **4 px/s** it zeroes both axes; this can erase a small first thrust step. ~`0.6` is used for pool felt, but damping acts even without contact. Negative values clamp to0. See [physics.md](physics.md#thrust-inertia-and-linear-damping) |
275
279
  | `maxSpeed` | `500` | px/s cap applied **only** to `thrust` acceleration and the `carMode` model. Writing `velocityX`/`velocityY` directly is never clamped |
276
280
  | `angularVelocity` | `0` | deg/s |
277
281
  | `thrust` | `0` | px/s² along the current heading (Newtonian flight) |
@@ -573,6 +577,10 @@ A native Verlet chain: integration and distance constraints run in the game loop
573
577
  | `visible` | `true` | |
574
578
  | `endX`, `endY` | — | Read-only live position of the loose end (grappling-hook tips) |
575
579
 
580
+ Per-step retention is not a per-second rate. Rope's existing displacement and
581
+ constraint passes still execute at `dt=0` in the pinned implementation;
582
+ see [Verlet equations and pause limits](physics.md#verlet-ropes-and-tethers).
583
+
576
584
  The tether yields at the end no finger owns: with a fixed head anchor the tail sprite is simply leashed, but with sprites on both ends you can drag either one and the other is towed once the rope goes taut.
577
585
 
578
586
  ## TileLayer
@@ -94,6 +94,12 @@ Telemetry is opt-in inside the renderers. With the HUD disabled and no `performa
94
94
 
95
95
  ## Common diagnostic order
96
96
 
97
+ For a physics discrepancy, record the installed build/commit, surface size,
98
+ `timeScale`, input values and actual FPS first. `maxFps` is a cap, not a fixed
99
+ physics step. A visible thruster proves an animation state, not acceleration.
100
+ The damping rest threshold can erase a small first thrust step, and Rope uses
101
+ per-update damping. See [physics.md](physics.md#time-step-and-frame-rate).
102
+
97
103
  1. Confirm the object was added and is visible/in bounds.
98
104
  2. Turn on the relevant sprite/layer debug shape, then the global overlay if relationships are unclear.
99
105
  3. Verify `collisionGroup` is on the target and `solidWith`/`collidesWith` on the mover.
@@ -2,7 +2,17 @@
2
2
 
3
3
  Verified against all 34 self-contained demos under `ti.game@3bea2f4:example/`, plus the launcher `example/app.js` and the shared back-control helper `example/backnav.js` (neither is a demo). `wallhit` now has one user — `worldwrap.js` counts bolt hits with it — but `wallSlideSpeed` and the `onWallLeft`/`onWallRight` flags still have no demo; for those use [the platformer recipe](recipes-action.md#platformer), verified against both native implementations and the README contract.
4
4
 
5
- The demos prove that API combinations run together on the current module. They are **not** production templates: most keep state in one file, repeat launcher/back-button plumbing, and still use pre-ES6 syntax. Start from the closest demo, retain the demonstrated engine calls, then apply the focused structure and cleanup patterns in this skill.
5
+ The demos show intended API combinations; reading them does not verify an
6
+ installed module or device. They are **not** production templates: most keep
7
+ state in one file, repeat launcher/back-button plumbing, and still use pre-ES6
8
+ syntax. Start from the closest demo, retain the demonstrated engine calls,
9
+ then apply the focused structure and cleanup patterns in this skill.
10
+
11
+ For equations, units, genre selection and frame-rate limits, use
12
+ [physics.md](physics.md). Rhythm's 400 ms interval is a quarter note at its
13
+ stated 150 BPM, despite the upstream "eighth" comments. Flappy replaces
14
+ vertical velocity per tap; it does not add repeated impulses. The curated
15
+ Lunar Lander recipe is not an additional upstream demo.
6
16
 
7
17
  | Demo | What it proves | Production-oriented reference |
8
18
  | --- | --- | --- |
@@ -206,7 +206,17 @@ Slower layers read as further away. Three layers (clouds at 0.15×, hills at 0.4
206
206
 
207
207
  ### Multitouch on-screen controls
208
208
 
209
- Each button must be **its own Titanium view** — sibling views receive simultaneous pointers, so holding a direction while pressing jump works. A single container splitting touches itself does not.
209
+ Use separate sibling input targets for held directions and actions. Their
210
+ native control type also matters for simultaneous touch; the factory below
211
+ uses Label rather than UIButton-backed controls.
212
+
213
+ The factory below deliberately uses Label. In Titanium SDK13.4.1.GA on iOS,
214
+ TiUIButton sets its internal UIButton's `exclusiveTouch=YES`; changing the
215
+ outer view's multitouch flag does not remove that exclusivity. Keep held
216
+ flight controls as sibling Label/View targets or native game sprites and
217
+ verify simultaneous input on-device. See `iphone/Classes/TiUIButton.m`,
218
+ method `button`, in that SDK; this is a Titanium UI boundary, not a ti.game
219
+ physics discrepancy.
210
220
 
211
221
  ```javascript
212
222
  function makeButton(title, position, fontSize) {
@@ -487,6 +497,10 @@ Two things bite here. The sweep **ignores** anything that is not `solidMode: 'bl
487
497
 
488
498
  **`linearDamping` is the missing friction, with a caveat.** `drag` only ever worked inside `carMode`; this is the same idea for ordinary sprites, and it is what brings a pool table to rest. But nothing checks contact — it bleeds speed on both axes, in the air as much as on the felt, and along a slope as much as across it. Right for a table, wrong for a hill. Below a combined 4 px/s the engine zeroes the velocity outright, so a deliberate 3 px/s drift dies the moment that sprite also carries damping.
489
499
 
500
+ That threshold can also erase the first increment of an accelerating ship.
501
+ Read [thrust and damping](physics.md#thrust-inertia-and-linear-damping) before
502
+ using a permanent coasting brake on a powered sprite.
503
+
490
504
  **A bouncy surface is now a property of the surface.** `restitution` is read off both sides and mixed as `max`, so a springy floor rebounds riders that are not themselves bouncy:
491
505
 
492
506
  ```javascript
@@ -673,7 +687,15 @@ What still belongs in `setTimeout`: anything that must keep running while the ga
673
687
 
674
688
  ### Hit-stop on impact
675
689
 
676
- Freezing the scene for a few frames makes an impact read before the explosion starts. `timeScale = 0` stops the engine from advancing while it keeps drawing and accepting touches — no render loop to restart, no state to save. (Pattern from Titanium Lander: 140 ms on a crash, 90 ms when a shield absorbs a hit.)
690
+ Giving the scene zero dt for a few frames makes an impact read before the
691
+ explosion starts, while it keeps drawing and accepting touches. This avoids
692
+ restarting the render loop. (Pattern from Titanium Lander: 140 ms on a crash,
693
+ 90 ms when a shield absorbs a hit.)
694
+
695
+ This sets scene dt to zero, not a universal suspension of every update.
696
+ Rope's previous-displacement and constraint pass still run in the pinned
697
+ source; verify hit-stop separately for rope scenes. See
698
+ [physics.md](physics.md#verlet-ropes-and-tethers).
677
699
 
678
700
  ```javascript
679
701
  let hitStopTimer = null;