at.turtleme.game.defs
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"cast": {
"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.",
"properties": {
"elapsed": {
"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.",
"minimum": 0,
"type": "integer"
},
"left": {
"description": "Strikes the cast has left, landed or missed.",
"minimum": 0,
"type": "integer"
},
"level": {
"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.",
"maximum": 99,
"minimum": 0,
"type": "integer"
},
"mark": {
"ref": "at.turtleme.game.defs#mark",
"type": "ref"
},
"seed": {
"description": "What the run's windows are drawn from.",
"type": "integer"
},
"streak": {
"description": "Strikes landed in a row, which is what narrows the window and quickens the marker.",
"minimum": 0,
"type": "integer"
}
},
"required": [
"seed",
"level",
"streak",
"left",
"mark",
"elapsed"
],
"type": "object"
},
"mark": {
"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.",
"properties": {
"at": {
"description": "Where across the bar the marker was left, as a percentage of it.",
"maximum": 100,
"minimum": 0,
"type": "number"
},
"dir": {
"description": "Which way it is travelling: 1 towards the right end, -1 towards the left.",
"type": "integer"
},
"index": {
"description": "Which placement of the run's windows is on the bar. A turn at either end lays down the next one.",
"minimum": 0,
"type": "integer"
},
"since": {
"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.",
"minimum": 0,
"type": "integer"
}
},
"required": [
"at",
"dir",
"since",
"index"
],
"type": "object"
},
"market": {
"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.",
"properties": {
"at": {
"description": "When turtle meat fetched it.",
"format": "datetime",
"type": "string"
},
"high": {
"description": "What buyers are paying, so what a buy offer fills at.",
"minimum": 1,
"type": "integer"
},
"low": {
"description": "What sellers are getting, so what a sell offer fills at, before the 2% tax.",
"minimum": 1,
"type": "integer"
},
"stale": {
"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.",
"type": "boolean"
}
},
"required": [
"high",
"low"
],
"type": "object"
},
"net": {
"description": "The drift net, when it is in the water. Absent when it is not.",
"properties": {
"holding": {
"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.",
"minimum": 0,
"type": "integer"
},
"setAt": {
"format": "datetime",
"type": "string"
}
},
"type": "object"
},
"patch": {
"description": "One patch of a reef and how many of the eight patches around it a turtle is under.",
"properties": {
"count": {
"maximum": 8,
"minimum": 0,
"type": "integer"
},
"index": {
"description": "Which patch, counted along each row from the top left.",
"minimum": 0,
"type": "integer"
}
},
"required": [
"index",
"count"
],
"type": "object"
},
"reef": {
"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.",
"properties": {
"across": {
"description": "How many patches across the board is. It is square.",
"type": "integer"
},
"known": {
"description": "Covered patches the open numbers prove safe, with what each one counts, alongside `opened`. What sweepReef hands over as `known`, for the whole board at once.",
"items": {
"ref": "#patch",
"type": "ref"
},
"type": "array"
},
"laid": {
"description": "Whether the shoal has gone down yet. It goes down on the first sweep, clear of it.",
"type": "boolean"
},
"opened": {
"description": "Every patch opened so far and what each one counts, on getState while the board is being played, so a page that has lost the board can draw it again. Nothing the sweeps that opened them did not already say.",
"items": {
"ref": "#patch",
"type": "ref"
},
"type": "array"
},
"over": {
"description": "How the board ended, or null while it is still being played.",
"knownValues": [
"clear",
"scattered",
"left"
],
"type": "string"
},
"shoal": {
"description": "How many sea turtles are under it, which the nets in the corner count down.",
"type": "integer"
},
"swept": {
"description": "How many patches have been opened.",
"minimum": 0,
"type": "integer"
}
},
"required": [
"across",
"shoal"
],
"type": "object"
},
"rest": {
"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.",
"properties": {
"reef": {
"description": "After a reef, however it ended.",
"format": "datetime",
"type": "string"
},
"strike": {
"description": "After a run of strikes, however it ended. Null when the water has never been worked.",
"format": "datetime",
"type": "string"
}
},
"type": "object"
},
"skill": {
"properties": {
"xp": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"xp"
],
"type": "object"
},
"spot": {
"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.",
"properties": {
"movesAt": {
"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.",
"format": "datetime",
"type": "string"
},
"since": {
"description": "When this spot appeared.",
"format": "datetime",
"type": "string"
}
},
"required": [
"since"
],
"type": "object"
},
"state": {
"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.",
"properties": {
"bankedTurtles": {
"description": "Turtles held at the Grand Exchange rather than in the inventory.",
"minimum": 0,
"type": "integer"
},
"cast": {
"description": "The run of strikes being played, when there is one. Null between casts, and once a run has ended by itself: what that leaves behind is a rest, which `rest` carries.",
"ref": "#cast",
"type": "ref"
},
"cooking": {
"ref": "#skill",
"type": "ref"
},
"did": {
"format": "did",
"type": "string"
},
"fishing": {
"ref": "#skill",
"type": "ref"
},
"gp": {
"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.",
"minimum": 0,
"type": "integer"
},
"items": {
"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.",
"type": "unknown"
},
"market": {
"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.",
"ref": "#market",
"type": "ref"
},
"net": {
"ref": "#net",
"type": "ref"
},
"outcome": {
"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.",
"type": "unknown"
},
"proof": {
"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.",
"maxLength": 4096,
"type": "string"
},
"reef": {
"description": "The reef board being played, when there is one. Null between boards.",
"ref": "#reef",
"type": "ref"
},
"rest": {
"description": "When the two stretches of water that rest are worth working again.",
"ref": "#rest",
"type": "ref"
},
"seq": {
"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.",
"minimum": 0,
"type": "integer"
},
"shop": {
"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.",
"type": "unknown"
},
"spot": {
"description": "The fishing spot being stood over, when there is one. Null when there is not.",
"ref": "#spot",
"type": "ref"
},
"stats": {
"description": "Lifetime tallies.",
"type": "unknown"
}
},
"required": [
"did",
"seq",
"proof"
],
"type": "object"
}
},
"id": "at.turtleme.game.defs",
"lexicon": 1
}
Metadata
- DID
-
did:plc:f4h4tl43o4vx4hv2xps6siuz - CID
-
bafyreicc7y24monz6qwws7y7e5dbw7pfbrz53uyby73egyg4i6mwls65dq - Indexed At
- 2026-09-30 19:58 UTC
- AT-URI
-
at://did:plc:f4h4tl43o4vx4hv2xps6siuz/com.atproto.lexicon.schema/at.turtleme.game.defs
Version History (4 versions)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
at.turtleme.game.session record
One adjudicated session of play, published by the player as a public trail of how their progress was earned. The leaderboard does not need these records; at.turtleme.player.state alone is enough to rank someone. They ex…