@kradle/challenges-sdk 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/LLM_README.md +235 -2340
  3. package/README.md +151 -571
  4. package/dist/index.d.ts +1 -4
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -6
  7. package/dist/index.js.map +1 -1
  8. package/dist/runtime/examples/capture-the-flag.d.ts +33 -0
  9. package/dist/runtime/examples/capture-the-flag.d.ts.map +1 -0
  10. package/dist/runtime/examples/capture-the-flag.js +79 -0
  11. package/dist/runtime/examples/capture-the-flag.js.map +1 -0
  12. package/dist/runtime/examples/climb.d.ts +34 -0
  13. package/dist/runtime/examples/climb.d.ts.map +1 -0
  14. package/dist/runtime/examples/climb.js +54 -0
  15. package/dist/runtime/examples/climb.js.map +1 -0
  16. package/dist/runtime/examples/four-bridges.d.ts +107 -0
  17. package/dist/runtime/examples/four-bridges.d.ts.map +1 -0
  18. package/dist/runtime/examples/four-bridges.js +294 -0
  19. package/dist/runtime/examples/four-bridges.js.map +1 -0
  20. package/dist/runtime/examples/herding.d.ts +59 -0
  21. package/dist/runtime/examples/herding.d.ts.map +1 -0
  22. package/dist/runtime/examples/herding.js +181 -0
  23. package/dist/runtime/examples/herding.js.map +1 -0
  24. package/dist/runtime/examples/skywars.d.ts +116 -0
  25. package/dist/runtime/examples/skywars.d.ts.map +1 -0
  26. package/dist/runtime/examples/skywars.js +253 -0
  27. package/dist/runtime/examples/skywars.js.map +1 -0
  28. package/dist/runtime/harness.d.ts +176 -0
  29. package/dist/runtime/harness.d.ts.map +1 -0
  30. package/dist/runtime/harness.js +441 -0
  31. package/dist/runtime/harness.js.map +1 -0
  32. package/dist/runtime/index.d.ts +2 -0
  33. package/dist/runtime/index.d.ts.map +1 -0
  34. package/dist/runtime/index.js +18 -0
  35. package/dist/runtime/index.js.map +1 -0
  36. package/dist/runtime/sandbox-registry.d.ts +7 -0
  37. package/dist/runtime/sandbox-registry.d.ts.map +1 -0
  38. package/dist/runtime/sandbox-registry.js +16 -0
  39. package/dist/runtime/sandbox-registry.js.map +1 -0
  40. package/dist/runtime/sandbox.d.ts +29 -0
  41. package/dist/runtime/sandbox.d.ts.map +1 -0
  42. package/dist/runtime/sandbox.js +70 -0
  43. package/dist/runtime/sandbox.js.map +1 -0
  44. package/dist/runtime/sdk.d.ts +1038 -0
  45. package/dist/runtime/sdk.d.ts.map +1 -0
  46. package/dist/runtime/sdk.js +1271 -0
  47. package/dist/runtime/sdk.js.map +1 -0
  48. package/dist/runtime/world.d.ts +141 -0
  49. package/dist/runtime/world.d.ts.map +1 -0
  50. package/dist/runtime/world.js +344 -0
  51. package/dist/runtime/world.js.map +1 -0
  52. package/package.json +76 -39
  53. package/dist/actions.d.ts +0 -901
  54. package/dist/actions.d.ts.map +0 -1
  55. package/dist/actions.js +0 -1155
  56. package/dist/actions.js.map +0 -1
  57. package/dist/api_utils.d.ts +0 -25
  58. package/dist/api_utils.d.ts.map +0 -1
  59. package/dist/api_utils.js +0 -48
  60. package/dist/api_utils.js.map +0 -1
  61. package/dist/challenge.d.ts +0 -58
  62. package/dist/challenge.d.ts.map +0 -1
  63. package/dist/challenge.js +0 -578
  64. package/dist/challenge.js.map +0 -1
  65. package/dist/commands.d.ts +0 -57
  66. package/dist/commands.d.ts.map +0 -1
  67. package/dist/commands.js +0 -200
  68. package/dist/commands.js.map +0 -1
  69. package/dist/constants.d.ts +0 -72
  70. package/dist/constants.d.ts.map +0 -1
  71. package/dist/constants.js +0 -109
  72. package/dist/constants.js.map +0 -1
  73. package/dist/testmode.d.ts +0 -3
  74. package/dist/testmode.d.ts.map +0 -1
  75. package/dist/testmode.js +0 -19
  76. package/dist/testmode.js.map +0 -1
  77. package/dist/types.d.ts +0 -197
  78. package/dist/types.d.ts.map +0 -1
  79. package/dist/types.js +0 -38
  80. package/dist/types.js.map +0 -1
  81. package/dist/utils.d.ts +0 -17
  82. package/dist/utils.d.ts.map +0 -1
  83. package/dist/utils.js +0 -22
  84. package/dist/utils.js.map +0 -1
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MID_LOOT = exports.STARTING_LOOT = exports.BORDER_SHRINKS = exports.config = exports.CENTER = void 0;
4
+ exports.rollChest = rollChest;
5
+ // Skywars on the runtime SDK. Same rules as team-kradle-challenges/challenges/skywars:
6
+ // four starting islands around a mid island, random chests with weighted loot,
7
+ // a border that shrinks at 3:00, 4:00 and 4:30, one life, last player standing wins.
8
+ // The world carries armor stands tagged kradle.island.<name> plus kradle.chest or
9
+ // kradle.spawn; the loot tables are data here and roll from the run's seed, so a
10
+ // replay opens the same chests.
11
+ const sdk_js_1 = require("../sdk.js");
12
+ exports.CENTER = { x: 70, y: -51, z: 12 };
13
+ exports.config = {
14
+ name: "Skywars",
15
+ challengeConfig: { locations: { center: { coordinates: exports.CENTER } } },
16
+ roles: { fighter: { description: "fighter", minParticipants: 2 } },
17
+ endStates: {
18
+ last_standing: "One player remains alive; that player wins",
19
+ time_up: "The timer ran out with several players alive; nobody wins",
20
+ },
21
+ };
22
+ const INITIAL_BORDER_SIZE = 100;
23
+ const STARTING_ISLANDS = ["north", "east", "south", "west"];
24
+ const MIDDLE_ISLAND = "middle";
25
+ const STARTING_CHESTS_PER_ISLAND = 2;
26
+ const MIDDLE_CHESTS = 4;
27
+ const CHEST_SLOTS = 27;
28
+ exports.BORDER_SHRINKS = [
29
+ { at: (0, sdk_js_1.seconds)(180), size: 50, seconds: 30, message: "The world border is SHRINKING! Move toward the center!" },
30
+ { at: (0, sdk_js_1.seconds)(240), size: 15, seconds: 15, message: "The border is closing in FAST!" },
31
+ { at: (0, sdk_js_1.seconds)(270), size: 5, seconds: 10, message: "FINAL CIRCLE! Fight or die!" },
32
+ ];
33
+ const one = (item, weight, count, nbt) => ({
34
+ weight,
35
+ items: [{ item, ...(count === undefined ? {} : { count }), ...(nbt === undefined ? {} : { nbt }) }],
36
+ });
37
+ const bowAndArrows = (weight) => ({
38
+ weight,
39
+ items: [{ item: "minecraft:bow" }, { item: "minecraft:arrow", count: [3, 6] }],
40
+ });
41
+ const SHARPNESS_1 = '{Enchantments:[{id:"minecraft:sharpness",lvl:1s}]}';
42
+ exports.STARTING_LOOT = [
43
+ // Weapon: stone sword / iron sword / bow + 3-6 arrows
44
+ {
45
+ rolls: 1,
46
+ entries: [
47
+ one("minecraft:stone_sword", 3),
48
+ one("minecraft:wooden_sword", 1, undefined, SHARPNESS_1),
49
+ one("minecraft:iron_sword", 1),
50
+ bowAndArrows(2),
51
+ ],
52
+ },
53
+ // Armor: leather piece / chainmail helmet
54
+ {
55
+ rolls: 1,
56
+ entries: [
57
+ one("minecraft:leather_helmet", 2),
58
+ one("minecraft:leather_chestplate", 2),
59
+ one("minecraft:leather_leggings", 2),
60
+ one("minecraft:leather_boots", 2),
61
+ one("minecraft:chainmail_helmet", 1),
62
+ ],
63
+ },
64
+ // Food: bread / cooked beef / golden apple
65
+ {
66
+ rolls: 1,
67
+ entries: [
68
+ one("minecraft:bread", 3, [3, 8]),
69
+ one("minecraft:cooked_beef", 2, [2, 5]),
70
+ one("minecraft:golden_apple", 1),
71
+ ],
72
+ },
73
+ // Blocks: cobblestone / oak planks (for bridging)
74
+ { rolls: 1, entries: [one("minecraft:cobblestone", 3, 16), one("minecraft:oak_planks", 2, 16)] },
75
+ ];
76
+ exports.MID_LOOT = [
77
+ // Weapon: iron sword / diamond sword / bow + 3-6 arrows
78
+ { rolls: 1, entries: [one("minecraft:iron_sword", 3), one("minecraft:diamond_sword", 1), bowAndArrows(2)] },
79
+ // Armor (1-2 pieces): iron set / diamond helmet / diamond chestplate
80
+ {
81
+ rolls: [1, 2],
82
+ entries: [
83
+ one("minecraft:iron_helmet", 2),
84
+ one("minecraft:iron_chestplate", 2),
85
+ one("minecraft:iron_leggings", 2),
86
+ one("minecraft:iron_boots", 2),
87
+ one("minecraft:diamond_helmet", 1),
88
+ one("minecraft:diamond_chestplate", 1),
89
+ ],
90
+ },
91
+ // Food: golden apples / enchanted golden apple / cooked beef
92
+ {
93
+ rolls: 1,
94
+ entries: [
95
+ one("minecraft:golden_apple", 2, 3),
96
+ one("minecraft:enchanted_golden_apple", 1),
97
+ one("minecraft:cooked_beef", 3, 8),
98
+ ],
99
+ },
100
+ // Utility: ender pearls / cobblestone / arrows
101
+ {
102
+ rolls: 1,
103
+ entries: [one("minecraft:ender_pearl", 2, 2), one("minecraft:cobblestone", 3, 32), one("minecraft:arrow", 2, 16)],
104
+ },
105
+ ];
106
+ // ---------------------------------------------------------------- state
107
+ const state = {
108
+ game: () => ({ chests: [] }),
109
+ player: () => ({ island: "", damageDealt: 0 }),
110
+ markers: {
111
+ tags: ["kradle.island.", "kradle.chest", "kradle.spawn"],
112
+ within: {
113
+ from: { x: exports.CENTER.x - 90, y: -64, z: exports.CENTER.z - 90 },
114
+ to: { x: exports.CENTER.x + 90, y: 100, z: exports.CENTER.z + 90 },
115
+ },
116
+ },
117
+ };
118
+ const blockOf = (at) => ({ x: Math.floor(at.x), y: Math.floor(at.y), z: Math.floor(at.z) });
119
+ const island = (m) => m.tags.find((t) => t.startsWith("kradle.island."))?.slice("kradle.island.".length);
120
+ function count(g, c) {
121
+ if (c === undefined)
122
+ return 1;
123
+ return typeof c === "number" ? c : g.rand(c[0], c[1]);
124
+ }
125
+ function pickEntry(g, entries) {
126
+ const total = entries.reduce((n, e) => n + e.weight, 0);
127
+ let r = g.rand(1, total);
128
+ for (const e of entries) {
129
+ r -= e.weight;
130
+ if (r <= 0)
131
+ return e;
132
+ }
133
+ return entries[entries.length - 1];
134
+ }
135
+ /** Rolls every pool of a table into chest items on random slots, like a vanilla loot table would. */
136
+ function rollChest(g, table) {
137
+ const stacks = [];
138
+ for (const pool of table) {
139
+ const rolls = count(g, pool.rolls);
140
+ for (let i = 0; i < rolls; i++) {
141
+ for (const it of pickEntry(g, pool.entries).items) {
142
+ stacks.push({ item: it.item, count: count(g, it.count), ...(it.nbt === undefined ? {} : { nbt: it.nbt }) });
143
+ }
144
+ }
145
+ }
146
+ const slots = g.shuffle(Array.from({ length: CHEST_SLOTS }, (_, i) => i));
147
+ return stacks.map((stack, i) => ({ slot: slots[i], ...stack }));
148
+ }
149
+ // ---------------------------------------------------------------- the challenge
150
+ exports.default = (0, sdk_js_1.defineChallenge)(exports.config, {
151
+ ...state,
152
+ duration: (0, sdk_js_1.seconds)(300),
153
+ life: "single",
154
+ announce: { deaths: false },
155
+ world: { spawn: exports.CENTER, naturalRegeneration: true },
156
+ // The world build is one batch: border, health display, and every chest with its loot.
157
+ setup(g) {
158
+ g.gamerule("doWeatherCycle", false);
159
+ g.worldBorder({ center: { x: exports.CENTER.x, z: exports.CENTER.z }, size: INITIAL_BORDER_SIZE });
160
+ g.command('scoreboard objectives add kradle.health health {"text":"❤","color":"red","bold":true}');
161
+ g.command("scoreboard objectives setdisplay below_name kradle.health");
162
+ // The world must carry its markers: without them the game would start
163
+ // with no chest or with players who have no island.
164
+ const chestStands = g.markers("kradle.chest");
165
+ if (chestStands.length === 0)
166
+ throw new Error("The world has no kradle.chest marker; no chest can be placed.");
167
+ const spawns = g.markers("kradle.spawn");
168
+ const noSpawn = STARTING_ISLANDS.filter((name) => !spawns.some((m) => island(m) === name));
169
+ if (noSpawn.length > 0)
170
+ throw new Error(`The world has no kradle.spawn marker for: ${noSpawn.join(", ")}.`);
171
+ // Each island must offer as many distinct chest spots as the layout places:
172
+ // fewer, or markers on the same block, would give players unequal loot.
173
+ const spotsOn = (name) => new Set(chestStands
174
+ .filter((m) => island(m) === name)
175
+ .map((m) => `${blockOf(m.at).x},${blockOf(m.at).y},${blockOf(m.at).z}`)).size;
176
+ const short = [
177
+ ...STARTING_ISLANDS.map((name) => [name, STARTING_CHESTS_PER_ISLAND]),
178
+ [MIDDLE_ISLAND, MIDDLE_CHESTS],
179
+ ]
180
+ .filter(([name, n]) => spotsOn(name) < n)
181
+ .map(([name, n]) => `${name} (${spotsOn(name)} of ${n})`);
182
+ if (short.length > 0)
183
+ throw new Error(`The world has too few distinct kradle.chest markers: ${short.join(", ")}.`);
184
+ const plan = [
185
+ ...STARTING_ISLANDS.map((name) => [name, STARTING_CHESTS_PER_ISLAND, exports.STARTING_LOOT]),
186
+ [MIDDLE_ISLAND, MIDDLE_CHESTS, exports.MID_LOOT],
187
+ ];
188
+ for (const [name, n, table] of plan) {
189
+ // One marker per block: two markers on one block are one chest spot.
190
+ const distinct = [
191
+ ...new Map(chestStands
192
+ .filter((m) => island(m) === name)
193
+ .map((m) => [`${blockOf(m.at).x},${blockOf(m.at).y},${blockOf(m.at).z}`, m])).values(),
194
+ ];
195
+ const spots = g.shuffle(distinct).slice(0, n);
196
+ for (const spot of spots) {
197
+ const at = blockOf(spot.at);
198
+ g.game.chests.push(at);
199
+ g.setblock(at, "minecraft:chest");
200
+ g.container(at, rollChest(g, table));
201
+ }
202
+ }
203
+ },
204
+ start(g) {
205
+ g.say("=== SKYBLOCK BATTLE ROYALE ===");
206
+ g.say("Loot chests, gear up, and fight! Last player standing wins!");
207
+ const spawns = g.markers("kradle.spawn");
208
+ const order = g.shuffle([...STARTING_ISLANDS]);
209
+ g.players.forEach((p, i) => {
210
+ const name = order[i % order.length];
211
+ const spawn = spawns.find((m) => island(m) === name);
212
+ p.island = name;
213
+ if (spawn)
214
+ g.teleport(p, spawn.at);
215
+ g.tell(p, `You spawned on ${name.toUpperCase()}! Find chests to gear up!`);
216
+ });
217
+ g.say(`The CENTER ISLAND is at X: ${exports.CENTER.x} Z: ${exports.CENTER.z}: bridge there for BETTER GEAR!`);
218
+ g.say(`The world border shrinks at ${exports.BORDER_SHRINKS[0].at / 1200}:00! Stay inside or die!`);
219
+ },
220
+ at: exports.BORDER_SHRINKS.map((shrink) => ({
221
+ at: shrink.at,
222
+ run: (g) => {
223
+ g.worldBorder({ size: shrink.size, seconds: shrink.seconds });
224
+ g.say(shrink.message);
225
+ },
226
+ })),
227
+ on: {
228
+ damaged(_g, { attacker, amount }) {
229
+ if (attacker)
230
+ attacker.damageDealt += amount;
231
+ },
232
+ died(g, { player, killer }) {
233
+ g.say(`${player.name} has been eliminated!`);
234
+ if (killer)
235
+ killer.score = killer.kills;
236
+ },
237
+ },
238
+ end: (g) => g.active.length <= 1,
239
+ endState: (g) => (g.active.length <= 1 ? "last_standing" : "time_up"),
240
+ winners: (g) => (g.active.length === 1 ? g.active.filter((p) => p.deaths === 0) : []),
241
+ onOver(g) {
242
+ const winners = new Set(g.active.length === 1 ? g.active.filter((p) => p.deaths === 0).map((p) => p.name) : []);
243
+ for (const p of g.players) {
244
+ const won = winners.has(p.name);
245
+ g.title(p, won ? "VICTORY" : "DEFEAT", won ? "You won the challenge!" : "You lost the challenge.", {
246
+ fadeIn: 10,
247
+ stay: 100,
248
+ fadeOut: 20,
249
+ });
250
+ }
251
+ },
252
+ });
253
+ //# sourceMappingURL=skywars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skywars.js","sourceRoot":"","sources":["../../../src/runtime/examples/skywars.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ import { type Action, type GameMode, type AnyChallenge, type Block, type Box, type Capability, type Duration, type Effect, type EntityType, type Event, type Json, type Marker, type PlayerSample, type Vec3 } from "./sdk.js";
2
+ /** The state type of a challenge, as `init()` returns it. */
3
+ export type StateOf<Ch extends AnyChallenge> = ReturnType<Ch["init"]>;
4
+ /** JSON with sorted keys, so key order never counts as a difference. */
5
+ export declare const canonical: (v: unknown) => string;
6
+ /**
7
+ * The challenge a test runs against. By default the challenge as imported, in
8
+ * this process: fast, and the rules are the source. When the environment names
9
+ * a built bundle (`KRADLE_CHALLENGE_BUNDLE=<path to kradle-runtime/challenge.js>`,
10
+ * which `kradle challenge test` sets), the bundle is loaded inside the arena's
11
+ * SES sandbox instead: no clock, no random, no timers, and every call gets a
12
+ * fresh compartment. The bundle must be the same challenge as the import.
13
+ * Async because `ses` loads as an ES module: `const c = await sandboxed(source)`.
14
+ */
15
+ export declare function sandboxed<Ch extends AnyChallenge>(challenge: Ch): Promise<Ch>;
16
+ /** A roster entry: the role, or the role with the player's position and sample fields before the first tick. */
17
+ export type RosterEntry = string | ({
18
+ role: string;
19
+ at?: Vec3;
20
+ } & Partial<Omit<PlayerSample, "name" | "participant" | "pos">>);
21
+ export declare class Game<Ch extends AnyChallenge> {
22
+ readonly challenge: Ch;
23
+ state: StateOf<Ch>;
24
+ log: Event[];
25
+ actions: Action[];
26
+ last: Action[];
27
+ /** The harness's tick step, a test setting: server ticks arrive in steps of 4 here (the arena sends every 2 ticks by default). */
28
+ step: number;
29
+ private attempts;
30
+ /** The state this game started from: `init()`, or the checkpoint of `resume`. `replay` starts here. */
31
+ private readonly origin;
32
+ /** Inventory slots the fake players used, per player and item, for this game only. */
33
+ private readonly slots;
34
+ constructor(challenge: Ch, state?: StateOf<Ch>);
35
+ dispatch(event: Event): Action[];
36
+ /** Ticks in steps of `step`, and lands exactly on `serverTick` (the last step is shorter when needed). */
37
+ tickTo(serverTick: number): void;
38
+ tick(n?: number): void;
39
+ /** Advance by a duration: "35s", "2m", or ticks. */
40
+ after(d: Duration | number): void;
41
+ /** Advance until `d` after game start. */
42
+ at(d: Duration | number): void;
43
+ /**
44
+ * run_started, every join, the first tick, and the setup confirmation when the
45
+ * challenge has a setup. A roster entry is a role (`{ alice: "climber" }`), or the
46
+ * role with the player's position and sample fields (`{ alice: { role: "climber",
47
+ * at: { x: 0, y: -60, z: 0 } } }`): the first tick then carries that sample, so
48
+ * `start` and the setup see the position, as they do in the arena. Without `at`
49
+ * the position stays null until the first `moveTo`.
50
+ */
51
+ begin(seed: number, participants: Record<string, RosterEntry>, opts?: {
52
+ params?: Record<string, Json>;
53
+ capabilities?: Capability[];
54
+ setupOk?: boolean;
55
+ locations?: Record<string, Vec3>;
56
+ markers?: Marker[];
57
+ }): this;
58
+ player(name: string): Fake<Ch>;
59
+ custom(name: string, data: Json, player?: string): Action[];
60
+ /** Loads the chunks that cover `box` into the mirror: `block` inside the box, air around it. */
61
+ terrain(box: Box, block: Block, minY?: number, height?: number): Action[];
62
+ /** Blocks changed on the server, by anyone or anything. */
63
+ setBlocks(changes: Array<Vec3 & {
64
+ block: Block;
65
+ by?: string;
66
+ }>): Action[];
67
+ spawnEntity(id: string, type: EntityType, at: Vec3, extra?: Partial<Omit<Extract<Event, {
68
+ type: "entity_spawned";
69
+ }>, "type" | "id" | "entity" | "at">>): Action[];
70
+ /** Entities moved: they arrive with the next tick, so this advances one engine step. */
71
+ moveEntities(moves: Array<{
72
+ id: string;
73
+ pos: Vec3;
74
+ }>): Action[];
75
+ /**
76
+ * One engine tick with several samples at once: participants' positions and
77
+ * fields, and entity moves, all in the same tick, as the engine sends them.
78
+ * A handler that reads another player's position sees this tick for everyone.
79
+ */
80
+ sample(players: Array<{
81
+ name: string;
82
+ } & Partial<Omit<PlayerSample, "name" | "participant">>>, entities?: Array<{
83
+ id: string;
84
+ pos: Vec3;
85
+ }>): Action[];
86
+ removeEntity(id: string, cause?: "died" | "removed", killer?: string): Action[];
87
+ /**
88
+ * The contents of a declared container, as the engine reports them: `items` is the whole
89
+ * content (item to count), laid out one item per slot. `by` names the player who had it open;
90
+ * `initial` marks the first snapshot (no handler fires for it).
91
+ */
92
+ container(at: Vec3, items: Record<string, number>, opts?: {
93
+ by?: string;
94
+ block?: Block;
95
+ initial?: boolean;
96
+ }): Action[];
97
+ /** A game mode change reported by the engine (the `gamemode` event). */
98
+ setGamemode(name: string, gamemode: GameMode): Action[];
99
+ /** A non-participant player's sample (the watcher, a spectator), with the next tick. */
100
+ other(name: string, sample: Omit<PlayerSample, "name" | "participant">): Action[];
101
+ /**
102
+ * The engine's answer to a walk: the last one requested, or the last one for
103
+ * `player` (or with `id`) when several are in flight. A walk that was already
104
+ * answered is skipped.
105
+ */
106
+ walkResult(ok: boolean, detail?: string, which?: {
107
+ player?: string;
108
+ id?: string;
109
+ }): void;
110
+ /** Actions of the last reduction, by type. */
111
+ of<T extends Action["type"]>(type: T): Extract<Action, {
112
+ type: T;
113
+ }>[];
114
+ /** Actions of the whole run, by type. */
115
+ all<T extends Action["type"]>(type: T): Extract<Action, {
116
+ type: T;
117
+ }>[];
118
+ /** Effects of the last reduction, including the ones inside a batch. */
119
+ effects<K extends Effect["kind"]>(kind: K): Extract<Effect, {
120
+ kind: K;
121
+ }>[];
122
+ /** Effects of the whole run, by kind. */
123
+ effectsAll<K extends Effect["kind"]>(kind: K): Extract<Effect, {
124
+ kind: K;
125
+ }>[];
126
+ /** Announcements of the last reduction. `to` omitted = the public ones. */
127
+ announcements(to?: string): string[];
128
+ /** Every announcement of the run, public and private. */
129
+ said(): string[];
130
+ /**
131
+ * The same log through the same reducer instance, from the state this game
132
+ * started with (`init()`, or the checkpoint of `resume`), gives the same final
133
+ * state and the same actions (determinism). It does not prove the absence of
134
+ * hidden module state: that needs a fresh module, which the arena's worker
135
+ * provides. A test calls it; `dispatch` does not.
136
+ */
137
+ replay(): void;
138
+ checkpoint(): string;
139
+ static resume<Ch extends AnyChallenge>(challenge: Ch, json: string): Game<Ch>;
140
+ nextAttempt(): string;
141
+ /** The slot a fake player's item occupies: the one the state shows, else the next free one, for this game only. */
142
+ slotFor(name: string, item: string): number;
143
+ }
144
+ /** A scripted player. Every method dispatches one engine event; the SDK derives the zone edges from moves. */
145
+ export declare class Fake<Ch extends AnyChallenge> {
146
+ private readonly g;
147
+ readonly name: string;
148
+ constructor(g: Game<Ch>, name: string);
149
+ moveTo(to: Partial<Vec3> & {
150
+ y: number;
151
+ }, extrema?: {
152
+ maxY?: number;
153
+ minY?: number;
154
+ }): Action[];
155
+ vote(voteId: string, option: string): {
156
+ accepted: boolean;
157
+ feedback?: string | undefined;
158
+ };
159
+ says(text: string): Action[];
160
+ swings(animation?: "swing" | "swing_off"): Action[];
161
+ hurt(amount: number, cause: string, attacker?: string): Action[];
162
+ dies(cause?: string, killer?: string): Action[];
163
+ respawns(): Action[];
164
+ picksUp(item: `minecraft:${string}`, count?: number, at?: Vec3): Action[];
165
+ /** The player's inventory now holds `count` of `item`: one slot per item name, in this game. */
166
+ has(item: `minecraft:${string}`, count: number): Action[];
167
+ /** Walks into the declared zone (its first corner); the SDK derives the edge. */
168
+ enters(zone: string): Action[];
169
+ /** Walks 100 blocks under the declared zone's first corner. */
170
+ leaves(zone: string): Action[];
171
+ uses(block: `minecraft:${string}`, at: Vec3, item?: `minecraft:${string}`): Action[];
172
+ breaks(block: `minecraft:${string}`, at: Vec3): Action[];
173
+ places(block: `minecraft:${string}`, at: Vec3): Action[];
174
+ private zone;
175
+ }
176
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/runtime/harness.ts"],"names":[],"mappings":"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"}