at.turtleme.game.defs
Schema Diff
+47 -8
Compatibility Analysis
Breaking Changes Detected
11 breaking changes, 9 non-breaking changes.
Breaking Changes (11)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.dir", kind: "prop", name: Some("dir") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.index", kind: "prop", name: Some("index") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.at", kind: "prop", name: Some("at") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.since", kind: "prop", name: Some("since") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.elapsed", kind: "prop", name: Some("elapsed") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.level", kind: "prop", name: Some("level") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.mark", kind: "prop", name: Some("mark") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.index", kind: "prop", name: Some("index") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.span", kind: "prop", name: Some("span") }
- RemovedVertex RemovedVertex { vertex_id: "at.turtleme.game.defs#cast.index" }
- RemovedVertex RemovedVertex { vertex_id: "at.turtleme.game.defs#cast.span" }
Non-Breaking Changes (9)
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#cast.elapsed" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#cast.level" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#cast.mark" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#mark" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#mark.at" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#mark.dir" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#mark.index" }
- AddedVertex AddedVertex { vertex_id: "at.turtleme.game.defs#mark.since" }
- AddedEdge AddedEdge { src: "at.turtleme.game.defs#cast.mark", tgt: "at.turtleme.game.defs#mark", kind: "ref", name: None }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "at.turtleme.game.defs#cast.index" }RemovedVertex { vertex_id: "at.turtleme.game.defs#cast.span" }
Added Elements
AddedVertex { vertex_id: "at.turtleme.game.defs#cast.elapsed" }AddedVertex { vertex_id: "at.turtleme.game.defs#cast.level" }AddedVertex { vertex_id: "at.turtleme.game.defs#cast.mark" }AddedVertex { vertex_id: "at.turtleme.game.defs#mark" }AddedVertex { vertex_id: "at.turtleme.game.defs#mark.at" }AddedVertex { vertex_id: "at.turtleme.game.defs#mark.dir" }AddedVertex { vertex_id: "at.turtleme.game.defs#mark.index" }AddedVertex { vertex_id: "at.turtleme.game.defs#mark.since" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.dir", kind: "prop", name: Some("dir") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.index", kind: "prop", name: Some("index") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.at", kind: "prop", name: Some("at") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#mark", src: "at.turtleme.game.defs#mark", tgt: "at.turtleme.game.defs#mark.since", kind: "prop", name: Some("since") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.elapsed", kind: "prop", name: Some("elapsed") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.level", kind: "prop", name: Some("level") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.mark", kind: "prop", name: Some("mark") }
- Breaking: RequiredEdgeRemoved { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.index", kind: "prop", name: Some("index") }
- Breaking: RequiredEdgeRemoved { vertex_id: "at.turtleme.game.defs#cast", src: "at.turtleme.game.defs#cast", tgt: "at.turtleme.game.defs#cast.span", kind: "prop", name: Some("span") }
- Non-breaking: AddedEdge { src: "at.turtleme.game.defs#cast.mark", tgt: "at.turtleme.game.defs#mark", kind: "ref", name: None }
1
1
{
2
2
"id": "at.turtleme.game.defs",
3
3
"defs": {
4
4
"net": {
5
5
"type": "object",
6
6
"properties": {
7
7
"setAt": {
8
8
"type": "string",
9
9
"format": "datetime"
10
10
},
11
11
"holding": {
12
12
"type": "integer",
13
13
"minimum": 0,
14
14
"description": "What the net would yield if hauled now. A readout for drawing, not a promise: nothing is banked until it is hauled, and the server works the figure out again at that point."
15
15
}
16
16
},
17
17
"description": "The drift net, when it is in the water. Absent when it is not."
18
18
},
19
19
"cast": {
20
20
"type": "object",
21
21
"required": [
22
22
"seed",
23
+
"level",
23
24
"streak",
24
25
"left",
25
-
"index",
26
-
"span"
26
+
"mark",
27
+
"elapsed"
27
28
],
28
29
"properties": {
29
30
"left": {
30
31
"type": "integer",
31
32
"minimum": 0,
32
33
"description": "Strikes the cast has left, landed or missed."
33
34
},
35
+
"mark": {
36
+
"ref": "at.turtleme.game.defs#mark",
37
+
"type": "ref"
38
+
},
34
39
"seed": {
35
40
"type": "integer",
36
41
"description": "What the run's windows are drawn from."
37
42
},
38
-
"span": {
43
+
"level": {
44
+
"type": "integer",
45
+
"maximum": 99,
46
+
"minimum": 0,
47
+
"description": "The Fishing level the cast opened at, which with the streak gives the width of the window and the pace of the marker. Held for the run, so a level gained mid-cast does not widen the bar under the player."
48
+
},
49
+
"streak": {
50
+
"type": "integer",
51
+
"minimum": 0,
52
+
"description": "Strikes landed in a row, which is what narrows the window and quickens the marker."
53
+
},
54
+
"elapsed": {
55
+
"type": "integer",
56
+
"minimum": 0,
57
+
"description": "How far into the run this reply reckons it is. A client sets its own clock from it, so the offset it reports for a strike is measured against the run turtle meat is timing."
58
+
}
59
+
},
60
+
"description": "A run of strikes. The seed every window is drawn from, the level the run opened at and the marker's state are all turtle meat's, so a client can draw the bar to the millisecond without being able to widen it, slow it or move the gold sliver."
61
+
},
62
+
"mark": {
63
+
"type": "object",
64
+
"required": [
65
+
"at",
66
+
"dir",
67
+
"since",
68
+
"index"
69
+
],
70
+
"properties": {
71
+
"at": {
39
72
"type": "number",
40
-
"description": "How wide the window is now, at this level and this streak. Worked out by turtle meat, not asked for."
73
+
"maximum": 100,
74
+
"minimum": 0,
75
+
"description": "Where across the bar the marker was left, as a percentage of it."
41
76
},
77
+
"dir": {
78
+
"type": "integer",
79
+
"description": "Which way it is travelling: 1 towards the right end, -1 towards the left."
80
+
},
42
81
"index": {
43
82
"type": "integer",
44
83
"minimum": 0,
45
-
"description": "The earliest placement a strike may still name. Placements only go forward."
84
+
"description": "Which placement of the run's windows is on the bar. A turn at either end lays down the next one."
46
85
},
47
-
"streak": {
86
+
"since": {
48
87
"type": "integer",
49
88
"minimum": 0,
50
-
"description": "Strikes landed in a row, which is what narrows the window and quickens the marker."
89
+
"description": "The moment of the run, in milliseconds, at which it started moving again. Until then it is held still for the splash to play over, and a strike thrown before it is refused."
51
90
}
52
91
},
53
-
"description": "A run of strikes. The seed is what every window of the run is drawn from, and it is turtle meat's, so a client can render the bar without being able to widen it or move the gold sliver."
92
+
"description": "Where the marker was left after the last strike, and which window that laid down. With the run's seed, level and streak it is the whole bar: where the marker is at any later moment of the run follows from it and the clock, which is how a client and turtle meat draw and judge the same bar without describing it to one another."
54
93
},
55
94
"reef": {
56
95
"type": "object",
57
96
"required": [
58
97
"across",
59
98
"shoal"
60
99
],
61
100
"properties": {
62
101
"laid": {
63
102
"type": "boolean",
64
103
"description": "Whether the shoal has gone down yet. It goes down on the first sweep, clear of it."
65
104
},
66
105
"over": {
67
106
"type": "string",
68
107
"description": "How the board ended, or null while it is still being played.",
69
108
"knownValues": [
70
109
"clear",
71
110
"scattered",
72
111
"left"
73
112
]
74
113
},
75
114
"shoal": {
76
115
"type": "integer",
77
116
"description": "How many sea turtles are under it, which the nets in the corner count down."
78
117
},
79
118
"swept": {
80
119
"type": "integer",
81
120
"minimum": 0,
82
121
"description": "How many patches have been opened."
83
122
},
84
123
"across": {
85
124
"type": "integer",
86
125
"description": "How many patches across the board is. It is square."
87
126
}
88
127
},
89
128
"description": "A reef board, as much of it as a player is allowed to know. Where the shoal lies is deliberately absent: a board laid out in the page is a board whose shoal is sitting in memory, and a player who looked would not be guessing at anything."
90
129
},
91
130
"rest": {
92
131
"type": "object",
93
132
"properties": {
94
133
"reef": {
95
134
"type": "string",
96
135
"format": "datetime",
97
136
"description": "After a reef, however it ended."
98
137
},
99
138
"strike": {
100
139
"type": "string",
101
140
"format": "datetime",
102
141
"description": "After a run of strikes, however it ended. Null when the water has never been worked."
103
142
}
104
143
},
105
144
"description": "The moments two stretches of water are worth working again. Held as the moment it is up rather than a countdown, so closing the page does not hand the time back."
106
145
},
107
146
"spot": {
108
147
"type": "object",
109
148
"required": [
110
149
"since"
111
150
],
112
151
"properties": {
113
152
"since": {
114
153
"type": "string",
115
154
"format": "datetime",
116
155
"description": "When this spot appeared."
117
156
},
118
157
"movesAt": {
119
158
"type": "string",
120
159
"format": "datetime",
121
160
"description": "When it wanders off, drawn from the moment it appeared and nothing else, so that both sides get the same answer without being told it."
122
161
}
123
162
},
124
163
"description": "A fishing spot. Where it is on the water is the page's business; when it leaves is not, because casting at water nobody is standing over has to be refusable."
125
164
},
126
165
"skill": {
127
166
"type": "object",
128
167
"required": [
129
168
"xp"
130
169
],
131
170
"properties": {
132
171
"xp": {
133
172
"type": "integer",
134
173
"minimum": 0
135
174
}
136
175
}
137
176
},
138
177
"state": {
139
178
"type": "object",
140
179
"required": [
141
180
"did",
142
181
"seq",
143
182
"proof"
144
183
],
145
184
"properties": {
146
185
"gp": {
147
186
"type": "integer",
148
187
"minimum": 0,
149
188
"description": "Coins. Held here rather than by the client because a shop, an exchange and a player's own claim about what they can afford are the same question."
150
189
},
151
190
"did": {
152
191
"type": "string",
153
192
"format": "did"
154
193
},
155
194
"net": {
156
195
"ref": "#net",
157
196
"type": "ref"
158
197
},
159
198
"seq": {
160
199
"type": "integer",
161
200
"minimum": 0,
162
201
"description": "Increases whenever the state changes, and never otherwise. Publishing a receipt whose sequence has already been counted is a no-op rather than an error."
163
202
},
164
203
"cast": {
165
204
"ref": "#cast",
166
205
"type": "ref",
167
206
"description": "The run of strikes being played, when there is one. Null between casts."
168
207
},
169
208
"reef": {
170
209
"ref": "#reef",
171
210
"type": "ref",
172
211
"description": "The reef board being played, when there is one. Null between boards."
173
212
},
174
213
"rest": {
175
214
"ref": "#rest",
176
215
"type": "ref",
177
216
"description": "When the two stretches of water that rest are worth working again."
178
217
},
179
218
"shop": {
180
219
"type": "unknown",
181
220
"description": "What each of the shop's shelves is holding right now, keyed by item, for a page that has to draw a counter. A shelf nobody has traded at is absent and sits at its usual quantity."
182
221
},
183
222
"spot": {
184
223
"ref": "#spot",
185
224
"type": "ref",
186
225
"description": "The fishing spot being stood over, when there is one. Null when there is not."
187
226
},
188
227
"items": {
189
228
"type": "unknown",
190
229
"description": "How many of each kind the player is carrying, keyed by item. Which of the inventory's slots a stack sits in is the client's business and is not recorded."
191
230
},
192
231
"proof": {
193
232
"type": "string",
194
233
"maxLength": 4096,
195
234
"description": "A compact JWS over these figures, signed by turtle meat. Writing it into at.turtleme.player.state is what puts a player on the leaderboard; not writing it is how they stay off."
196
235
},
197
236
"stats": {
198
237
"type": "unknown",
199
238
"description": "Lifetime tallies."
200
239
},
201
240
"market": {
202
241
"ref": "#market",
203
242
"type": "ref",
204
243
"description": "What a sea turtle is going for, as turtle meat last fetched it. Present only on the methods that need a price, and null when none recent enough to trade on could be had."
205
244
},
206
245
"cooking": {
207
246
"ref": "#skill",
208
247
"type": "ref"
209
248
},
210
249
"fishing": {
211
250
"ref": "#skill",
212
251
"type": "ref"
213
252
},
214
253
"outcome": {
215
254
"type": "unknown",
216
255
"description": "What the call just did, in facts rather than sentences: what was caught, bought, cooked or refused. The page puts it into words, because phrasing is not a number anyone else can see. Absent on a read. An outcome carrying `stale: true` means another call settled first and nothing was written; the state beside it is what is actually true."
217
256
},
218
257
"bankedTurtles": {
219
258
"type": "integer",
220
259
"minimum": 0,
221
260
"description": "Turtles held at the Grand Exchange rather than in the inventory."
222
261
}
223
262
},
224
263
"description": "A player's progress as the server holds it, with a receipt for publishing it. Every method returns this, so that a client always leaves a call holding something it can write to its own repository."
225
264
},
226
265
"market": {
227
266
"type": "object",
228
267
"required": [
229
268
"high",
230
269
"low"
231
270
],
232
271
"properties": {
233
272
"at": {
234
273
"type": "string",
235
274
"format": "datetime",
236
275
"description": "When turtle meat fetched it."
237
276
},
238
277
"low": {
239
278
"type": "integer",
240
279
"minimum": 1,
241
280
"description": "What sellers are getting, so what a sell offer fills at, before the 2% tax."
242
281
},
243
282
"high": {
244
283
"type": "integer",
245
284
"minimum": 1,
246
285
"description": "What buyers are paying, so what a buy offer fills at."
247
286
},
248
287
"stale": {
249
288
"type": "boolean",
250
289
"description": "True when the price service could not be reached and this is the last quote that arrived. Still traded on, up to a point, because a price from twenty minutes ago is a price."
251
290
}
252
291
},
253
292
"description": "The Grand Exchange quote the server settles against, fetched from the Old School RuneScape Wiki's real-time API rather than taken from the caller. The graph on the page is drawn from the same API directly; this is the number a trade actually happens at."
254
293
}
255
294
},
256
295
"$type": "com.atproto.lexicon.schema",
257
296
"lexicon": 1
258
297
}