com.gamethesky.make.run
Schema Diff
+112 -1
Compatibility Analysis
Breaking Changes Detected
7 breaking changes, 32 non-breaking changes.
Breaking Changes (7)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.cid", kind: "prop", name: Some("cid") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.skill", kind: "prop", name: Some("skill") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.uri", kind: "prop", name: Some("uri") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#wore", src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.name", kind: "prop", name: Some("name") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#build", src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.module", kind: "prop", name: Some("module") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#build", src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.stats", kind: "prop", name: Some("stats") }
- ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.run:body.difficulty", sort: "knownValues", old_value: "[\"easy\",\"normal\",\"hard\"]", new_value: "[\"granny\",\"easy\",\"normal\",\"hard\"]" }
Non-Breaking Changes (32)
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#build" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#build.module" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#build.pick" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#build.stats" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#build.stats:items" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#vs" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#vs.cid" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#vs.skill" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#vs.style" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#vs.uri" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#wore" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#wore.face" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#wore.handle" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run#wore.name" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run:body.builds" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run:body.builds:items" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run:body.look" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run:body.vs" }
- AddedVertex AddedVertex { vertex_id: "com.gamethesky.make.run:body.wore" }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.pick", kind: "prop", name: Some("pick") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run#build.stats", tgt: "com.gamethesky.make.run#build.stats:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.style", kind: "prop", name: Some("style") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.face", kind: "prop", name: Some("face") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.handle", kind: "prop", name: Some("handle") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.builds", kind: "prop", name: Some("builds") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.look", kind: "prop", name: Some("look") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.vs", kind: "prop", name: Some("vs") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.wore", kind: "prop", name: Some("wore") }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body.builds", tgt: "com.gamethesky.make.run:body.builds:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body.builds:items", tgt: "com.gamethesky.make.run#build", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body.vs", tgt: "com.gamethesky.make.run#vs", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "com.gamethesky.make.run:body.wore", tgt: "com.gamethesky.make.run#wore", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "com.gamethesky.make.run#build" }AddedVertex { vertex_id: "com.gamethesky.make.run#build.module" }AddedVertex { vertex_id: "com.gamethesky.make.run#build.pick" }AddedVertex { vertex_id: "com.gamethesky.make.run#build.stats" }AddedVertex { vertex_id: "com.gamethesky.make.run#build.stats:items" }AddedVertex { vertex_id: "com.gamethesky.make.run#vs" }AddedVertex { vertex_id: "com.gamethesky.make.run#vs.cid" }AddedVertex { vertex_id: "com.gamethesky.make.run#vs.skill" }AddedVertex { vertex_id: "com.gamethesky.make.run#vs.style" }AddedVertex { vertex_id: "com.gamethesky.make.run#vs.uri" }AddedVertex { vertex_id: "com.gamethesky.make.run#wore" }AddedVertex { vertex_id: "com.gamethesky.make.run#wore.face" }AddedVertex { vertex_id: "com.gamethesky.make.run#wore.handle" }AddedVertex { vertex_id: "com.gamethesky.make.run#wore.name" }AddedVertex { vertex_id: "com.gamethesky.make.run:body.builds" }AddedVertex { vertex_id: "com.gamethesky.make.run:body.builds:items" }AddedVertex { vertex_id: "com.gamethesky.make.run:body.look" }AddedVertex { vertex_id: "com.gamethesky.make.run:body.vs" }AddedVertex { vertex_id: "com.gamethesky.make.run:body.wore" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "com.gamethesky.make.run:body.difficulty", sort: "knownValues", old_value: "[\"easy\",\"normal\",\"hard\"]", new_value: "[\"granny\",\"easy\",\"normal\",\"hard\"]" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#build", src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.module", kind: "prop", name: Some("module") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#build", src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.stats", kind: "prop", name: Some("stats") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.cid", kind: "prop", name: Some("cid") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.skill", kind: "prop", name: Some("skill") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#vs", src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.uri", kind: "prop", name: Some("uri") }
- Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.make.run#wore", src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.name", kind: "prop", name: Some("name") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run#build", tgt: "com.gamethesky.make.run#build.pick", kind: "prop", name: Some("pick") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run#build.stats", tgt: "com.gamethesky.make.run#build.stats:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run#vs", tgt: "com.gamethesky.make.run#vs.style", kind: "prop", name: Some("style") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.face", kind: "prop", name: Some("face") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run#wore", tgt: "com.gamethesky.make.run#wore.handle", kind: "prop", name: Some("handle") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.builds", kind: "prop", name: Some("builds") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.look", kind: "prop", name: Some("look") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.vs", kind: "prop", name: Some("vs") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body", tgt: "com.gamethesky.make.run:body.wore", kind: "prop", name: Some("wore") }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body.builds", tgt: "com.gamethesky.make.run:body.builds:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body.builds:items", tgt: "com.gamethesky.make.run#build", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body.vs", tgt: "com.gamethesky.make.run#vs", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "com.gamethesky.make.run:body.wore", tgt: "com.gamethesky.make.run#wore", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
+
"build": {
5
+
"description": "A player's build for one chapter type (its SimModule.build): each stat's value in the type's own order, and the option picked.",
6
+
"properties": {
7
+
"module": {
8
+
"description": "The chapter type (fight).",
9
+
"maxLength": 24,
10
+
"type": "string"
11
+
},
12
+
"pick": {
13
+
"description": "The option picked (fight: the special, post, ratio or rush).",
14
+
"maxLength": 24,
15
+
"type": "string"
16
+
},
17
+
"stats": {
18
+
"description": "Each stat's value, in the chapter type's order (fight: power, speed, reach, guts; 1–5 each, twelve points at most).",
19
+
"items": {
20
+
"maximum": 99,
21
+
"minimum": 0,
22
+
"type": "integer"
23
+
},
24
+
"maxLength": 8,
25
+
"type": "array"
26
+
}
27
+
},
28
+
"required": [
29
+
"module",
30
+
"stats"
31
+
],
32
+
"type": "object"
33
+
},
4
34
"main": {
5
35
"description": "One play of a Make the Sky game, published by the player into their own repo. It stores every input rather than trusting a score: each chapter's engine is deterministic, so replaying its log on the same game reproduces the run exactly. Owning the record is the identity proof and replaying it is the score proof; score and the rest are advisory.",
6
36
"key": "tid",
7
37
"record": {
8
38
"properties": {
39
+
"builds": {
40
+
"description": "For a game whose players build their own: the build played with, one a chapter type that takes one. Part of play: a verifier replays with it, and refuses a build the chapter type wouldn't take (or any build on a game without builds). Absent on such a game: each type's default build.",
41
+
"items": {
42
+
"ref": "#build",
43
+
"type": "ref"
44
+
},
45
+
"maxLength": 8,
46
+
"type": "array"
47
+
},
9
48
"choices": {
10
49
"description": "For a game whose story branches: the option picked at each choice scene the run reached, in order, counting from 0. With the game, they say which chapters the logs belong to; a verifier walks the path they give and refuses a run whose picks or logs don't fit it. Absent (or empty) for a game without choices.",
11
50
"items": {
12
51
"maximum": 2,
13
52
"minimum": 0,
14
53
"type": "integer"
15
54
},
16
55
"maxLength": 60,
17
56
"type": "array"
18
57
},
19
58
"cleared": {
20
59
"description": "Advisory: chapters cleared (on the path taken, in a game that branches).",
21
60
"maximum": 60,
22
61
"minimum": 0,
23
62
"type": "integer"
24
63
},
25
64
"createdAt": {
26
65
"format": "datetime",
27
66
"type": "string"
28
67
},
29
68
"day": {
30
69
"description": "For a daily game's today's run: the day played (YYYY-MM-DD, UTC), whose seeds its chapters played on. A verifier refuses a day on a game that isn't daily, and one later than today. Absent: the run that's the same every time.",
31
70
"maxLength": 10,
32
71
"type": "string"
33
72
},
34
73
"difficulty": {
35
-
"description": "For a game with levels: the level played (absent is normal). A verifier refuses a level on a game without them.",
74
+
"description": "For a game with levels: the level played (absent is normal; granny only on a game that offers it). A verifier refuses a level on a game without them.",
36
75
"knownValues": [
76
+
"granny",
37
77
"easy",
38
78
"normal",
39
79
"hard"
40
80
],
41
81
"maxLength": 8,
42
82
"type": "string"
43
83
},
44
84
"game": {
45
85
"description": "The game (a com.gamethesky.make.game record), pinned to the version played. The game may be edited in place later; a verifier replays the logs on it as it stands, so a rename keeps the run and a change of chapters retires it.",
46
86
"ref": "com.atproto.repo.strongRef",
47
87
"type": "ref"
48
88
},
49
89
"kills": {
50
90
"minimum": 0,
51
91
"type": "integer"
52
92
},
53
93
"logs": {
54
94
"description": "One log a chapter played, in play order: comma-separated `<dtick>.<k>.<a>` entries, dtick being 60 Hz ticks since the previous entry and k (one digit or two) and a the input as that chapter's module takes it. Every chapter but the last played was cleared. In a game that branches, only the chapters on the path taken are played, so there may be fewer logs than chapters.",
55
95
"items": {
56
96
"maxLength": 400000,
57
97
"type": "string"
58
98
},
59
99
"maxLength": 60,
60
100
"minLength": 1,
61
101
"type": "array"
62
102
},
103
+
"look": {
104
+
"description": "Cosmetic: the colors the player's build wore (rrggbb.rrggbb.rrggbb: Fight the Sky's body, trim and gloves). Never read by the verifier.",
105
+
"maxLength": 40,
106
+
"type": "string"
107
+
},
63
108
"makeVersion": {
64
109
"description": "The rules the run was played under, all told. A verifier must match it or refuse the run.",
65
110
"minimum": 1,
66
111
"type": "integer"
67
112
},
68
113
"score": {
69
114
"description": "Advisory: points, all chapters together.",
70
115
"minimum": 0,
71
116
"type": "integer"
72
117
},
73
118
"ticks": {
74
119
"description": "Advisory: 60 Hz ticks, all chapters together.",
75
120
"minimum": 1,
76
121
"type": "integer"
77
122
},
123
+
"vs": {
124
+
"description": "A ghost fight: the saved fighter fought, pinned to its version, and the skill it was fought at. A verifier fetches the fighter at that CID and replays against it; it never ranks.",
125
+
"ref": "#vs",
126
+
"type": "ref"
127
+
},
78
128
"won": {
79
129
"description": "Advisory: every chapter cleared (every chapter on the path taken, and the end reached, in a game that branches).",
80
130
"type": "boolean"
131
+
},
132
+
"wore": {
133
+
"description": "Cosmetic: the face the player wore as Hero 1, so a replay and the run's card show it: a Bluesky handle, or a JPEG they chose to include. Never read by the verifier.",
134
+
"ref": "#wore",
135
+
"type": "ref"
81
136
}
82
137
},
83
138
"required": [
84
139
"makeVersion",
85
140
"game",
86
141
"logs",
87
142
"score",
88
143
"ticks",
89
144
"createdAt"
90
145
],
91
146
"type": "object"
92
147
},
93
148
"type": "record"
149
+
},
150
+
"vs": {
151
+
"properties": {
152
+
"cid": {
153
+
"description": "Its version, as fought.",
154
+
"format": "cid",
155
+
"type": "string"
156
+
},
157
+
"skill": {
158
+
"description": "How sharp its CPU was picked to fight.",
159
+
"maximum": 10,
160
+
"minimum": 1,
161
+
"type": "integer"
162
+
},
163
+
"style": {
164
+
"description": "Advisory: the fighter's style, copied from the record.",
165
+
"maxLength": 24,
166
+
"type": "string"
167
+
},
168
+
"uri": {
169
+
"description": "The com.gamethesky.make.fighter record fought.",
170
+
"format": "at-uri",
171
+
"type": "string"
172
+
}
173
+
},
174
+
"required": [
175
+
"uri",
176
+
"cid",
177
+
"skill"
178
+
],
179
+
"type": "object"
180
+
},
181
+
"wore": {
182
+
"properties": {
183
+
"face": {
184
+
"accept": [
185
+
"image/jpeg"
186
+
],
187
+
"description": "A photo face the player chose to include.",
188
+
"maxSize": 196608,
189
+
"type": "blob"
190
+
},
191
+
"handle": {
192
+
"description": "A Bluesky account whose avatar was worn.",
193
+
"format": "handle",
194
+
"type": "string"
195
+
},
196
+
"name": {
197
+
"maxLength": 40,
198
+
"type": "string"
199
+
}
200
+
},
201
+
"required": [
202
+
"name"
203
+
],
204
+
"type": "object"
94
205
}
95
206
},
96
207
"id": "com.gamethesky.make.run",
97
208
"lexicon": 1
98
209
}