One night of Haunt the Sky, published by the player into their own repo. The record stores every input rather than trusting a score: the sim is deterministic, so replaying the log on the same seed reproduces the run exactly. Owning the record is the identity proof, and replaying it is the score proof; score, ticks, level and the rest are advisory and never trusted by a board.
tid
Timestamp-based ID
Properties
cast
array
of
ref
#member
Optional
The player's own cast from the Foe Booth, included on purpose (the game asks, off by default) so a replay and its card anywhere show them; each photo is a public blob in the player's repo. Looks only: whoever plays a part, the sim's monsters are the same, and a verifier ignores this field entirely. One member a part.
maxLength: 7 itemscleared
integer
Optional
Advisory: floors cleared.
minimum: 0maximum: 3createdAt
string
datetime
Required
An RFC 3339 formatted timestamp.
difficulty
string
Optional
The difficulty the run was played at; absent means normal. A verifier must replay at it, and each has its own board.
easy, normal, hardhouse
ref
com.atproto.repo.strongRef
Optional
A house somebody made (a com.gamethesky.hauntthesky.house record), pinned to the version this night was played in. Absent, the night is the game's own three floors. A verifier fetches that exact version from its maker's repo and replays the log on it, or refuses; each version of a house has its own board.
kills
integer
Optional
Advisory: things put down.
minimum: 0level
integer
Required
Advisory: the floor the run ended on: 1 the front hall, 2 upstairs, 3 the basement; in a made house, always 1.
minimum: 1maximum: 3log
string
Required
The whole run as the only input the game takes. Comma-separated `<dtick>.<k>.<a>` entries: dtick is 60 Hz ticks since the previous entry; k 1 holds (a 1) or lets go (a 0) of the trigger; k 4 gives up; k 5 sets the walk to a = (forward + 1) * 3 + (turn + 1), each -1, 0 or 1; k 6 sidesteps (a -1, 0 or 1). Only inputs the sim accepted are logged. Example: `90.5.7,30.1.1,18.1.0`.
maxLength: 400000 bytesscore
integer
Required
Advisory: points. Higher ranks higher.
minimum: 0seed
string
Required
The night: `arcade` (the same house for everyone), or a UTC date `YYYY-MM-DD` for that night's, with things moved around. Each has its own board.
maxLength: 16 bytessimVersion
integer
Required
Which rules produced this log. A verifier must replay under the matching version or refuse the run.
minimum: 1ticks
integer
Required
Advisory: 60 Hz ticks from the first floor to the end of the run.
minimum: 1won
boolean
Optional
Advisory: the Thing put down and the one they came for got out.
View raw schema
{
"description": "One night of Haunt the Sky, published by the player into their own repo. The record stores every input rather than trusting a score: the sim is deterministic, so replaying the log on the same seed reproduces the run exactly. Owning the record is the identity proof, and replaying it is the score proof; score, ticks, level and the rest are advisory and never trusted by a board.",
"key": "tid",
"record": {
"properties": {
"cast": {
"description": "The player's own cast from the Foe Booth, included on purpose (the game asks, off by default) so a replay and its card anywhere show them; each photo is a public blob in the player's repo. Looks only: whoever plays a part, the sim's monsters are the same, and a verifier ignores this field entirely. One member a part.",
"items": {
"ref": "#member",
"type": "ref"
},
"maxLength": 7,
"type": "array"
},
"cleared": {
"description": "Advisory: floors cleared.",
"maximum": 3,
"minimum": 0,
"type": "integer"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"difficulty": {
"description": "The difficulty the run was played at; absent means normal. A verifier must replay at it, and each has its own board.",
"knownValues": [
"easy",
"normal",
"hard"
],
"type": "string"
},
"house": {
"description": "A house somebody made (a com.gamethesky.hauntthesky.house record), pinned to the version this night was played in. Absent, the night is the game's own three floors. A verifier fetches that exact version from its maker's repo and replays the log on it, or refuses; each version of a house has its own board.",
"ref": "com.atproto.repo.strongRef",
"type": "ref"
},
"kills": {
"description": "Advisory: things put down.",
"minimum": 0,
"type": "integer"
},
"level": {
"description": "Advisory: the floor the run ended on: 1 the front hall, 2 upstairs, 3 the basement; in a made house, always 1.",
"maximum": 3,
"minimum": 1,
"type": "integer"
},
"log": {
"description": "The whole run as the only input the game takes. Comma-separated `<dtick>.<k>.<a>` entries: dtick is 60 Hz ticks since the previous entry; k 1 holds (a 1) or lets go (a 0) of the trigger; k 4 gives up; k 5 sets the walk to a = (forward + 1) * 3 + (turn + 1), each -1, 0 or 1; k 6 sidesteps (a -1, 0 or 1). Only inputs the sim accepted are logged. Example: `90.5.7,30.1.1,18.1.0`.",
"maxLength": 400000,
"type": "string"
},
"score": {
"description": "Advisory: points. Higher ranks higher.",
"minimum": 0,
"type": "integer"
},
"seed": {
"description": "The night: `arcade` (the same house for everyone), or a UTC date `YYYY-MM-DD` for that night's, with things moved around. Each has its own board.",
"maxLength": 16,
"type": "string"
},
"simVersion": {
"description": "Which rules produced this log. A verifier must replay under the matching version or refuse the run.",
"minimum": 1,
"type": "integer"
},
"ticks": {
"description": "Advisory: 60 Hz ticks from the first floor to the end of the run.",
"minimum": 1,
"type": "integer"
},
"won": {
"description": "Advisory: the Thing put down and the one they came for got out.",
"type": "boolean"
}
},
"required": [
"simVersion",
"seed",
"log",
"ticks",
"score",
"level",
"createdAt"
],
"type": "object"
},
"type": "record"
}