dev.tsunagite.game

tsunagite.dev

Schema Diff

+20 -44

From

CID
bafyreidt7cymhor...
Indexed At
2026-01-09 19:32 UTC
View this version

To

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

Compare Other Versions

Lexicon Garden

@