@hyprune/schema 0.7.0 → 0.9.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.
@@ -0,0 +1,2390 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://hyprune.com/schema/v0.9/world.schema.json",
4
+ "title": "Hyprune world 0.9: characters, paths, seats and keepClear; object assets from package directories and libraries; 0.8 objects otherwise",
5
+ "type": "object",
6
+ "properties": {
7
+ "formatVersion": {
8
+ "const": "0.9"
9
+ },
10
+ "id": {
11
+ "$ref": "common.schema.json#/$defs/id"
12
+ },
13
+ "version": {
14
+ "$ref": "common.schema.json#/$defs/version"
15
+ },
16
+ "name": {
17
+ "type": "string",
18
+ "minLength": 1,
19
+ "maxLength": 256
20
+ },
21
+ "description": {
22
+ "type": "string",
23
+ "minLength": 0,
24
+ "maxLength": 4096
25
+ },
26
+ "license": {
27
+ "type": "string",
28
+ "minLength": 1,
29
+ "maxLength": 256
30
+ },
31
+ "scene": {
32
+ "allOf": [
33
+ {
34
+ "$ref": "common.schema.json#/$defs/path"
35
+ },
36
+ {
37
+ "pattern": "\\.(gltf|glb)$",
38
+ "type": "string"
39
+ }
40
+ ]
41
+ },
42
+ "preview": {
43
+ "$ref": "common.schema.json#/$defs/path"
44
+ },
45
+ "defaultSpawn": {
46
+ "$ref": "common.schema.json#/$defs/slug"
47
+ },
48
+ "spawns": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object",
52
+ "properties": {
53
+ "id": {
54
+ "$ref": "common.schema.json#/$defs/slug"
55
+ },
56
+ "pose": {
57
+ "$ref": "common.schema.json#/$defs/pose"
58
+ },
59
+ "node": {
60
+ "$ref": "common.schema.json#/$defs/index"
61
+ }
62
+ },
63
+ "required": [
64
+ "id",
65
+ "pose"
66
+ ],
67
+ "additionalProperties": false
68
+ },
69
+ "minItems": 1
70
+ },
71
+ "attribution": {
72
+ "type": "array",
73
+ "items": {
74
+ "type": "object",
75
+ "properties": {
76
+ "path": {
77
+ "anyOf": [
78
+ {
79
+ "$ref": "common.schema.json#/$defs/path"
80
+ },
81
+ {
82
+ "const": "."
83
+ }
84
+ ]
85
+ },
86
+ "author": {
87
+ "type": "string",
88
+ "minLength": 1,
89
+ "maxLength": 256
90
+ },
91
+ "license": {
92
+ "type": "string",
93
+ "minLength": 1,
94
+ "maxLength": 256
95
+ },
96
+ "source": {
97
+ "type": "string",
98
+ "minLength": 1,
99
+ "maxLength": 2048,
100
+ "pattern": "^https://"
101
+ }
102
+ },
103
+ "required": [
104
+ "path",
105
+ "author",
106
+ "license"
107
+ ],
108
+ "additionalProperties": false
109
+ },
110
+ "minItems": 1
111
+ },
112
+ "zones": {
113
+ "type": "array",
114
+ "items": {
115
+ "type": "object",
116
+ "properties": {
117
+ "id": {
118
+ "$ref": "common.schema.json#/$defs/slug"
119
+ },
120
+ "name": {
121
+ "type": "string",
122
+ "minLength": 1,
123
+ "maxLength": 256
124
+ },
125
+ "bounds": {
126
+ "type": "object",
127
+ "properties": {
128
+ "min": {
129
+ "type": "array",
130
+ "items": {
131
+ "type": "number"
132
+ },
133
+ "minItems": 3,
134
+ "maxItems": 3
135
+ },
136
+ "max": {
137
+ "type": "array",
138
+ "items": {
139
+ "type": "number"
140
+ },
141
+ "minItems": 3,
142
+ "maxItems": 3
143
+ }
144
+ },
145
+ "required": [
146
+ "min",
147
+ "max"
148
+ ],
149
+ "additionalProperties": false
150
+ }
151
+ },
152
+ "required": [
153
+ "id",
154
+ "name",
155
+ "bounds"
156
+ ],
157
+ "additionalProperties": false
158
+ },
159
+ "minItems": 0
160
+ },
161
+ "anchors": {
162
+ "type": "array",
163
+ "items": {
164
+ "type": "object",
165
+ "properties": {
166
+ "id": {
167
+ "$ref": "common.schema.json#/$defs/slug"
168
+ },
169
+ "pose": {
170
+ "$ref": "common.schema.json#/$defs/pose"
171
+ },
172
+ "size": {
173
+ "type": "array",
174
+ "items": {
175
+ "type": "number",
176
+ "exclusiveMinimum": 0
177
+ },
178
+ "minItems": 2,
179
+ "maxItems": 2
180
+ },
181
+ "screenType": {
182
+ "$ref": "common.schema.json#/$defs/id"
183
+ },
184
+ "node": {
185
+ "$ref": "common.schema.json#/$defs/index"
186
+ },
187
+ "mount": {
188
+ "$ref": "common.schema.json#/$defs/mount"
189
+ }
190
+ },
191
+ "required": [
192
+ "id",
193
+ "pose",
194
+ "size",
195
+ "screenType"
196
+ ],
197
+ "additionalProperties": false
198
+ },
199
+ "minItems": 0
200
+ },
201
+ "navigation": {
202
+ "type": "object",
203
+ "properties": {
204
+ "kind": {
205
+ "const": "mesh"
206
+ },
207
+ "node": {
208
+ "$ref": "common.schema.json#/$defs/index"
209
+ },
210
+ "agentRadius": {
211
+ "type": "number",
212
+ "exclusiveMinimum": 0
213
+ },
214
+ "agentHeight": {
215
+ "type": "number",
216
+ "exclusiveMinimum": 0
217
+ }
218
+ },
219
+ "required": [
220
+ "kind",
221
+ "node",
222
+ "agentRadius",
223
+ "agentHeight"
224
+ ],
225
+ "additionalProperties": false
226
+ },
227
+ "collision": {
228
+ "type": "array",
229
+ "items": {
230
+ "type": "object",
231
+ "properties": {
232
+ "node": {
233
+ "$ref": "common.schema.json#/$defs/index"
234
+ },
235
+ "shape": {
236
+ "enum": [
237
+ "mesh",
238
+ "convex"
239
+ ]
240
+ },
241
+ "layer": {
242
+ "const": "static"
243
+ }
244
+ },
245
+ "required": [
246
+ "node",
247
+ "shape",
248
+ "layer"
249
+ ],
250
+ "additionalProperties": false
251
+ },
252
+ "minItems": 0
253
+ },
254
+ "audio": {
255
+ "type": "array",
256
+ "items": {
257
+ "type": "object",
258
+ "properties": {
259
+ "id": {
260
+ "$ref": "common.schema.json#/$defs/slug"
261
+ },
262
+ "path": {
263
+ "allOf": [
264
+ {
265
+ "$ref": "common.schema.json#/$defs/path"
266
+ },
267
+ {
268
+ "pattern": "\\.(ogg|wav)$",
269
+ "type": "string"
270
+ }
271
+ ]
272
+ },
273
+ "position": {
274
+ "type": "array",
275
+ "items": {
276
+ "type": "number"
277
+ },
278
+ "minItems": 3,
279
+ "maxItems": 3
280
+ },
281
+ "radius": {
282
+ "type": "number",
283
+ "exclusiveMinimum": 0
284
+ },
285
+ "gain": {
286
+ "type": "number",
287
+ "minimum": 0,
288
+ "maximum": 1
289
+ },
290
+ "loop": {
291
+ "type": "boolean"
292
+ }
293
+ },
294
+ "required": [
295
+ "id",
296
+ "path",
297
+ "position",
298
+ "radius",
299
+ "gain",
300
+ "loop"
301
+ ],
302
+ "additionalProperties": false
303
+ },
304
+ "minItems": 0
305
+ },
306
+ "lightmaps": {
307
+ "type": "array",
308
+ "items": {
309
+ "type": "object",
310
+ "properties": {
311
+ "material": {
312
+ "$ref": "common.schema.json#/$defs/index"
313
+ },
314
+ "texture": {
315
+ "$ref": "common.schema.json#/$defs/index"
316
+ },
317
+ "texCoord": {
318
+ "const": 1
319
+ },
320
+ "encoding": {
321
+ "enum": [
322
+ "linear",
323
+ "srgb"
324
+ ]
325
+ },
326
+ "intensity": {
327
+ "type": "number",
328
+ "minimum": 0
329
+ }
330
+ },
331
+ "required": [
332
+ "material",
333
+ "texture",
334
+ "texCoord",
335
+ "encoding",
336
+ "intensity"
337
+ ],
338
+ "additionalProperties": false
339
+ },
340
+ "minItems": 0
341
+ },
342
+ "extensions": {
343
+ "$ref": "common.schema.json#/$defs/extensions"
344
+ },
345
+ "requiredExtensions": {
346
+ "type": "array",
347
+ "items": {
348
+ "$ref": "common.schema.json#/$defs/id"
349
+ },
350
+ "minItems": 0,
351
+ "uniqueItems": true
352
+ },
353
+ "areas": {
354
+ "type": "array",
355
+ "items": {
356
+ "type": "object",
357
+ "properties": {
358
+ "id": {
359
+ "$ref": "common.schema.json#/$defs/slug"
360
+ },
361
+ "workspaceSlot": {
362
+ "type": "string",
363
+ "pattern": "^[0-9]{2,4}$"
364
+ },
365
+ "primaryAnchor": {
366
+ "$ref": "common.schema.json#/$defs/slug"
367
+ },
368
+ "toolAnchors": {
369
+ "type": "array",
370
+ "items": {
371
+ "$ref": "common.schema.json#/$defs/slug"
372
+ },
373
+ "maxItems": 128
374
+ },
375
+ "dataAnchors": {
376
+ "type": "array",
377
+ "items": {
378
+ "$ref": "common.schema.json#/$defs/slug"
379
+ },
380
+ "maxItems": 128
381
+ },
382
+ "theme": {
383
+ "type": "string",
384
+ "maxLength": 256
385
+ },
386
+ "spawnId": {
387
+ "$ref": "common.schema.json#/$defs/slug"
388
+ },
389
+ "freePlacementZones": {
390
+ "type": "array",
391
+ "items": {
392
+ "$ref": "common.schema.json#/$defs/slug"
393
+ },
394
+ "maxItems": 32
395
+ },
396
+ "playable": {
397
+ "type": "object",
398
+ "additionalProperties": false,
399
+ "anyOf": [
400
+ {
401
+ "required": [
402
+ "volumes"
403
+ ],
404
+ "properties": {
405
+ "volumes": {}
406
+ }
407
+ },
408
+ {
409
+ "required": [
410
+ "maxFlyHeight"
411
+ ],
412
+ "properties": {
413
+ "maxFlyHeight": {}
414
+ }
415
+ }
416
+ ],
417
+ "properties": {
418
+ "volumes": {
419
+ "type": "array",
420
+ "minItems": 1,
421
+ "maxItems": 8,
422
+ "items": {
423
+ "anyOf": [
424
+ {
425
+ "type": "object",
426
+ "required": [
427
+ "type",
428
+ "min",
429
+ "max"
430
+ ],
431
+ "additionalProperties": false,
432
+ "properties": {
433
+ "type": {
434
+ "const": "box"
435
+ },
436
+ "min": {
437
+ "type": "array",
438
+ "minItems": 3,
439
+ "maxItems": 3,
440
+ "items": {
441
+ "type": "number",
442
+ "minimum": -100000,
443
+ "maximum": 100000
444
+ }
445
+ },
446
+ "max": {
447
+ "type": "array",
448
+ "minItems": 3,
449
+ "maxItems": 3,
450
+ "items": {
451
+ "type": "number",
452
+ "minimum": -100000,
453
+ "maximum": 100000
454
+ }
455
+ }
456
+ }
457
+ },
458
+ {
459
+ "type": "object",
460
+ "required": [
461
+ "type",
462
+ "points"
463
+ ],
464
+ "additionalProperties": false,
465
+ "properties": {
466
+ "type": {
467
+ "const": "convex"
468
+ },
469
+ "points": {
470
+ "type": "array",
471
+ "minItems": 4,
472
+ "maxItems": 16,
473
+ "uniqueItems": true,
474
+ "items": {
475
+ "type": "array",
476
+ "minItems": 3,
477
+ "maxItems": 3,
478
+ "items": {
479
+ "type": "number",
480
+ "minimum": -100000,
481
+ "maximum": 100000
482
+ }
483
+ }
484
+ }
485
+ }
486
+ }
487
+ ]
488
+ }
489
+ },
490
+ "maxFlyHeight": {
491
+ "type": "number",
492
+ "minimum": -100000,
493
+ "maximum": 100000
494
+ }
495
+ },
496
+ "required": [
497
+ "volumes"
498
+ ]
499
+ }
500
+ },
501
+ "required": [
502
+ "id",
503
+ "workspaceSlot",
504
+ "primaryAnchor",
505
+ "toolAnchors",
506
+ "dataAnchors",
507
+ "theme"
508
+ ],
509
+ "additionalProperties": false
510
+ },
511
+ "maxItems": 32
512
+ },
513
+ "atmosphere": {
514
+ "type": "object",
515
+ "properties": {
516
+ "fog": {
517
+ "type": "object",
518
+ "properties": {
519
+ "color": {
520
+ "$ref": "common.schema.json#/$defs/vec3"
521
+ },
522
+ "density": {
523
+ "type": "number",
524
+ "minimum": 0,
525
+ "maximum": 1
526
+ },
527
+ "heightFalloff": {
528
+ "type": "number",
529
+ "minimum": 0,
530
+ "maximum": 10
531
+ },
532
+ "baseHeight": {
533
+ "type": "number",
534
+ "minimum": -10000,
535
+ "maximum": 10000
536
+ },
537
+ "excludeUnlit": {
538
+ "type": "boolean"
539
+ }
540
+ },
541
+ "required": [
542
+ "color",
543
+ "density",
544
+ "heightFalloff",
545
+ "baseHeight",
546
+ "excludeUnlit"
547
+ ],
548
+ "additionalProperties": false
549
+ },
550
+ "sky": {
551
+ "type": "object",
552
+ "properties": {
553
+ "zenith": {
554
+ "$ref": "common.schema.json#/$defs/vec3"
555
+ },
556
+ "horizon": {
557
+ "$ref": "common.schema.json#/$defs/vec3"
558
+ },
559
+ "ground": {
560
+ "$ref": "common.schema.json#/$defs/vec3"
561
+ },
562
+ "sun": {
563
+ "type": "object",
564
+ "properties": {
565
+ "direction": {
566
+ "$ref": "common.schema.json#/$defs/vec3"
567
+ },
568
+ "color": {
569
+ "$ref": "common.schema.json#/$defs/vec3"
570
+ },
571
+ "intensity": {
572
+ "type": "number",
573
+ "minimum": 0,
574
+ "maximum": 10000
575
+ },
576
+ "angularRadius": {
577
+ "type": "number",
578
+ "minimum": 0.001,
579
+ "maximum": 1
580
+ }
581
+ },
582
+ "required": [
583
+ "direction",
584
+ "color",
585
+ "intensity",
586
+ "angularRadius"
587
+ ],
588
+ "additionalProperties": false
589
+ }
590
+ },
591
+ "required": [
592
+ "zenith",
593
+ "horizon",
594
+ "ground",
595
+ "sun"
596
+ ],
597
+ "additionalProperties": false
598
+ },
599
+ "environment": {
600
+ "type": "object",
601
+ "properties": {
602
+ "faces": {
603
+ "type": "array",
604
+ "items": {
605
+ "$ref": "common.schema.json#/$defs/path"
606
+ },
607
+ "minItems": 6,
608
+ "maxItems": 6
609
+ },
610
+ "encoding": {
611
+ "enum": [
612
+ "srgb",
613
+ "linear"
614
+ ]
615
+ },
616
+ "intensity": {
617
+ "type": "number",
618
+ "minimum": 0,
619
+ "maximum": 10000
620
+ },
621
+ "rotation": {
622
+ "type": "number",
623
+ "minimum": -6.283186,
624
+ "maximum": 6.283186
625
+ },
626
+ "maxResolution": {
627
+ "type": "integer",
628
+ "minimum": 16,
629
+ "maximum": 512
630
+ }
631
+ },
632
+ "required": [
633
+ "faces",
634
+ "encoding",
635
+ "intensity",
636
+ "rotation",
637
+ "maxResolution"
638
+ ],
639
+ "additionalProperties": false
640
+ },
641
+ "exposure": {
642
+ "type": "number",
643
+ "minimum": 0.01,
644
+ "maximum": 100
645
+ },
646
+ "toneMapping": {
647
+ "enum": [
648
+ "aces",
649
+ "reinhard",
650
+ "linear"
651
+ ]
652
+ },
653
+ "bloom": {
654
+ "type": "object",
655
+ "properties": {
656
+ "strength": {
657
+ "type": "number",
658
+ "minimum": 0,
659
+ "maximum": 2
660
+ },
661
+ "threshold": {
662
+ "type": "number",
663
+ "minimum": 0,
664
+ "maximum": 100
665
+ },
666
+ "radius": {
667
+ "type": "number",
668
+ "minimum": 1,
669
+ "maximum": 8
670
+ }
671
+ },
672
+ "required": [
673
+ "strength",
674
+ "threshold",
675
+ "radius"
676
+ ],
677
+ "additionalProperties": false
678
+ },
679
+ "outline": {
680
+ "type": "object",
681
+ "properties": {
682
+ "enabled": {
683
+ "type": "boolean"
684
+ },
685
+ "colour": {
686
+ "type": "array",
687
+ "items": {
688
+ "type": "number",
689
+ "minimum": 0,
690
+ "maximum": 1
691
+ },
692
+ "minItems": 3,
693
+ "maxItems": 3
694
+ },
695
+ "widthPx": {
696
+ "type": "number",
697
+ "minimum": 1,
698
+ "maximum": 4
699
+ },
700
+ "depthThreshold": {
701
+ "type": "number",
702
+ "minimum": 0.0001,
703
+ "maximum": 1
704
+ },
705
+ "normalThreshold": {
706
+ "type": "number",
707
+ "minimum": 0.001,
708
+ "maximum": 2
709
+ }
710
+ },
711
+ "required": [
712
+ "enabled",
713
+ "colour",
714
+ "widthPx",
715
+ "depthThreshold",
716
+ "normalThreshold"
717
+ ],
718
+ "additionalProperties": false
719
+ }
720
+ },
721
+ "required": [
722
+ "fog",
723
+ "sky",
724
+ "exposure",
725
+ "toneMapping",
726
+ "bloom"
727
+ ],
728
+ "additionalProperties": false
729
+ },
730
+ "placementZones": {
731
+ "type": "array",
732
+ "items": {
733
+ "$ref": "common.schema.json#/$defs/placementZone"
734
+ },
735
+ "maxItems": 32
736
+ },
737
+ "dataObjects": {
738
+ "type": "array",
739
+ "maxItems": 128,
740
+ "items": {
741
+ "$ref": "common.schema.json#/$defs/dataObject"
742
+ }
743
+ },
744
+ "climbables": {
745
+ "type": "array",
746
+ "maxItems": 128,
747
+ "items": {
748
+ "type": "object",
749
+ "properties": {
750
+ "id": {
751
+ "$ref": "common.schema.json#/$defs/slug"
752
+ },
753
+ "type": {
754
+ "enum": [
755
+ "ladder",
756
+ "rope",
757
+ "vines",
758
+ "chain-link"
759
+ ]
760
+ },
761
+ "bottom": {
762
+ "type": "array",
763
+ "items": {
764
+ "type": "number",
765
+ "minimum": -10000,
766
+ "maximum": 10000
767
+ },
768
+ "minItems": 3,
769
+ "maxItems": 3
770
+ },
771
+ "top": {
772
+ "type": "array",
773
+ "items": {
774
+ "type": "number",
775
+ "minimum": -10000,
776
+ "maximum": 10000
777
+ },
778
+ "minItems": 3,
779
+ "maxItems": 3
780
+ },
781
+ "facing": {
782
+ "type": "array",
783
+ "items": {
784
+ "type": "number",
785
+ "minimum": -10000,
786
+ "maximum": 10000
787
+ },
788
+ "minItems": 3,
789
+ "maxItems": 3
790
+ },
791
+ "width": {
792
+ "type": "number",
793
+ "minimum": 0.6,
794
+ "maximum": 32
795
+ },
796
+ "depth": {
797
+ "type": "number",
798
+ "minimum": 0.1,
799
+ "maximum": 2
800
+ },
801
+ "speed": {
802
+ "type": "number",
803
+ "minimum": 0.1,
804
+ "maximum": 8
805
+ },
806
+ "exits": {
807
+ "type": "object",
808
+ "properties": {
809
+ "top": {
810
+ "type": "array",
811
+ "items": {
812
+ "type": "number",
813
+ "minimum": -10000,
814
+ "maximum": 10000
815
+ },
816
+ "minItems": 3,
817
+ "maxItems": 3
818
+ },
819
+ "bottom": {
820
+ "type": "array",
821
+ "items": {
822
+ "type": "number",
823
+ "minimum": -10000,
824
+ "maximum": 10000
825
+ },
826
+ "minItems": 3,
827
+ "maxItems": 3
828
+ }
829
+ },
830
+ "required": [
831
+ "top",
832
+ "bottom"
833
+ ],
834
+ "additionalProperties": false
835
+ }
836
+ },
837
+ "required": [
838
+ "id",
839
+ "type",
840
+ "bottom",
841
+ "top",
842
+ "facing",
843
+ "width",
844
+ "depth",
845
+ "exits"
846
+ ],
847
+ "additionalProperties": false
848
+ }
849
+ },
850
+ "visibility": {
851
+ "type": "object",
852
+ "properties": {
853
+ "areas": {
854
+ "type": "array",
855
+ "maxItems": 256,
856
+ "items": {
857
+ "type": "object",
858
+ "properties": {
859
+ "id": {
860
+ "type": "string",
861
+ "minLength": 1,
862
+ "maxLength": 128
863
+ },
864
+ "bounds": {
865
+ "type": "object",
866
+ "properties": {
867
+ "min": {
868
+ "type": "array",
869
+ "items": {
870
+ "type": "number",
871
+ "minimum": -100000,
872
+ "maximum": 100000
873
+ },
874
+ "minItems": 3,
875
+ "maxItems": 3
876
+ },
877
+ "max": {
878
+ "type": "array",
879
+ "items": {
880
+ "type": "number",
881
+ "minimum": -100000,
882
+ "maximum": 100000
883
+ },
884
+ "minItems": 3,
885
+ "maxItems": 3
886
+ }
887
+ },
888
+ "required": [
889
+ "min",
890
+ "max"
891
+ ],
892
+ "additionalProperties": false
893
+ },
894
+ "nodes": {
895
+ "type": "array",
896
+ "items": {
897
+ "type": "integer",
898
+ "minimum": 0,
899
+ "maximum": 9999
900
+ },
901
+ "maxItems": 10000,
902
+ "uniqueItems": true
903
+ },
904
+ "visibleFrom": {
905
+ "type": "array",
906
+ "items": {
907
+ "type": "string",
908
+ "minLength": 1,
909
+ "maxLength": 128
910
+ },
911
+ "maxItems": 256,
912
+ "uniqueItems": true
913
+ }
914
+ },
915
+ "required": [
916
+ "id",
917
+ "bounds",
918
+ "nodes",
919
+ "visibleFrom"
920
+ ],
921
+ "additionalProperties": false
922
+ }
923
+ }
924
+ },
925
+ "required": [
926
+ "areas"
927
+ ],
928
+ "additionalProperties": false
929
+ },
930
+ "playable": {
931
+ "type": "object",
932
+ "additionalProperties": false,
933
+ "anyOf": [
934
+ {
935
+ "required": [
936
+ "volumes"
937
+ ],
938
+ "properties": {
939
+ "volumes": {}
940
+ }
941
+ },
942
+ {
943
+ "required": [
944
+ "maxFlyHeight"
945
+ ],
946
+ "properties": {
947
+ "maxFlyHeight": {}
948
+ }
949
+ }
950
+ ],
951
+ "properties": {
952
+ "volumes": {
953
+ "type": "array",
954
+ "minItems": 1,
955
+ "maxItems": 8,
956
+ "items": {
957
+ "anyOf": [
958
+ {
959
+ "type": "object",
960
+ "required": [
961
+ "type",
962
+ "min",
963
+ "max"
964
+ ],
965
+ "additionalProperties": false,
966
+ "properties": {
967
+ "type": {
968
+ "const": "box"
969
+ },
970
+ "min": {
971
+ "type": "array",
972
+ "minItems": 3,
973
+ "maxItems": 3,
974
+ "items": {
975
+ "type": "number",
976
+ "minimum": -100000,
977
+ "maximum": 100000
978
+ }
979
+ },
980
+ "max": {
981
+ "type": "array",
982
+ "minItems": 3,
983
+ "maxItems": 3,
984
+ "items": {
985
+ "type": "number",
986
+ "minimum": -100000,
987
+ "maximum": 100000
988
+ }
989
+ }
990
+ }
991
+ },
992
+ {
993
+ "type": "object",
994
+ "required": [
995
+ "type",
996
+ "points"
997
+ ],
998
+ "additionalProperties": false,
999
+ "properties": {
1000
+ "type": {
1001
+ "const": "convex"
1002
+ },
1003
+ "points": {
1004
+ "type": "array",
1005
+ "minItems": 4,
1006
+ "maxItems": 16,
1007
+ "uniqueItems": true,
1008
+ "items": {
1009
+ "type": "array",
1010
+ "minItems": 3,
1011
+ "maxItems": 3,
1012
+ "items": {
1013
+ "type": "number",
1014
+ "minimum": -100000,
1015
+ "maximum": 100000
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ }
1021
+ ]
1022
+ }
1023
+ },
1024
+ "maxFlyHeight": {
1025
+ "type": "number",
1026
+ "minimum": -100000,
1027
+ "maximum": 100000
1028
+ }
1029
+ }
1030
+ },
1031
+ "backdrop": {
1032
+ "type": "object",
1033
+ "additionalProperties": false,
1034
+ "required": [
1035
+ "farCards"
1036
+ ],
1037
+ "properties": {
1038
+ "farCards": {
1039
+ "type": "array",
1040
+ "maxItems": 256,
1041
+ "uniqueItems": true,
1042
+ "items": {
1043
+ "type": "integer",
1044
+ "minimum": 0
1045
+ }
1046
+ }
1047
+ }
1048
+ },
1049
+ "objectAssets": {
1050
+ "description": "Object assets (RFC-0004 world 0.8, RFC-0011 world 0.9): exactly one source each, an inline package glTF, a package object directory or a library object.",
1051
+ "type": "array",
1052
+ "maxItems": 32,
1053
+ "items": {
1054
+ "oneOf": [
1055
+ {
1056
+ "$ref": "#/$defs/inlineObjectAsset"
1057
+ },
1058
+ {
1059
+ "$ref": "#/$defs/dirObjectAsset"
1060
+ },
1061
+ {
1062
+ "$ref": "#/$defs/libraryObjectAsset"
1063
+ }
1064
+ ]
1065
+ }
1066
+ },
1067
+ "objects": {
1068
+ "description": "Placed instances of objectAssets (RFC-0004 world 0.8, RFC-0011 world 0.9). pose is required unless path is set and forbidden with it; at most 16 character instances.",
1069
+ "type": "array",
1070
+ "maxItems": 256,
1071
+ "items": {
1072
+ "type": "object",
1073
+ "properties": {
1074
+ "id": {
1075
+ "$ref": "common.schema.json#/$defs/slug"
1076
+ },
1077
+ "asset": {
1078
+ "$ref": "common.schema.json#/$defs/slug"
1079
+ },
1080
+ "pose": {
1081
+ "$ref": "common.schema.json#/$defs/pose"
1082
+ },
1083
+ "scale": {
1084
+ "type": "number",
1085
+ "minimum": 0.01,
1086
+ "maximum": 100
1087
+ },
1088
+ "speed": {
1089
+ "type": "number",
1090
+ "minimum": 0,
1091
+ "maximum": 10
1092
+ },
1093
+ "phase": {
1094
+ "type": "number",
1095
+ "minimum": 0,
1096
+ "exclusiveMaximum": 1
1097
+ },
1098
+ "ambient": {
1099
+ "type": "array",
1100
+ "items": {
1101
+ "type": "number",
1102
+ "minimum": 0,
1103
+ "maximum": 16
1104
+ },
1105
+ "minItems": 3,
1106
+ "maxItems": 3
1107
+ },
1108
+ "path": {
1109
+ "description": "A paths[] slug with use route (characters only); pose is omitted.",
1110
+ "$ref": "common.schema.json#/$defs/slug"
1111
+ },
1112
+ "reverse": {
1113
+ "type": "boolean",
1114
+ "description": "Only with path: start walking towards decreasing arc length."
1115
+ },
1116
+ "seat": {
1117
+ "description": "Characters without path: sits there permanently.",
1118
+ "$ref": "#/$defs/seatRef"
1119
+ },
1120
+ "accent": {
1121
+ "type": "array",
1122
+ "items": {
1123
+ "type": "number",
1124
+ "minimum": 0,
1125
+ "maximum": 1
1126
+ },
1127
+ "minItems": 3,
1128
+ "maxItems": 3,
1129
+ "description": "Characters only: linear RGB for the accent material."
1130
+ },
1131
+ "interactions": {
1132
+ "type": "array",
1133
+ "items": {
1134
+ "$ref": "#/$defs/instanceInteraction"
1135
+ },
1136
+ "minItems": 1,
1137
+ "maxItems": 8,
1138
+ "description": "Characters only; replaces the asset's list. Ids unique per list."
1139
+ },
1140
+ "locked": {
1141
+ "type": "boolean",
1142
+ "description": "Movable assets only."
1143
+ }
1144
+ },
1145
+ "required": [
1146
+ "id",
1147
+ "asset"
1148
+ ],
1149
+ "additionalProperties": false
1150
+ }
1151
+ },
1152
+ "paths": {
1153
+ "description": "Authored paths (RFC-0011 Paths): at most 64, 1,024 points in total.",
1154
+ "type": "array",
1155
+ "items": {
1156
+ "$ref": "#/$defs/path"
1157
+ },
1158
+ "maxItems": 64
1159
+ },
1160
+ "seats": {
1161
+ "description": "World seat anchors (RFC-0011 Seats and sitting).",
1162
+ "type": "array",
1163
+ "items": {
1164
+ "$ref": "#/$defs/worldSeat"
1165
+ },
1166
+ "maxItems": 64
1167
+ },
1168
+ "keepClear": {
1169
+ "description": "Boxes that objects may not block and route stops avoid.",
1170
+ "type": "array",
1171
+ "items": {
1172
+ "$ref": "#/$defs/keepClearBox"
1173
+ },
1174
+ "maxItems": 64
1175
+ }
1176
+ },
1177
+ "required": [
1178
+ "formatVersion",
1179
+ "id",
1180
+ "version",
1181
+ "name",
1182
+ "license",
1183
+ "scene",
1184
+ "defaultSpawn",
1185
+ "spawns",
1186
+ "attribution"
1187
+ ],
1188
+ "additionalProperties": false,
1189
+ "$defs": {
1190
+ "animation": {
1191
+ "type": "object",
1192
+ "properties": {
1193
+ "node": {
1194
+ "type": "string",
1195
+ "minLength": 1,
1196
+ "maxLength": 128
1197
+ },
1198
+ "type": {
1199
+ "enum": [
1200
+ "spin",
1201
+ "orbit",
1202
+ "bob"
1203
+ ]
1204
+ },
1205
+ "axis": {
1206
+ "type": "array",
1207
+ "items": {
1208
+ "type": "number",
1209
+ "maximum": 1.001,
1210
+ "minimum": -1.001
1211
+ },
1212
+ "minItems": 3,
1213
+ "maxItems": 3
1214
+ },
1215
+ "pivot": {
1216
+ "type": "array",
1217
+ "items": {
1218
+ "type": "number",
1219
+ "maximum": 10000,
1220
+ "minimum": -10000
1221
+ },
1222
+ "minItems": 3,
1223
+ "maxItems": 3
1224
+ },
1225
+ "amplitude": {
1226
+ "type": "number",
1227
+ "maximum": 10,
1228
+ "exclusiveMinimum": 0
1229
+ },
1230
+ "period": {
1231
+ "type": "number",
1232
+ "maximum": 3600,
1233
+ "minimum": 0.5
1234
+ },
1235
+ "phase": {
1236
+ "type": "number",
1237
+ "minimum": 0,
1238
+ "exclusiveMaximum": 1
1239
+ }
1240
+ },
1241
+ "required": [
1242
+ "node",
1243
+ "type",
1244
+ "axis",
1245
+ "period"
1246
+ ],
1247
+ "additionalProperties": false,
1248
+ "description": "A world 0.8 declarative node animation (spin, orbit or bob)."
1249
+ },
1250
+ "slotPose": {
1251
+ "$ref": "common.schema.json#/$defs/pose"
1252
+ },
1253
+ "interaction": {
1254
+ "type": "object",
1255
+ "properties": {
1256
+ "id": {
1257
+ "$ref": "common.schema.json#/$defs/slug"
1258
+ },
1259
+ "label": {
1260
+ "type": "string",
1261
+ "minLength": 1,
1262
+ "maxLength": 32,
1263
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1264
+ },
1265
+ "prompt": {
1266
+ "type": "string",
1267
+ "minLength": 1,
1268
+ "maxLength": 64,
1269
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1270
+ },
1271
+ "action": {
1272
+ "oneOf": [
1273
+ {
1274
+ "type": "object",
1275
+ "properties": {
1276
+ "type": {
1277
+ "const": "say"
1278
+ },
1279
+ "lines": {
1280
+ "type": "array",
1281
+ "items": {
1282
+ "type": "string",
1283
+ "minLength": 1,
1284
+ "maxLength": 160,
1285
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1286
+ },
1287
+ "minItems": 1,
1288
+ "maxItems": 8
1289
+ }
1290
+ },
1291
+ "required": [
1292
+ "type",
1293
+ "lines"
1294
+ ],
1295
+ "additionalProperties": false
1296
+ },
1297
+ {
1298
+ "type": "object",
1299
+ "properties": {
1300
+ "type": {
1301
+ "const": "panel"
1302
+ },
1303
+ "panel": {
1304
+ "$ref": "common.schema.json#/$defs/slug"
1305
+ }
1306
+ },
1307
+ "required": [
1308
+ "type",
1309
+ "panel"
1310
+ ],
1311
+ "additionalProperties": false
1312
+ }
1313
+ ]
1314
+ }
1315
+ },
1316
+ "required": [
1317
+ "id",
1318
+ "label",
1319
+ "action"
1320
+ ],
1321
+ "additionalProperties": false,
1322
+ "description": "Asset-level character interaction: only say and panel, which reference nothing in a world."
1323
+ },
1324
+ "seatAnchor": {
1325
+ "type": "object",
1326
+ "properties": {
1327
+ "id": {
1328
+ "$ref": "common.schema.json#/$defs/slug"
1329
+ },
1330
+ "position": {
1331
+ "$ref": "common.schema.json#/$defs/vec3"
1332
+ },
1333
+ "yaw": {
1334
+ "type": "number",
1335
+ "maximum": 360,
1336
+ "minimum": -360
1337
+ },
1338
+ "height": {
1339
+ "type": "number",
1340
+ "maximum": 1,
1341
+ "minimum": 0.2
1342
+ },
1343
+ "use": {
1344
+ "type": "array",
1345
+ "items": {
1346
+ "enum": [
1347
+ "sit"
1348
+ ]
1349
+ },
1350
+ "minItems": 1,
1351
+ "maxItems": 1,
1352
+ "uniqueItems": true
1353
+ },
1354
+ "approach": {
1355
+ "type": "number",
1356
+ "maximum": 2,
1357
+ "minimum": 0.3
1358
+ }
1359
+ },
1360
+ "required": [
1361
+ "id",
1362
+ "position",
1363
+ "yaw",
1364
+ "height"
1365
+ ],
1366
+ "additionalProperties": false,
1367
+ "description": "Where the sitter's root stands at the start of sit (asset space), facing yaw degrees about +Y from +Z. perch, lean and ground uses are reserved."
1368
+ },
1369
+ "objectTraits": {
1370
+ "type": "object",
1371
+ "properties": {
1372
+ "decorative": {
1373
+ "type": "object",
1374
+ "properties": {
1375
+ "animations": {
1376
+ "type": "array",
1377
+ "items": {
1378
+ "$ref": "#/$defs/animation"
1379
+ },
1380
+ "minItems": 1,
1381
+ "maxItems": 16
1382
+ }
1383
+ },
1384
+ "required": [
1385
+ "animations"
1386
+ ],
1387
+ "additionalProperties": false
1388
+ },
1389
+ "collidable": {
1390
+ "type": "object",
1391
+ "properties": {
1392
+ "node": {
1393
+ "type": "string",
1394
+ "minLength": 1,
1395
+ "maxLength": 128
1396
+ }
1397
+ },
1398
+ "required": [
1399
+ "node"
1400
+ ],
1401
+ "additionalProperties": false,
1402
+ "description": "The 0.8 static collision proxy: a mesh node, not animated, not in an animated subtree."
1403
+ },
1404
+ "movable": {
1405
+ "type": "object",
1406
+ "properties": {
1407
+ "surfaces": {
1408
+ "type": "array",
1409
+ "items": {
1410
+ "enum": [
1411
+ "floor",
1412
+ "wall",
1413
+ "ceiling",
1414
+ "any"
1415
+ ]
1416
+ },
1417
+ "minItems": 1,
1418
+ "maxItems": 4,
1419
+ "uniqueItems": true
1420
+ },
1421
+ "upright": {
1422
+ "type": "boolean"
1423
+ },
1424
+ "scale": {
1425
+ "type": "array",
1426
+ "items": {
1427
+ "type": "number",
1428
+ "maximum": 4,
1429
+ "minimum": 0.25
1430
+ },
1431
+ "minItems": 2,
1432
+ "maxItems": 2
1433
+ }
1434
+ },
1435
+ "additionalProperties": false,
1436
+ "description": "Offered for user placement. Defaults: surfaces [\"floor\"], upright true for floor and ceiling, scale [1, 1]."
1437
+ },
1438
+ "character": {
1439
+ "type": "object",
1440
+ "properties": {
1441
+ "clips": {
1442
+ "type": "object",
1443
+ "propertyNames": {
1444
+ "type": "string",
1445
+ "minLength": 1,
1446
+ "maxLength": 64,
1447
+ "pattern": "^[a-z][a-z0-9_]*$"
1448
+ },
1449
+ "properties": {
1450
+ "walk": {
1451
+ "type": "object",
1452
+ "properties": {
1453
+ "speed": {
1454
+ "type": "number",
1455
+ "maximum": 15,
1456
+ "exclusiveMinimum": 0.05
1457
+ },
1458
+ "seatHeight": {
1459
+ "type": "number",
1460
+ "maximum": 1,
1461
+ "minimum": 0.2
1462
+ }
1463
+ },
1464
+ "additionalProperties": false,
1465
+ "description": "Values the import step measured; speed must match the clip's extras.speed within 2%."
1466
+ },
1467
+ "idle": {
1468
+ "type": "object",
1469
+ "properties": {
1470
+ "speed": {
1471
+ "type": "number",
1472
+ "maximum": 15,
1473
+ "exclusiveMinimum": 0.05
1474
+ },
1475
+ "seatHeight": {
1476
+ "type": "number",
1477
+ "maximum": 1,
1478
+ "minimum": 0.2
1479
+ }
1480
+ },
1481
+ "additionalProperties": false,
1482
+ "description": "Values the import step measured; speed must match the clip's extras.speed within 2%."
1483
+ }
1484
+ },
1485
+ "additionalProperties": {
1486
+ "type": "object",
1487
+ "properties": {
1488
+ "speed": {
1489
+ "type": "number",
1490
+ "maximum": 15,
1491
+ "exclusiveMinimum": 0.05
1492
+ },
1493
+ "seatHeight": {
1494
+ "type": "number",
1495
+ "maximum": 1,
1496
+ "minimum": 0.2
1497
+ }
1498
+ },
1499
+ "additionalProperties": false,
1500
+ "description": "Values the import step measured; speed must match the clip's extras.speed within 2%."
1501
+ },
1502
+ "required": [
1503
+ "walk",
1504
+ "idle"
1505
+ ],
1506
+ "maxProperties": 64
1507
+ },
1508
+ "height": {
1509
+ "type": "number",
1510
+ "maximum": 2.2,
1511
+ "minimum": 1.2
1512
+ },
1513
+ "radius": {
1514
+ "type": "number",
1515
+ "maximum": 0.5,
1516
+ "minimum": 0.25
1517
+ },
1518
+ "accent": {
1519
+ "type": "boolean"
1520
+ },
1521
+ "interactions": {
1522
+ "type": "array",
1523
+ "items": {
1524
+ "$ref": "#/$defs/interaction"
1525
+ },
1526
+ "minItems": 1,
1527
+ "maxItems": 8
1528
+ }
1529
+ },
1530
+ "required": [
1531
+ "clips",
1532
+ "height"
1533
+ ],
1534
+ "additionalProperties": false,
1535
+ "description": "RFC-0010 character: clips with measured values (walk and idle required), height and radius in metres."
1536
+ },
1537
+ "seat": {
1538
+ "type": "object",
1539
+ "properties": {
1540
+ "anchors": {
1541
+ "type": "array",
1542
+ "items": {
1543
+ "$ref": "#/$defs/seatAnchor"
1544
+ },
1545
+ "minItems": 1,
1546
+ "maxItems": 8
1547
+ },
1548
+ "capacity": {
1549
+ "type": "integer",
1550
+ "minimum": 1,
1551
+ "maximum": 8
1552
+ }
1553
+ },
1554
+ "required": [
1555
+ "anchors"
1556
+ ],
1557
+ "additionalProperties": false
1558
+ },
1559
+ "mount": {
1560
+ "description": "Reserved (RFC-0011 P4): a prop that holds a window. Rejected in world format 0.9.",
1561
+ "not": {}
1562
+ },
1563
+ "machine": {
1564
+ "description": "Reserved for RFC-0013 (live objects). Rejected in world format 0.9.",
1565
+ "not": {}
1566
+ },
1567
+ "interactive": {
1568
+ "description": "Reserved (RFC-0011 P4): use actions on ordinary objects. Rejected in world format 0.9.",
1569
+ "not": {}
1570
+ },
1571
+ "mover": {
1572
+ "description": "World format 0.10 (RFC-0011 P3). Rejected in world format 0.9.",
1573
+ "not": {}
1574
+ }
1575
+ },
1576
+ "additionalProperties": false,
1577
+ "description": "Inline object asset traits (object.json 0.9 shapes). Unknown or reserved names reject the world."
1578
+ },
1579
+ "objectSlots": {
1580
+ "type": "object",
1581
+ "properties": {
1582
+ "states": {
1583
+ "type": "array",
1584
+ "items": {
1585
+ "type": "object",
1586
+ "properties": {
1587
+ "id": {
1588
+ "$ref": "common.schema.json#/$defs/slug"
1589
+ },
1590
+ "materials": {
1591
+ "type": "array",
1592
+ "items": {
1593
+ "type": "string",
1594
+ "minLength": 1,
1595
+ "maxLength": 128
1596
+ },
1597
+ "minItems": 1,
1598
+ "maxItems": 16,
1599
+ "uniqueItems": true
1600
+ },
1601
+ "nodes": {
1602
+ "type": "array",
1603
+ "items": {
1604
+ "type": "string",
1605
+ "minLength": 1,
1606
+ "maxLength": 128
1607
+ },
1608
+ "minItems": 1,
1609
+ "maxItems": 16,
1610
+ "uniqueItems": true
1611
+ },
1612
+ "palette": {
1613
+ "type": "array",
1614
+ "items": {
1615
+ "type": "object",
1616
+ "properties": {
1617
+ "id": {
1618
+ "$ref": "common.schema.json#/$defs/slug"
1619
+ },
1620
+ "colour": {
1621
+ "type": "array",
1622
+ "items": {
1623
+ "type": "number",
1624
+ "maximum": 1,
1625
+ "minimum": 0
1626
+ },
1627
+ "minItems": 3,
1628
+ "maxItems": 3,
1629
+ "description": "Linear RGB, 0-1."
1630
+ },
1631
+ "emission": {
1632
+ "type": "number",
1633
+ "maximum": 16,
1634
+ "minimum": 0
1635
+ }
1636
+ },
1637
+ "required": [
1638
+ "id",
1639
+ "colour",
1640
+ "emission"
1641
+ ],
1642
+ "additionalProperties": false
1643
+ },
1644
+ "minItems": 1,
1645
+ "maxItems": 16
1646
+ }
1647
+ },
1648
+ "required": [
1649
+ "id",
1650
+ "palette"
1651
+ ],
1652
+ "additionalProperties": false,
1653
+ "oneOf": [
1654
+ {
1655
+ "properties": {
1656
+ "materials": {
1657
+ "type": "array"
1658
+ }
1659
+ },
1660
+ "required": [
1661
+ "materials"
1662
+ ]
1663
+ },
1664
+ {
1665
+ "properties": {
1666
+ "nodes": {
1667
+ "type": "array"
1668
+ }
1669
+ },
1670
+ "required": [
1671
+ "nodes"
1672
+ ]
1673
+ }
1674
+ ]
1675
+ },
1676
+ "minItems": 1,
1677
+ "maxItems": 8
1678
+ },
1679
+ "labels": {
1680
+ "type": "array",
1681
+ "items": {
1682
+ "type": "object",
1683
+ "properties": {
1684
+ "id": {
1685
+ "$ref": "common.schema.json#/$defs/slug"
1686
+ },
1687
+ "pose": {
1688
+ "$ref": "#/$defs/slotPose"
1689
+ },
1690
+ "size": {
1691
+ "type": "array",
1692
+ "items": {
1693
+ "type": "number",
1694
+ "maximum": 16,
1695
+ "exclusiveMinimum": 0
1696
+ },
1697
+ "minItems": 2,
1698
+ "maxItems": 2
1699
+ },
1700
+ "maxChars": {
1701
+ "type": "integer",
1702
+ "minimum": 1,
1703
+ "maximum": 64
1704
+ }
1705
+ },
1706
+ "required": [
1707
+ "id",
1708
+ "pose",
1709
+ "size",
1710
+ "maxChars"
1711
+ ],
1712
+ "additionalProperties": false
1713
+ },
1714
+ "minItems": 1,
1715
+ "maxItems": 8
1716
+ },
1717
+ "spawns": {
1718
+ "type": "array",
1719
+ "items": {
1720
+ "type": "object",
1721
+ "properties": {
1722
+ "id": {
1723
+ "$ref": "common.schema.json#/$defs/slug"
1724
+ },
1725
+ "pose": {
1726
+ "$ref": "#/$defs/slotPose"
1727
+ }
1728
+ },
1729
+ "required": [
1730
+ "id",
1731
+ "pose"
1732
+ ],
1733
+ "additionalProperties": false
1734
+ },
1735
+ "minItems": 1,
1736
+ "maxItems": 8
1737
+ },
1738
+ "effects": {
1739
+ "type": "array",
1740
+ "items": {
1741
+ "type": "object",
1742
+ "properties": {
1743
+ "id": {
1744
+ "$ref": "common.schema.json#/$defs/slug"
1745
+ },
1746
+ "pose": {
1747
+ "$ref": "#/$defs/slotPose"
1748
+ }
1749
+ },
1750
+ "required": [
1751
+ "id",
1752
+ "pose"
1753
+ ],
1754
+ "additionalProperties": false
1755
+ },
1756
+ "minItems": 1,
1757
+ "maxItems": 8
1758
+ }
1759
+ },
1760
+ "additionalProperties": false,
1761
+ "description": "Inline object asset slots (object.json 0.9 shapes): authored parts that RFC-0013 drives. Validated and inert in 0.9."
1762
+ },
1763
+ "instanceInteraction": {
1764
+ "type": "object",
1765
+ "properties": {
1766
+ "id": {
1767
+ "$ref": "common.schema.json#/$defs/slug"
1768
+ },
1769
+ "label": {
1770
+ "type": "string",
1771
+ "minLength": 1,
1772
+ "maxLength": 32,
1773
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1774
+ },
1775
+ "prompt": {
1776
+ "type": "string",
1777
+ "minLength": 1,
1778
+ "maxLength": 64,
1779
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1780
+ },
1781
+ "action": {
1782
+ "oneOf": [
1783
+ {
1784
+ "type": "object",
1785
+ "properties": {
1786
+ "type": {
1787
+ "const": "say"
1788
+ },
1789
+ "lines": {
1790
+ "type": "array",
1791
+ "items": {
1792
+ "type": "string",
1793
+ "minLength": 1,
1794
+ "maxLength": 160,
1795
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
1796
+ },
1797
+ "minItems": 1,
1798
+ "maxItems": 8
1799
+ }
1800
+ },
1801
+ "required": [
1802
+ "type",
1803
+ "lines"
1804
+ ],
1805
+ "additionalProperties": false
1806
+ },
1807
+ {
1808
+ "type": "object",
1809
+ "properties": {
1810
+ "type": {
1811
+ "const": "waypoint"
1812
+ },
1813
+ "target": {
1814
+ "oneOf": [
1815
+ {
1816
+ "type": "object",
1817
+ "properties": {
1818
+ "zoneId": {
1819
+ "$ref": "common.schema.json#/$defs/slug"
1820
+ }
1821
+ },
1822
+ "required": [
1823
+ "zoneId"
1824
+ ],
1825
+ "additionalProperties": false
1826
+ },
1827
+ {
1828
+ "type": "object",
1829
+ "properties": {
1830
+ "position": {
1831
+ "$ref": "common.schema.json#/$defs/vec3"
1832
+ }
1833
+ },
1834
+ "required": [
1835
+ "position"
1836
+ ],
1837
+ "additionalProperties": false
1838
+ },
1839
+ {
1840
+ "type": "object",
1841
+ "properties": {
1842
+ "anchor": {
1843
+ "$ref": "common.schema.json#/$defs/slug"
1844
+ }
1845
+ },
1846
+ "required": [
1847
+ "anchor"
1848
+ ],
1849
+ "additionalProperties": false
1850
+ },
1851
+ {
1852
+ "type": "object",
1853
+ "properties": {
1854
+ "object": {
1855
+ "$ref": "common.schema.json#/$defs/slug"
1856
+ }
1857
+ },
1858
+ "required": [
1859
+ "object"
1860
+ ],
1861
+ "additionalProperties": false
1862
+ }
1863
+ ]
1864
+ }
1865
+ },
1866
+ "required": [
1867
+ "type",
1868
+ "target"
1869
+ ],
1870
+ "additionalProperties": false
1871
+ },
1872
+ {
1873
+ "type": "object",
1874
+ "properties": {
1875
+ "type": {
1876
+ "const": "guide"
1877
+ },
1878
+ "path": {
1879
+ "$ref": "common.schema.json#/$defs/slug"
1880
+ }
1881
+ },
1882
+ "required": [
1883
+ "type",
1884
+ "path"
1885
+ ],
1886
+ "additionalProperties": false,
1887
+ "description": "Walk the player along a route path (the slug of a paths[] entry with use route)."
1888
+ },
1889
+ {
1890
+ "type": "object",
1891
+ "properties": {
1892
+ "type": {
1893
+ "const": "panel"
1894
+ },
1895
+ "panel": {
1896
+ "$ref": "common.schema.json#/$defs/slug"
1897
+ }
1898
+ },
1899
+ "required": [
1900
+ "type",
1901
+ "panel"
1902
+ ],
1903
+ "additionalProperties": false
1904
+ }
1905
+ ]
1906
+ }
1907
+ },
1908
+ "required": [
1909
+ "id",
1910
+ "label",
1911
+ "action"
1912
+ ],
1913
+ "additionalProperties": false,
1914
+ "description": "Instance-level character interaction: say, waypoint (zone, position, anchor or object), guide (a route path) or panel. travel and quest are reserved and rejected in world 0.9."
1915
+ },
1916
+ "seatRef": {
1917
+ "type": "string",
1918
+ "minLength": 1,
1919
+ "maxLength": 129,
1920
+ "pattern": "^[a-z][a-z0-9-]*(/[a-z][a-z0-9-]*)?$",
1921
+ "description": "A world seats[] id, <objectId>/<anchorId> or <objectId> (any free anchor of a seat object)."
1922
+ },
1923
+ "pathPoint": {
1924
+ "type": "object",
1925
+ "properties": {
1926
+ "position": {
1927
+ "$ref": "common.schema.json#/$defs/vec3"
1928
+ },
1929
+ "type": {
1930
+ "enum": [
1931
+ "line",
1932
+ "curve",
1933
+ "arc"
1934
+ ]
1935
+ }
1936
+ },
1937
+ "required": [
1938
+ "position",
1939
+ "type"
1940
+ ],
1941
+ "additionalProperties": false,
1942
+ "description": "The segment type arriving at this point; an open path ignores its first point's type, a closed path uses it for the closing segment."
1943
+ },
1944
+ "pathStop": {
1945
+ "type": "object",
1946
+ "properties": {
1947
+ "point": {
1948
+ "type": "integer",
1949
+ "minimum": 0,
1950
+ "maximum": 255
1951
+ },
1952
+ "seconds": {
1953
+ "type": "number",
1954
+ "minimum": 0.5,
1955
+ "maximum": 600
1956
+ },
1957
+ "clip": {
1958
+ "enum": [
1959
+ "look_around",
1960
+ "wave",
1961
+ "nod",
1962
+ "idle_fidget"
1963
+ ]
1964
+ },
1965
+ "face": {
1966
+ "oneOf": [
1967
+ {
1968
+ "type": "object",
1969
+ "properties": {
1970
+ "position": {
1971
+ "$ref": "common.schema.json#/$defs/vec3"
1972
+ }
1973
+ },
1974
+ "required": [
1975
+ "position"
1976
+ ],
1977
+ "additionalProperties": false
1978
+ },
1979
+ {
1980
+ "type": "object",
1981
+ "properties": {
1982
+ "anchor": {
1983
+ "$ref": "common.schema.json#/$defs/slug"
1984
+ }
1985
+ },
1986
+ "required": [
1987
+ "anchor"
1988
+ ],
1989
+ "additionalProperties": false
1990
+ },
1991
+ {
1992
+ "type": "object",
1993
+ "properties": {
1994
+ "object": {
1995
+ "$ref": "common.schema.json#/$defs/slug"
1996
+ }
1997
+ },
1998
+ "required": [
1999
+ "object"
2000
+ ],
2001
+ "additionalProperties": false
2002
+ }
2003
+ ]
2004
+ },
2005
+ "seat": {
2006
+ "$ref": "#/$defs/seatRef"
2007
+ }
2008
+ },
2009
+ "required": [
2010
+ "point"
2011
+ ],
2012
+ "additionalProperties": false,
2013
+ "not": {
2014
+ "anyOf": [
2015
+ {
2016
+ "properties": {
2017
+ "clip": {
2018
+ "type": "string"
2019
+ },
2020
+ "face": {
2021
+ "type": "object"
2022
+ }
2023
+ },
2024
+ "required": [
2025
+ "clip",
2026
+ "face"
2027
+ ]
2028
+ },
2029
+ {
2030
+ "properties": {
2031
+ "clip": {
2032
+ "type": "string"
2033
+ },
2034
+ "seat": {
2035
+ "type": "string"
2036
+ }
2037
+ },
2038
+ "required": [
2039
+ "clip",
2040
+ "seat"
2041
+ ]
2042
+ },
2043
+ {
2044
+ "properties": {
2045
+ "face": {
2046
+ "type": "object"
2047
+ },
2048
+ "seat": {
2049
+ "type": "string"
2050
+ }
2051
+ },
2052
+ "required": [
2053
+ "face",
2054
+ "seat"
2055
+ ]
2056
+ }
2057
+ ]
2058
+ },
2059
+ "description": "A stop at a point index (one per point, below the point count): seconds (default 3) and at most one of clip, face or seat. Track stops take only point and seconds; generic paths have no stops."
2060
+ },
2061
+ "path": {
2062
+ "type": "object",
2063
+ "properties": {
2064
+ "id": {
2065
+ "$ref": "common.schema.json#/$defs/slug"
2066
+ },
2067
+ "name": {
2068
+ "type": "string",
2069
+ "minLength": 1,
2070
+ "maxLength": 64,
2071
+ "pattern": "^[^\\u0000-\\u001f\\u007f]+$"
2072
+ },
2073
+ "use": {
2074
+ "enum": [
2075
+ "route",
2076
+ "track",
2077
+ "generic"
2078
+ ]
2079
+ },
2080
+ "closed": {
2081
+ "type": "boolean"
2082
+ },
2083
+ "points": {
2084
+ "type": "array",
2085
+ "items": {
2086
+ "$ref": "#/$defs/pathPoint"
2087
+ },
2088
+ "minItems": 2,
2089
+ "maxItems": 256
2090
+ },
2091
+ "speed": {
2092
+ "type": "number",
2093
+ "minimum": 0.1,
2094
+ "maximum": 30
2095
+ },
2096
+ "stops": {
2097
+ "type": "array",
2098
+ "items": {
2099
+ "$ref": "#/$defs/pathStop"
2100
+ },
2101
+ "minItems": 0,
2102
+ "maxItems": 32
2103
+ }
2104
+ },
2105
+ "required": [
2106
+ "id",
2107
+ "points"
2108
+ ],
2109
+ "additionalProperties": false,
2110
+ "allOf": [
2111
+ {
2112
+ "if": {
2113
+ "properties": {
2114
+ "use": {
2115
+ "const": "track"
2116
+ }
2117
+ },
2118
+ "required": [
2119
+ "use"
2120
+ ]
2121
+ },
2122
+ "then": {
2123
+ "properties": {
2124
+ "stops": {
2125
+ "type": "array",
2126
+ "items": {
2127
+ "type": "object",
2128
+ "properties": {
2129
+ "clip": false,
2130
+ "face": false,
2131
+ "seat": false
2132
+ }
2133
+ }
2134
+ }
2135
+ }
2136
+ }
2137
+ },
2138
+ {
2139
+ "if": {
2140
+ "properties": {
2141
+ "use": {
2142
+ "enum": [
2143
+ "route",
2144
+ "track"
2145
+ ]
2146
+ }
2147
+ },
2148
+ "required": [
2149
+ "use"
2150
+ ]
2151
+ },
2152
+ "else": {
2153
+ "properties": {
2154
+ "stops": {
2155
+ "type": "array",
2156
+ "maxItems": 0
2157
+ }
2158
+ }
2159
+ }
2160
+ }
2161
+ ],
2162
+ "description": "An authored path (RFC-0011 Paths). use defaults to generic, closed to false."
2163
+ },
2164
+ "worldSeat": {
2165
+ "type": "object",
2166
+ "properties": {
2167
+ "id": {
2168
+ "$ref": "common.schema.json#/$defs/slug"
2169
+ },
2170
+ "pose": {
2171
+ "$ref": "common.schema.json#/$defs/pose"
2172
+ },
2173
+ "height": {
2174
+ "type": "number",
2175
+ "minimum": 0.2,
2176
+ "maximum": 1
2177
+ },
2178
+ "use": {
2179
+ "type": "array",
2180
+ "items": {
2181
+ "enum": [
2182
+ "sit"
2183
+ ]
2184
+ },
2185
+ "minItems": 1,
2186
+ "maxItems": 1,
2187
+ "uniqueItems": true
2188
+ },
2189
+ "approach": {
2190
+ "type": "number",
2191
+ "minimum": 0.3,
2192
+ "maximum": 2
2193
+ }
2194
+ },
2195
+ "required": [
2196
+ "id",
2197
+ "pose",
2198
+ "height"
2199
+ ],
2200
+ "additionalProperties": false,
2201
+ "description": "A world-space seat anchor: pose is where the sitter's root stands at the start of sit, facing the pose's +Z; height is the seat surface above it; approach (default 0.6 m) the free floor in front."
2202
+ },
2203
+ "keepClearBox": {
2204
+ "type": "object",
2205
+ "properties": {
2206
+ "id": {
2207
+ "$ref": "common.schema.json#/$defs/slug"
2208
+ },
2209
+ "min": {
2210
+ "$ref": "common.schema.json#/$defs/vec3"
2211
+ },
2212
+ "max": {
2213
+ "$ref": "common.schema.json#/$defs/vec3"
2214
+ }
2215
+ },
2216
+ "required": [
2217
+ "id",
2218
+ "min",
2219
+ "max"
2220
+ ],
2221
+ "additionalProperties": false,
2222
+ "description": "An axis-aligned box objects may not block (doorways, stairs, passages); min below max on every axis."
2223
+ },
2224
+ "inlineObjectAsset": {
2225
+ "type": "object",
2226
+ "properties": {
2227
+ "id": {
2228
+ "$ref": "common.schema.json#/$defs/slug"
2229
+ },
2230
+ "scene": {
2231
+ "allOf": [
2232
+ {
2233
+ "$ref": "common.schema.json#/$defs/path"
2234
+ },
2235
+ {
2236
+ "type": "string",
2237
+ "pattern": "\\.(gltf|glb)$"
2238
+ }
2239
+ ]
2240
+ },
2241
+ "animations": {
2242
+ "type": "array",
2243
+ "maxItems": 16,
2244
+ "items": {
2245
+ "type": "object",
2246
+ "properties": {
2247
+ "node": {
2248
+ "type": "string",
2249
+ "minLength": 1,
2250
+ "maxLength": 128
2251
+ },
2252
+ "type": {
2253
+ "enum": [
2254
+ "spin",
2255
+ "orbit",
2256
+ "bob"
2257
+ ]
2258
+ },
2259
+ "axis": {
2260
+ "type": "array",
2261
+ "items": {
2262
+ "type": "number",
2263
+ "minimum": -1.001,
2264
+ "maximum": 1.001
2265
+ },
2266
+ "minItems": 3,
2267
+ "maxItems": 3
2268
+ },
2269
+ "pivot": {
2270
+ "type": "array",
2271
+ "items": {
2272
+ "type": "number",
2273
+ "minimum": -10000,
2274
+ "maximum": 10000
2275
+ },
2276
+ "minItems": 3,
2277
+ "maxItems": 3
2278
+ },
2279
+ "amplitude": {
2280
+ "type": "number",
2281
+ "exclusiveMinimum": 0,
2282
+ "maximum": 10
2283
+ },
2284
+ "period": {
2285
+ "type": "number",
2286
+ "minimum": 0.5,
2287
+ "maximum": 3600
2288
+ },
2289
+ "phase": {
2290
+ "type": "number",
2291
+ "minimum": 0,
2292
+ "exclusiveMaximum": 1
2293
+ }
2294
+ },
2295
+ "required": [
2296
+ "node",
2297
+ "type",
2298
+ "axis",
2299
+ "period"
2300
+ ],
2301
+ "additionalProperties": false
2302
+ }
2303
+ },
2304
+ "collision": {
2305
+ "type": "object",
2306
+ "properties": {
2307
+ "node": {
2308
+ "type": "string",
2309
+ "minLength": 1,
2310
+ "maxLength": 128
2311
+ }
2312
+ },
2313
+ "required": [
2314
+ "node"
2315
+ ],
2316
+ "additionalProperties": false
2317
+ },
2318
+ "lighting": {
2319
+ "type": "object",
2320
+ "properties": {
2321
+ "mode": {
2322
+ "enum": [
2323
+ "probe",
2324
+ "unlit"
2325
+ ]
2326
+ }
2327
+ },
2328
+ "required": [
2329
+ "mode"
2330
+ ],
2331
+ "additionalProperties": false
2332
+ },
2333
+ "traits": {
2334
+ "$ref": "#/$defs/objectTraits"
2335
+ },
2336
+ "slots": {
2337
+ "$ref": "#/$defs/objectSlots"
2338
+ }
2339
+ },
2340
+ "required": [
2341
+ "id",
2342
+ "scene"
2343
+ ],
2344
+ "additionalProperties": false,
2345
+ "description": "A package glTF asset: animations is shorthand for traits.decorative.animations and collision for traits.collidable (giving both forms of one is invalid)."
2346
+ },
2347
+ "dirObjectAsset": {
2348
+ "type": "object",
2349
+ "properties": {
2350
+ "id": {
2351
+ "$ref": "common.schema.json#/$defs/slug"
2352
+ },
2353
+ "dir": {
2354
+ "$ref": "common.schema.json#/$defs/path"
2355
+ }
2356
+ },
2357
+ "required": [
2358
+ "id",
2359
+ "dir"
2360
+ ],
2361
+ "additionalProperties": false,
2362
+ "description": "A package object directory (no trailing slash) holding object.json (object format at most the world's) and its scene."
2363
+ },
2364
+ "libraryObjectAsset": {
2365
+ "type": "object",
2366
+ "properties": {
2367
+ "id": {
2368
+ "$ref": "common.schema.json#/$defs/slug"
2369
+ },
2370
+ "library": {
2371
+ "description": "An installed shared object library, <reverse-domain id>@<semver>, resolved exactly.",
2372
+ "type": "string",
2373
+ "minLength": 3,
2374
+ "maxLength": 256,
2375
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z][a-z0-9-]*)*@[0-9A-Za-z.+-]+$"
2376
+ },
2377
+ "object": {
2378
+ "$ref": "common.schema.json#/$defs/slug"
2379
+ }
2380
+ },
2381
+ "required": [
2382
+ "id",
2383
+ "library",
2384
+ "object"
2385
+ ],
2386
+ "additionalProperties": false,
2387
+ "description": "An object of an installed library; a missing library fails activation."
2388
+ }
2389
+ }
2390
+ }