dev.tsunagite.game
Schema Diff
+5 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 2 non-breaking changes.
Non-Breaking Changes (2)
- AddedVertex AddedVertex { vertex_id: "dev.tsunagite.game:body.nsid" }
- AddedEdge AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.nsid", kind: "prop", name: Some("nsid") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "dev.tsunagite.game:body.nsid" }
Additional Notes
- Non-breaking: AddedEdge { src: "dev.tsunagite.game:body", tgt: "dev.tsunagite.game:body.nsid", kind: "prop", name: Some("nsid") }
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
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
},
67
72
"createdAt": {
68
73
"type": "string",
69
74
"format": "datetime"
70
75
},
71
76
"judgments": {
72
77
"type": "array",
73
78
"items": {
74
79
"ref": "dev.tsunagite.defs#indexable",
75
80
"type": "ref",
76
81
"description": "Indices will be displayed in ascending order."
77
82
},
78
83
"description": "The obtainable judgments during gameplay."
79
84
},
80
85
"updatedAt": {
81
86
"type": "string",
82
87
"format": "datetime"
83
88
},
84
89
"inputMethods": {
85
90
"type": "array",
86
91
"items": {
87
92
"type": "string",
88
93
"description": "Can be tokens or raw strings.",
89
94
"knownValues": [
90
95
"dev.tsunagite.keyboard",
91
96
"dev.tsunagite.gamepad"
92
97
]
93
98
},
94
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."
95
100
},
96
101
"scoreComponents": {
97
102
"type": "object",
98
103
"properties": {
99
104
"$keyFormat": {
100
105
"type": "string",
101
106
"format": "record-key",
102
107
"maxLength": 32,
103
108
"minLength": 1
104
109
},
105
110
"$valueType": {
106
111
"refs": [
107
112
"#enum",
108
113
"#points",
109
114
"#percentage",
110
115
"#text"
111
116
],
112
117
"type": "union",
113
118
"description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay"
114
119
}
115
120
},
116
121
"description": "All the components of a score in the game, including grades, lamps, EX score, and whatever other constructs are used."
117
122
},
118
123
"defaultComponent": {
119
124
"type": "string",
120
125
"format": "record-key",
121
126
"description": "The default component for leaderboard sorting."
122
127
}
123
128
}
124
129
},
125
130
"description": "A record describing a game hosting leaderboards via Tsunagite."
126
131
},
127
132
"text": {
128
133
"type": "object",
129
134
"required": [
130
135
"name"
131
136
],
132
137
"properties": {
133
138
"name": {
134
139
"ref": "dev.tsunagite.translatable",
135
140
"type": "ref",
136
141
"description": "The human-readable name of this component in UI."
137
142
}
138
143
},
139
144
"description": "A fallback component for displaying arbitrary text."
140
145
},
141
146
"points": {
142
147
"type": "object",
143
148
"required": [
144
149
"name"
145
150
],
146
151
"properties": {
147
152
"name": {
148
153
"ref": "dev.tsunagite.translatable",
149
154
"type": "ref",
150
155
"description": "The human-readable name of this component in UI."
151
156
},
152
157
"maximum": {
153
158
"type": "integer",
154
159
"description": "The maximum allowed value for this score."
155
160
}
156
161
},
157
162
"description": "An integer point score, with or without a cap."
158
163
},
159
164
"percentage": {
160
165
"type": "object",
161
166
"required": [
162
167
"name",
163
168
"maximum",
164
169
"precision"
165
170
],
166
171
"properties": {
167
172
"name": {
168
173
"ref": "dev.tsunagite.translatable",
169
174
"type": "ref",
170
175
"description": "The human-readable name of this component in UI."
171
176
},
172
177
"maximum": {
173
178
"type": "integer",
174
179
"default": 100,
175
180
"description": "The maximum allowed percentage for this score."
176
181
},
177
182
"precision": {
178
183
"type": "integer",
179
184
"default": 2,
180
185
"description": "The number of decimal places to include in the percentage."
181
186
}
182
187
},
183
188
"description": "A percentage score with customizable precision."
184
189
}
185
190
},
186
191
"$type": "com.atproto.lexicon.schema",
187
192
"lexicon": 1,
188
193
"description": "Definitions related to games hosting leaderboards via Tunagite.",
189
194
"featureFlags": [
190
195
"dev.tsunagite.dictionaryObject"
191
196
]
192
197
}