com.gamethesky.skytanks.run
Schema Diff
+40 -0
Compatibility Analysis
Breaking Changes Detected
3 breaking changes, 9 non-breaking changes.
Breaking Changes (3)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.slot", kind: "prop", name: Some("slot") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.image", kind: "prop", name: Some("image") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.name", kind: "prop", name: Some("name") }
Non-Breaking Changes (9)
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.image" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.name" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.slot" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces:items" }
- AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body", tgt: "com.gamethesky.skytanks.run:body.faces", kind: "prop", name: Some("faces") }
- AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body.faces", tgt: "com.gamethesky.skytanks.run:body.faces:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body.faces:items", tgt: "com.gamethesky.skytanks.run#face", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face" }AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.image" }AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.name" }AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.slot" }AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces" }AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces:items" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.slot", kind: "prop", name: Some("slot") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.image", kind: "prop", name: Some("image") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.name", kind: "prop", name: Some("name") }
- Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body", tgt: "com.gamethesky.skytanks.run:body.faces", kind: "prop", name: Some("faces") }
- Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body.faces", tgt: "com.gamethesky.skytanks.run:body.faces:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body.faces:items", tgt: "com.gamethesky.skytanks.run#face", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
+
"face": {
5
+
"description": "One of the player's own faces, as it rode in a run: which rival slot, the name under it, and the picture.",
6
+
"properties": {
7
+
"image": {
8
+
"accept": [
9
+
"image/jpeg"
10
+
],
11
+
"description": "The face: a 256×256 JPEG, 64 KB at most, cropped to the middle of the photo. Readers refuse a bigger one.",
12
+
"maxSize": 65536,
13
+
"type": "blob"
14
+
},
15
+
"name": {
16
+
"description": "The name under the face, 40 characters at most.",
17
+
"maxGraphemes": 40,
18
+
"maxLength": 160,
19
+
"type": "string"
20
+
},
21
+
"slot": {
22
+
"description": "The rival slot the face rode in, 0 first. The slots are filled by `faces` at their slot numbers and then by `rivals` in order, so a face sits ahead of the handles, as it did on the player's screen.",
23
+
"maximum": 5,
24
+
"minimum": 0,
25
+
"type": "integer"
26
+
}
27
+
},
28
+
"required": [
29
+
"slot",
30
+
"name",
31
+
"image"
32
+
],
33
+
"type": "object"
34
+
},
4
35
"main": {
5
36
"description": "One Sky Tanks run, published by the player into their own repo. The record stores every input rather than trusting a score: the sim is deterministic, so replaying the log on the same seed reproduces the run exactly. Owning the record is the identity proof, and replaying it is the score proof; score, ticks, level and the rest are advisory and never trusted by a board.",
6
37
"key": "tid",
7
38
"record": {
8
39
"properties": {
9
40
"cleared": {
10
41
"description": "Advisory: mazes cleared.",
11
42
"maximum": 18,
12
43
"minimum": 0,
13
44
"type": "integer"
14
45
},
15
46
"createdAt": {
16
47
"format": "datetime",
17
48
"type": "string"
18
49
},
19
50
"difficulty": {
20
51
"description": "The difficulty the run was played at; absent means normal. A verifier must replay at it, and each has its own board.",
21
52
"knownValues": [
22
53
"easy",
23
54
"normal",
24
55
"hard"
25
56
],
26
57
"type": "string"
27
58
},
59
+
"faces": {
60
+
"description": "The player's own photo faces that rode in rival tanks, included on purpose (the game asks, off by default) so a replay anywhere shows them; each photo is a public blob in the player's repo. Looks only, like `rivals`: a face takes its slot ahead of the handles, the rivals' play is the sim's, and a verifier ignores this field entirely. Six at most.",
61
+
"items": {
62
+
"ref": "#face",
63
+
"type": "ref"
64
+
},
65
+
"maxLength": 6,
66
+
"type": "array"
67
+
},
28
68
"kills": {
29
69
"description": "Advisory: rival tanks wrecked.",
30
70
"minimum": 0,
31
71
"type": "integer"
32
72
},
33
73
"level": {
34
74
"description": "Advisory: the maze the run ended on, 1 to 18, three a world.",
35
75
"maximum": 18,
36
76
"minimum": 1,
37
77
"type": "integer"
38
78
},
39
79
"log": {
40
80
"description": "The whole run as the only input the game takes. Comma-separated `<dtick>.<k>.<a>` entries: dtick is 60 Hz ticks since the previous entry; k 1 holds (a 1) or lets go (a 0) of the trigger; k 4 gives up; k 5 sets the tank's controls to a = (throttle + 1) * 3 + (turn + 1), each -1, 0 or 1. Only inputs the sim accepted are logged. Example: `96.5.7,30.1.1,18.1.0`.",
41
81
"maxLength": 400000,
42
82
"type": "string"
43
83
},
44
84
"rivals": {
45
85
"description": "Handles whose faces the rival tanks wore (people the player follows). Looks only: the rivals' play is the sim's and doesn't depend on this.",
46
86
"items": {
47
87
"maxLength": 253,
48
88
"type": "string"
49
89
},
50
90
"maxLength": 6,
51
91
"type": "array"
52
92
},
53
93
"score": {
54
94
"description": "Advisory: points. Higher ranks higher.",
55
95
"minimum": 0,
56
96
"type": "integer"
57
97
},
58
98
"seed": {
59
99
"description": "The mazes: `arcade` (the same for everyone), or a UTC date `YYYY-MM-DD` for that day's. Each has its own board.",
60
100
"maxLength": 16,
61
101
"type": "string"
62
102
},
63
103
"simVersion": {
64
104
"description": "Which rules produced this log. A verifier must replay under the matching version or refuse the run.",
65
105
"minimum": 1,
66
106
"type": "integer"
67
107
},
68
108
"ticks": {
69
109
"description": "Advisory: 60 Hz ticks from the first count to the end of the run.",
70
110
"minimum": 1,
71
111
"type": "integer"
72
112
},
73
113
"won": {
74
114
"description": "Advisory: all eighteen mazes cleared.",
75
115
"type": "boolean"
76
116
}
77
117
},
78
118
"required": [
79
119
"simVersion",
80
120
"seed",
81
121
"log",
82
122
"ticks",
83
123
"score",
84
124
"level",
85
125
"createdAt"
86
126
],
87
127
"type": "object"
88
128
},
89
129
"type": "record"
90
130
}
91
131
},
92
132
"id": "com.gamethesky.skytanks.run",
93
133
"lexicon": 1
94
134
}