dev.tsunagite.game
Schema Diff
+19 -3
Compatibility Analysis
Backward Compatible
Backward compatible. 6 non-breaking changes.
Non-Breaking Changes (6)
- AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.createdAt" }
- AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.nsid" }
- AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.updatedAt" }
- AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.createdAt", kind: "prop", name: Some("createdAt") }
- AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.nsid", kind: "prop", name: Some("nsid") }
- AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.updatedAt", kind: "prop", name: Some("updatedAt") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "dev.tsunagite.game:body.createdAt" }AddedVertex { vertex_id: "dev.tsunagite.game:body.nsid" }AddedVertex { vertex_id: "dev.tsunagite.game:body.updatedAt" }
Additional Notes
- Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.createdAt", kind: "prop", name: Some("createdAt") }
- Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.nsid", kind: "prop", name: Some("nsid") }
- Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.updatedAt", kind: "prop", name: Some("updatedAt") }
1
1
{
2
2
"id": "dev.tsunagite.game",
3
3
"defs": {
4
4
"enum": {
5
5
"type": "object",
6
6
"required": [
7
7
"name",
8
8
"values"
9
9
],
10
10
"properties": {
11
11
"name": {
12
12
"ref": "dev.tsunagite.translatable",
13
13
"type": "ref",
14
14
"description": "The human-readable name of this component in UI."
15
15
},
16
16
"values": {
17
17
"type": "array",
18
18
"items": {
19
-
"ref": "dev.tsunagite.types#indexable",
19
+
"ref": "dev.tsunagite.defs#indexable",
20
20
"type": "ref"
21
21
},
22
22
"description": "The allowed values for this enum to take."
23
23
}
24
24
},
25
25
"description": "A closed set of indexable named values."
26
26
},
27
27
"main": {
28
28
"key": "any",
29
29
"type": "record",
30
30
"record": {
31
31
"type": "object",
32
32
"required": [
33
33
"name",
34
34
"judgments",
35
35
"scoreComponents",
36
36
"defaultComponent"
37
37
],
38
38
"properties": {
39
39
"logo": {
40
40
"type": "blob",
41
41
"accept": [
42
42
"image/png",
43
43
"image/jpeg",
44
44
"image/jxl",
45
45
"image/webp"
46
46
],
47
47
"maxSize": 8000000,
48
48
"description": "The logo of the game, for display in UI."
49
49
},
50
50
"name": {
51
51
"ref": "dev.tsunagite.translatable",
52
52
"type": "ref",
53
53
"description": "The human-readable name of the game, for display in UI."
54
54
},
55
+
"nsid": {
56
+
"type": "string",
57
+
"format": "nsid",
58
+
"description": "The namespaced ID of the game used for leaderboard and profile keys."
59
+
},
55
60
"modes": {
56
61
"type": "array",
57
62
"items": {
58
63
"type": "string",
59
64
"description": "Can be tokens or raw strings.",
60
65
"knownValues": [
61
66
"dev.tsunagite.singles",
62
67
"dev.tsunagite.doubles"
63
68
]
64
69
},
65
70
"description": "An array of playable game modes with different gameplay configurations. Optional if the game only has one mode."
66
71
},
72
+
"createdAt": {
73
+
"type": "string",
74
+
"format": "datetime"
75
+
},
67
76
"judgments": {
68
77
"type": "array",
69
78
"items": {
70
-
"ref": "dev.tsunagite.types#indexable",
79
+
"ref": "dev.tsunagite.defs#indexable",
71
80
"type": "ref",
72
81
"description": "Indices will be displayed in ascending order."
73
82
},
74
83
"description": "The obtainable judgments during gameplay."
75
84
},
85
+
"updatedAt": {
86
+
"type": "string",
87
+
"format": "datetime"
88
+
},
76
89
"inputMethods": {
77
90
"type": "array",
78
91
"items": {
79
92
"type": "string",
80
93
"description": "Can be tokens or raw strings.",
81
94
"knownValues": [
82
95
"dev.tsunagite.keyboard",
83
96
"dev.tsunagite.gamepad"
84
97
]
85
98
},
86
99
"description": "An array of usable input methods for the game. Optional if the game only has one input method or doesn't separate leaderboards by method."
87
100
},
88
101
"scoreComponents": {
89
102
"type": "object",
90
103
"properties": {
91
104
"$keyFormat": {
92
105
"type": "string",
93
106
"format": "record-key",
94
107
"maxLength": 32,
95
108
"minLength": 1
96
109
},
97
110
"$valueType": {
98
111
"refs": [
99
112
"#enum",
100
113
"#points",
101
114
"#percentage",
102
115
"#text"
103
116
],
104
117
"type": "union",
105
118
"description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
106
119
}
107
120
},
108
121
"description": "All the components of a score in the game, including grades, lamps, EX score, and whatever other constructs are used."
109
122
},
110
123
"defaultComponent": {
111
124
"type": "string",
112
125
"format": "record-key",
113
126
"description": "The default component for leaderboard sorting."
114
127
}
115
128
}
116
129
},
117
130
"description": "A record describing a game hosting leaderboards via Tsunagite."
118
131
},
119
132
"text": {
120
133
"type": "object",
121
134
"required": [
122
135
"name"
123
136
],
124
137
"properties": {
125
138
"name": {
126
139
"ref": "dev.tsunagite.translatable",
127
140
"type": "ref",
128
141
"description": "The human-readable name of this component in UI."
129
142
}
130
143
},
131
144
"description": "A fallback component for displaying arbitrary text."
132
145
},
133
146
"points": {
134
147
"type": "object",
135
148
"required": [
136
149
"name"
137
150
],
138
151
"properties": {
139
152
"name": {
140
153
"ref": "dev.tsunagite.translatable",
141
154
"type": "ref",
142
155
"description": "The human-readable name of this component in UI."
143
156
},
144
157
"maximum": {
145
158
"type": "integer",
146
159
"description": "The maximum allowed value for this score."
147
160
}
148
161
},
149
162
"description": "An integer point score, with or without a cap."
150
163
},
151
164
"percentage": {
152
165
"type": "object",
153
166
"required": [
154
167
"name",
155
168
"maximum",
156
169
"precision"
157
170
],
158
171
"properties": {
159
172
"name": {
160
173
"ref": "dev.tsunagite.translatable",
161
174
"type": "ref",
162
175
"description": "The human-readable name of this component in UI."
163
176
},
164
177
"maximum": {
165
178
"type": "integer",
166
179
"default": 100,
167
180
"description": "The maximum allowed percentage for this score."
168
181
},
169
182
"precision": {
170
183
"type": "integer",
171
184
"default": 2,
172
185
"description": "The number of decimal places to include in the percentage."
173
186
}
174
187
},
175
188
"description": "A percentage score with customizable precision."
176
189
}
177
190
},
178
191
"$type": "com.atproto.lexicon.schema",
179
192
"lexicon": 1,
180
-
"description": "Definitions related to games hosting leaderboards via Tunagite."
193
+
"description": "Definitions related to games hosting leaderboards via Tunagite.",
194
+
"featureFlags": [
195
+
"dev.tsunagite.dictionaryObject"
196
+
]
181
197
}