@provable-games/dm-engine 0.1.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.
- package/dist/actions.d.ts +18 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +88 -0
- package/dist/actions.js.map +1 -0
- package/dist/constants/beast.d.ts +28 -0
- package/dist/constants/beast.d.ts.map +1 -0
- package/dist/constants/beast.js +216 -0
- package/dist/constants/beast.js.map +1 -0
- package/dist/constants/game.d.ts +23 -0
- package/dist/constants/game.d.ts.map +1 -0
- package/dist/constants/game.js +26 -0
- package/dist/constants/game.js.map +1 -0
- package/dist/constants/loot.d.ts +341 -0
- package/dist/constants/loot.d.ts.map +1 -0
- package/dist/constants/loot.js +456 -0
- package/dist/constants/loot.js.map +1 -0
- package/dist/constants/obstacle.d.ts +4 -0
- package/dist/constants/obstacle.d.ts.map +1 -0
- package/dist/constants/obstacle.js +81 -0
- package/dist/constants/obstacle.js.map +1 -0
- package/dist/events.d.ts +50 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/packing.d.ts +6 -0
- package/dist/packing.d.ts.map +1 -0
- package/dist/packing.js +76 -0
- package/dist/packing.js.map +1 -0
- package/dist/protocol.d.ts +55 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +250 -0
- package/dist/protocol.js.map +1 -0
- package/dist/replay.d.ts +35 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +856 -0
- package/dist/replay.js.map +1 -0
- package/dist/rules/beast.d.ts +264 -0
- package/dist/rules/beast.d.ts.map +1 -0
- package/dist/rules/beast.js +535 -0
- package/dist/rules/beast.js.map +1 -0
- package/dist/rules/game.d.ts +35 -0
- package/dist/rules/game.d.ts.map +1 -0
- package/dist/rules/game.js +462 -0
- package/dist/rules/game.js.map +1 -0
- package/dist/rules/gameSimulation.d.ts +158 -0
- package/dist/rules/gameSimulation.d.ts.map +1 -0
- package/dist/rules/gameSimulation.js +845 -0
- package/dist/rules/gameSimulation.js.map +1 -0
- package/dist/rules/health.d.ts +3 -0
- package/dist/rules/health.d.ts.map +1 -0
- package/dist/rules/health.js +7 -0
- package/dist/rules/health.js.map +1 -0
- package/dist/rules/loot.d.ts +100 -0
- package/dist/rules/loot.d.ts.map +1 -0
- package/dist/rules/loot.js +626 -0
- package/dist/rules/loot.js.map +1 -0
- package/dist/rules/market.d.ts +28 -0
- package/dist/rules/market.d.ts.map +1 -0
- package/dist/rules/market.js +83 -0
- package/dist/rules/market.js.map +1 -0
- package/dist/rules/processFutures.d.ts +79 -0
- package/dist/rules/processFutures.d.ts.map +1 -0
- package/dist/rules/processFutures.js +429 -0
- package/dist/rules/processFutures.js.map +1 -0
- package/dist/rules/tokenId.d.ts +31 -0
- package/dist/rules/tokenId.d.ts.map +1 -0
- package/dist/rules/tokenId.js +102 -0
- package/dist/rules/tokenId.js.map +1 -0
- package/dist/staging.d.ts +18 -0
- package/dist/staging.d.ts.map +1 -0
- package/dist/staging.js +27 -0
- package/dist/staging.js.map +1 -0
- package/dist/transcript.d.ts +64 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +92 -0
- package/dist/transcript.js.map +1 -0
- package/dist/types.d.ts +141 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/view.d.ts +4 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +18 -0
- package/dist/view.js.map +1 -0
- package/package.json +51 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Death Mountain engine -- the TypeScript mirror of the Cairo game rules and the
|
|
3
|
+
* commit-reveal protocol.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the client (optimistic/authoritative simulation) and the indexer
|
|
6
|
+
* (off-chain replay of committed transcripts). There is one implementation of the
|
|
7
|
+
* rules; if this and the contracts ever disagree, that is the bug.
|
|
8
|
+
*/
|
|
9
|
+
// Commit-reveal protocol: domains, action codec, root/fold/actionEntropy.
|
|
10
|
+
export * from "./protocol.js";
|
|
11
|
+
export * from "./actions.js";
|
|
12
|
+
export * from "./packing.js";
|
|
13
|
+
export * from "./staging.js";
|
|
14
|
+
export * from "./view.js";
|
|
15
|
+
// Replay.
|
|
16
|
+
export * from "./replay.js";
|
|
17
|
+
export * from "./transcript.js";
|
|
18
|
+
export * from "./events.js";
|
|
19
|
+
// Shared types and constants.
|
|
20
|
+
export * from "./types.js";
|
|
21
|
+
export * as GameConstants from "./constants/game.js";
|
|
22
|
+
export * as BeastConstants from "./constants/beast.js";
|
|
23
|
+
export * as LootConstants from "./constants/loot.js";
|
|
24
|
+
export * as ObstacleConstants from "./constants/obstacle.js";
|
|
25
|
+
// Rules.
|
|
26
|
+
export * from "./rules/beast.js";
|
|
27
|
+
export * from "./rules/game.js";
|
|
28
|
+
export * from "./rules/gameSimulation.js";
|
|
29
|
+
export * from "./rules/health.js";
|
|
30
|
+
export * from "./rules/loot.js";
|
|
31
|
+
export * from "./rules/market.js";
|
|
32
|
+
export * from "./rules/processFutures.js";
|
|
33
|
+
export * from "./rules/tokenId.js";
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0EAA0E;AAC1E,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAE1B,UAAU;AACV,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAE5B,8BAA8B;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAE7D,SAAS;AACT,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Adventurer, Item } from "./types.js";
|
|
2
|
+
export declare function unpackAdventurer(packed: bigint): Adventurer;
|
|
3
|
+
export declare function unpackBag(packed: bigint): Item[];
|
|
4
|
+
export declare function felt252AsU256(value: bigint): [bigint, bigint];
|
|
5
|
+
export declare function decodeTransferTokenId(keys: string[], owner: bigint): bigint;
|
|
6
|
+
//# sourceMappingURL=packing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packing.d.ts","sourceRoot":"","sources":["../src/packing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AASnD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CA4C3D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAShD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAG7D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS3E"}
|
package/dist/packing.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const MASK_16 = 0xffffn;
|
|
2
|
+
const MASK_128 = (1n << 128n) - 1n;
|
|
3
|
+
function unpackItem(raw) {
|
|
4
|
+
return { id: Number(raw & 0x7fn), xp: Number(raw >> 7n) };
|
|
5
|
+
}
|
|
6
|
+
export function unpackAdventurer(packed) {
|
|
7
|
+
let equipment = packed & MASK_128;
|
|
8
|
+
const items = [];
|
|
9
|
+
for (let index = 0; index < 8; index += 1) {
|
|
10
|
+
items.push(unpackItem(equipment & MASK_16));
|
|
11
|
+
equipment >>= 16n;
|
|
12
|
+
}
|
|
13
|
+
let high = packed >> 128n;
|
|
14
|
+
const take = (bits) => {
|
|
15
|
+
const mask = (1n << bits) - 1n;
|
|
16
|
+
const value = Number(high & mask);
|
|
17
|
+
high >>= bits;
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
health: take(10n),
|
|
22
|
+
xp: take(15n),
|
|
23
|
+
gold: take(9n),
|
|
24
|
+
beast_health: take(10n),
|
|
25
|
+
stat_upgrades_available: take(4n),
|
|
26
|
+
stats: {
|
|
27
|
+
strength: take(5n),
|
|
28
|
+
dexterity: take(5n),
|
|
29
|
+
vitality: take(5n),
|
|
30
|
+
intelligence: take(5n),
|
|
31
|
+
wisdom: take(5n),
|
|
32
|
+
charisma: take(5n),
|
|
33
|
+
luck: 0,
|
|
34
|
+
},
|
|
35
|
+
equipment: {
|
|
36
|
+
weapon: items[0],
|
|
37
|
+
chest: items[1],
|
|
38
|
+
head: items[2],
|
|
39
|
+
waist: items[3],
|
|
40
|
+
foot: items[4],
|
|
41
|
+
hand: items[5],
|
|
42
|
+
neck: items[6],
|
|
43
|
+
ring: items[7],
|
|
44
|
+
},
|
|
45
|
+
item_specials_salt: take(14n),
|
|
46
|
+
beast_salt: take(17n),
|
|
47
|
+
level_salt: take(14n),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function unpackBag(packed) {
|
|
51
|
+
const items = [];
|
|
52
|
+
let value = packed;
|
|
53
|
+
for (let index = 0; index < 15; index += 1) {
|
|
54
|
+
const item = unpackItem(value & MASK_16);
|
|
55
|
+
if (item.id !== 0)
|
|
56
|
+
items.push(item);
|
|
57
|
+
value >>= 16n;
|
|
58
|
+
}
|
|
59
|
+
return items;
|
|
60
|
+
}
|
|
61
|
+
export function felt252AsU256(value) {
|
|
62
|
+
if (value < 0n || value >= 1n << 252n)
|
|
63
|
+
throw new Error("game ID must fit felt252");
|
|
64
|
+
return [value & MASK_128, value >> 128n];
|
|
65
|
+
}
|
|
66
|
+
export function decodeTransferTokenId(keys, owner) {
|
|
67
|
+
if (keys.length !== 5 || BigInt(keys[1]) !== 0n || BigInt(keys[2]) !== owner) {
|
|
68
|
+
throw new Error("mint receipt has no matching ERC-721 Transfer event");
|
|
69
|
+
}
|
|
70
|
+
const low = BigInt(keys[3]);
|
|
71
|
+
const high = BigInt(keys[4]);
|
|
72
|
+
if (low >= 1n << 128n || high >= 1n << 124n)
|
|
73
|
+
throw new Error("minted token ID does not fit felt252");
|
|
74
|
+
return low + (high << 128n);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=packing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packing.js","sourceRoot":"","sources":["../src/packing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
2
|
+
export declare const ACTION_ENCODING_VERSION = 1;
|
|
3
|
+
export declare const ROOT_DOMAIN_V1 = 121694572726488482774558358552433875120163030783537n;
|
|
4
|
+
export declare const ACTION_DOMAIN_V1 = 7975375518203149207113456586092306125417059215317358129n;
|
|
5
|
+
export declare const ENTROPY_DOMAIN_V1 = 2041696132660006197021044886039630387199149808693909870129n;
|
|
6
|
+
export declare const Opcode: {
|
|
7
|
+
readonly START: 1;
|
|
8
|
+
readonly EXPLORE: 2;
|
|
9
|
+
readonly ATTACK: 3;
|
|
10
|
+
readonly FLEE: 4;
|
|
11
|
+
readonly SELECT_STATS: 5;
|
|
12
|
+
readonly BUY: 6;
|
|
13
|
+
readonly EQUIP: 7;
|
|
14
|
+
readonly DROP: 8;
|
|
15
|
+
readonly SURRENDER: 9;
|
|
16
|
+
};
|
|
17
|
+
export type OpcodeValue = (typeof Opcode)[keyof typeof Opcode];
|
|
18
|
+
export interface ProtocolStats {
|
|
19
|
+
strength: number;
|
|
20
|
+
dexterity: number;
|
|
21
|
+
vitality: number;
|
|
22
|
+
intelligence: number;
|
|
23
|
+
wisdom: number;
|
|
24
|
+
charisma: number;
|
|
25
|
+
luck?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ProtocolPurchase {
|
|
28
|
+
itemId: number;
|
|
29
|
+
equip: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface DecodedAction {
|
|
32
|
+
opcode: OpcodeValue;
|
|
33
|
+
first: number;
|
|
34
|
+
second: number;
|
|
35
|
+
flag: boolean;
|
|
36
|
+
stats: Required<ProtocolStats>;
|
|
37
|
+
potions: number;
|
|
38
|
+
purchases: ProtocolPurchase[];
|
|
39
|
+
items: number[];
|
|
40
|
+
}
|
|
41
|
+
export declare function root(gameId: bigint): bigint;
|
|
42
|
+
export declare function fold(previous: bigint, encodedAction: bigint, commitBlock: bigint): bigint;
|
|
43
|
+
export declare function actionEntropy(rolling: bigint, nextBlockHash: bigint): bigint;
|
|
44
|
+
export declare function encodeStart(weapon: number): bigint;
|
|
45
|
+
export declare function encodeExplore(tillDamage: number, tillGold: boolean): bigint;
|
|
46
|
+
export declare function encodeAttack(tillHealth: number, tillBeastHealth: number): bigint;
|
|
47
|
+
export declare function encodeFlee(tillHealth: number): bigint;
|
|
48
|
+
export declare function encodeSelectStats(stats: ProtocolStats): bigint;
|
|
49
|
+
export declare function encodeBuy(potions: number, purchases: ProtocolPurchase[]): bigint;
|
|
50
|
+
export declare function encodeEquip(items: number[]): bigint;
|
|
51
|
+
export declare function encodeDrop(items: number[]): bigint;
|
|
52
|
+
export declare function encodeSurrender(): bigint;
|
|
53
|
+
export declare function decodeAction(raw: bigint): DecodedAction;
|
|
54
|
+
export declare function actionOpcode(encoded: bigint): OpcodeValue;
|
|
55
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,cAAc,uDAAuD,CAAC;AACnF,eAAO,MAAM,gBAAgB,2DAA2D,CAAC;AACzF,eAAO,MAAM,iBAAiB,8DAA8D,CAAC;AAE7F,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAwDD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKzF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAG3E;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAIhF;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkB9D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAYhF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAUnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAUlD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAsEvD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAEzD"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { hash } from "starknet";
|
|
2
|
+
export const PROTOCOL_VERSION = 1;
|
|
3
|
+
export const ACTION_ENCODING_VERSION = 1;
|
|
4
|
+
export const ROOT_DOMAIN_V1 = 121694572726488482774558358552433875120163030783537n;
|
|
5
|
+
export const ACTION_DOMAIN_V1 = 7975375518203149207113456586092306125417059215317358129n;
|
|
6
|
+
export const ENTROPY_DOMAIN_V1 = 2041696132660006197021044886039630387199149808693909870129n;
|
|
7
|
+
export const Opcode = {
|
|
8
|
+
START: 1,
|
|
9
|
+
EXPLORE: 2,
|
|
10
|
+
ATTACK: 3,
|
|
11
|
+
FLEE: 4,
|
|
12
|
+
SELECT_STATS: 5,
|
|
13
|
+
BUY: 6,
|
|
14
|
+
EQUIP: 7,
|
|
15
|
+
DROP: 8,
|
|
16
|
+
SURRENDER: 9,
|
|
17
|
+
};
|
|
18
|
+
const HEADER_VERSION = 0x10n;
|
|
19
|
+
const SHIFT_8 = 0x100n;
|
|
20
|
+
const SHIFT_12 = 0x1000n;
|
|
21
|
+
const SHIFT_13 = 0x2000n;
|
|
22
|
+
const SHIFT_16 = 0x10000n;
|
|
23
|
+
const SHIFT_21 = 0x200000n;
|
|
24
|
+
const SHIFT_24 = 0x1000000n;
|
|
25
|
+
const STARTING_WEAPONS = new Set([12, 16, 46, 76]);
|
|
26
|
+
function poseidon(values) {
|
|
27
|
+
return BigInt(hash.computePoseidonHashOnElements(values));
|
|
28
|
+
}
|
|
29
|
+
function header(opcode) {
|
|
30
|
+
return HEADER_VERSION + BigInt(opcode);
|
|
31
|
+
}
|
|
32
|
+
function assertUnsigned(value, bits, name) {
|
|
33
|
+
if (!Number.isInteger(value) || value < 0 || value >= 2 ** bits) {
|
|
34
|
+
throw new Error(`${name} must be an unsigned ${bits}-bit integer`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function assertItem(itemId) {
|
|
38
|
+
if (!Number.isInteger(itemId) || itemId < 1 || itemId > 101) {
|
|
39
|
+
throw new Error("item id must be in [1, 101]");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function bits(value, shift, mask) {
|
|
43
|
+
return (value / shift) & mask;
|
|
44
|
+
}
|
|
45
|
+
function empty(opcode) {
|
|
46
|
+
return {
|
|
47
|
+
opcode,
|
|
48
|
+
first: 0,
|
|
49
|
+
second: 0,
|
|
50
|
+
flag: false,
|
|
51
|
+
stats: {
|
|
52
|
+
strength: 0,
|
|
53
|
+
dexterity: 0,
|
|
54
|
+
vitality: 0,
|
|
55
|
+
intelligence: 0,
|
|
56
|
+
wisdom: 0,
|
|
57
|
+
charisma: 0,
|
|
58
|
+
luck: 0,
|
|
59
|
+
},
|
|
60
|
+
potions: 0,
|
|
61
|
+
purchases: [],
|
|
62
|
+
items: [],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function root(gameId) {
|
|
66
|
+
return poseidon([ROOT_DOMAIN_V1, gameId]);
|
|
67
|
+
}
|
|
68
|
+
export function fold(previous, encodedAction, commitBlock) {
|
|
69
|
+
if (commitBlock < 0n || commitBlock > 0xffffffffffffffffn) {
|
|
70
|
+
throw new Error("commit block must fit u64");
|
|
71
|
+
}
|
|
72
|
+
return poseidon([ACTION_DOMAIN_V1, previous, encodedAction, commitBlock]);
|
|
73
|
+
}
|
|
74
|
+
export function actionEntropy(rolling, nextBlockHash) {
|
|
75
|
+
return poseidon([ENTROPY_DOMAIN_V1, rolling, nextBlockHash]);
|
|
76
|
+
}
|
|
77
|
+
export function encodeStart(weapon) {
|
|
78
|
+
if (!STARTING_WEAPONS.has(weapon))
|
|
79
|
+
throw new Error("invalid starting weapon");
|
|
80
|
+
return header(Opcode.START) + SHIFT_8 * BigInt(weapon);
|
|
81
|
+
}
|
|
82
|
+
export function encodeExplore(tillDamage, tillGold) {
|
|
83
|
+
assertUnsigned(tillDamage, 16, "tillDamage");
|
|
84
|
+
return header(Opcode.EXPLORE) + SHIFT_8 * BigInt(tillDamage) + (tillGold ? SHIFT_24 : 0n);
|
|
85
|
+
}
|
|
86
|
+
export function encodeAttack(tillHealth, tillBeastHealth) {
|
|
87
|
+
assertUnsigned(tillHealth, 16, "tillHealth");
|
|
88
|
+
assertUnsigned(tillBeastHealth, 16, "tillBeastHealth");
|
|
89
|
+
return header(Opcode.ATTACK) + SHIFT_8 * BigInt(tillHealth) + SHIFT_24 * BigInt(tillBeastHealth);
|
|
90
|
+
}
|
|
91
|
+
export function encodeFlee(tillHealth) {
|
|
92
|
+
assertUnsigned(tillHealth, 16, "tillHealth");
|
|
93
|
+
return header(Opcode.FLEE) + SHIFT_8 * BigInt(tillHealth);
|
|
94
|
+
}
|
|
95
|
+
export function encodeSelectStats(stats) {
|
|
96
|
+
const ordered = [
|
|
97
|
+
stats.strength,
|
|
98
|
+
stats.dexterity,
|
|
99
|
+
stats.vitality,
|
|
100
|
+
stats.intelligence,
|
|
101
|
+
stats.wisdom,
|
|
102
|
+
stats.charisma,
|
|
103
|
+
];
|
|
104
|
+
for (const [index, value] of ordered.entries())
|
|
105
|
+
assertUnsigned(value, 5, `stat[${index}]`);
|
|
106
|
+
if ((stats.luck ?? 0) !== 0)
|
|
107
|
+
throw new Error("luck allocation is unsupported");
|
|
108
|
+
let encoded = header(Opcode.SELECT_STATS);
|
|
109
|
+
let cursor = SHIFT_8;
|
|
110
|
+
for (const value of ordered) {
|
|
111
|
+
encoded += cursor * BigInt(value);
|
|
112
|
+
cursor *= 0x20n;
|
|
113
|
+
}
|
|
114
|
+
return encoded;
|
|
115
|
+
}
|
|
116
|
+
export function encodeBuy(potions, purchases) {
|
|
117
|
+
assertUnsigned(potions, 8, "potions");
|
|
118
|
+
if (purchases.length > 23)
|
|
119
|
+
throw new Error("at most 23 purchases are supported");
|
|
120
|
+
let encoded = header(Opcode.BUY) + SHIFT_8 * BigInt(potions) + SHIFT_16 * BigInt(purchases.length);
|
|
121
|
+
let cursor = SHIFT_21;
|
|
122
|
+
for (const purchase of purchases) {
|
|
123
|
+
assertItem(purchase.itemId);
|
|
124
|
+
encoded += cursor * (BigInt(purchase.itemId) + (purchase.equip ? 0x100n : 0n));
|
|
125
|
+
cursor *= 0x200n;
|
|
126
|
+
}
|
|
127
|
+
return encoded;
|
|
128
|
+
}
|
|
129
|
+
export function encodeEquip(items) {
|
|
130
|
+
if (items.length < 1 || items.length > 8)
|
|
131
|
+
throw new Error("equip count must be in [1, 8]");
|
|
132
|
+
let encoded = header(Opcode.EQUIP) + SHIFT_8 * BigInt(items.length);
|
|
133
|
+
let cursor = SHIFT_12;
|
|
134
|
+
for (const item of items) {
|
|
135
|
+
assertItem(item);
|
|
136
|
+
encoded += cursor * BigInt(item);
|
|
137
|
+
cursor *= 0x100n;
|
|
138
|
+
}
|
|
139
|
+
return encoded;
|
|
140
|
+
}
|
|
141
|
+
export function encodeDrop(items) {
|
|
142
|
+
if (items.length < 1 || items.length > 23)
|
|
143
|
+
throw new Error("drop count must be in [1, 23]");
|
|
144
|
+
let encoded = header(Opcode.DROP) + SHIFT_8 * BigInt(items.length);
|
|
145
|
+
let cursor = SHIFT_13;
|
|
146
|
+
for (const item of items) {
|
|
147
|
+
assertItem(item);
|
|
148
|
+
encoded += cursor * BigInt(item);
|
|
149
|
+
cursor *= 0x100n;
|
|
150
|
+
}
|
|
151
|
+
return encoded;
|
|
152
|
+
}
|
|
153
|
+
export function encodeSurrender() {
|
|
154
|
+
return header(Opcode.SURRENDER);
|
|
155
|
+
}
|
|
156
|
+
export function decodeAction(raw) {
|
|
157
|
+
if (raw < 0n)
|
|
158
|
+
throw new Error("encoded action cannot be negative");
|
|
159
|
+
if (Number(bits(raw, 0x10n, 0xfn)) !== ACTION_ENCODING_VERSION) {
|
|
160
|
+
throw new Error("bad action version");
|
|
161
|
+
}
|
|
162
|
+
const opcode = Number(raw & 0xfn);
|
|
163
|
+
const action = empty(opcode);
|
|
164
|
+
if (opcode === Opcode.START) {
|
|
165
|
+
if (raw >= 0x10000n)
|
|
166
|
+
throw new Error("noncanonical START");
|
|
167
|
+
action.first = Number(bits(raw, SHIFT_8, 0xffn));
|
|
168
|
+
if (!STARTING_WEAPONS.has(action.first))
|
|
169
|
+
throw new Error("invalid starting weapon");
|
|
170
|
+
}
|
|
171
|
+
else if (opcode === Opcode.EXPLORE) {
|
|
172
|
+
if (raw >= 0x2000000n)
|
|
173
|
+
throw new Error("noncanonical EXPLORE");
|
|
174
|
+
action.first = Number(bits(raw, SHIFT_8, 0xffffn));
|
|
175
|
+
action.flag = bits(raw, SHIFT_24, 1n) === 1n;
|
|
176
|
+
}
|
|
177
|
+
else if (opcode === Opcode.ATTACK) {
|
|
178
|
+
if (raw >= 0x10000000000n)
|
|
179
|
+
throw new Error("noncanonical ATTACK");
|
|
180
|
+
action.first = Number(bits(raw, SHIFT_8, 0xffffn));
|
|
181
|
+
action.second = Number(bits(raw, SHIFT_24, 0xffffn));
|
|
182
|
+
}
|
|
183
|
+
else if (opcode === Opcode.FLEE) {
|
|
184
|
+
if (raw >= 0x1000000n)
|
|
185
|
+
throw new Error("noncanonical FLEE");
|
|
186
|
+
action.first = Number(bits(raw, SHIFT_8, 0xffffn));
|
|
187
|
+
}
|
|
188
|
+
else if (opcode === Opcode.SELECT_STATS) {
|
|
189
|
+
if (raw >= 0x4000000000n)
|
|
190
|
+
throw new Error("noncanonical SELECT_STATS");
|
|
191
|
+
let cursor = SHIFT_8;
|
|
192
|
+
const values = [];
|
|
193
|
+
for (let index = 0; index < 6; index += 1) {
|
|
194
|
+
values.push(Number(bits(raw, cursor, 0x1fn)));
|
|
195
|
+
cursor *= 0x20n;
|
|
196
|
+
}
|
|
197
|
+
[
|
|
198
|
+
action.stats.strength,
|
|
199
|
+
action.stats.dexterity,
|
|
200
|
+
action.stats.vitality,
|
|
201
|
+
action.stats.intelligence,
|
|
202
|
+
action.stats.wisdom,
|
|
203
|
+
action.stats.charisma,
|
|
204
|
+
] = values;
|
|
205
|
+
}
|
|
206
|
+
else if (opcode === Opcode.BUY) {
|
|
207
|
+
action.potions = Number(bits(raw, SHIFT_8, 0xffn));
|
|
208
|
+
const count = Number(bits(raw, SHIFT_16, 0x1fn));
|
|
209
|
+
if (count > 23)
|
|
210
|
+
throw new Error("invalid BUY count");
|
|
211
|
+
let cursor = SHIFT_21;
|
|
212
|
+
for (let index = 0; index < count; index += 1) {
|
|
213
|
+
const entry = bits(raw, cursor, 0x1ffn);
|
|
214
|
+
const itemId = Number(entry & 0xffn);
|
|
215
|
+
assertItem(itemId);
|
|
216
|
+
action.purchases.push({ itemId, equip: (entry & 0x100n) !== 0n });
|
|
217
|
+
cursor *= 0x200n;
|
|
218
|
+
}
|
|
219
|
+
if (raw >= cursor)
|
|
220
|
+
throw new Error("noncanonical BUY");
|
|
221
|
+
}
|
|
222
|
+
else if (opcode === Opcode.EQUIP || opcode === Opcode.DROP) {
|
|
223
|
+
const shift = opcode === Opcode.EQUIP ? SHIFT_12 : SHIFT_13;
|
|
224
|
+
const count = Number(bits(raw, SHIFT_8, opcode === Opcode.EQUIP ? 0xfn : 0x1fn));
|
|
225
|
+
const max = opcode === Opcode.EQUIP ? 8 : 23;
|
|
226
|
+
if (count < 1 || count > max)
|
|
227
|
+
throw new Error("invalid item count");
|
|
228
|
+
let cursor = shift;
|
|
229
|
+
for (let index = 0; index < count; index += 1) {
|
|
230
|
+
const itemId = Number(bits(raw, cursor, 0xffn));
|
|
231
|
+
assertItem(itemId);
|
|
232
|
+
action.items.push(itemId);
|
|
233
|
+
cursor *= 0x100n;
|
|
234
|
+
}
|
|
235
|
+
if (raw >= cursor)
|
|
236
|
+
throw new Error("noncanonical item action");
|
|
237
|
+
}
|
|
238
|
+
else if (opcode === Opcode.SURRENDER) {
|
|
239
|
+
if (raw >= 0x100n)
|
|
240
|
+
throw new Error("noncanonical SURRENDER");
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
throw new Error("unknown opcode");
|
|
244
|
+
}
|
|
245
|
+
return action;
|
|
246
|
+
}
|
|
247
|
+
export function actionOpcode(encoded) {
|
|
248
|
+
return decodeAction(encoded).opcode;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/replay.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Adventurer, GameAction, GameSettingsData, Item } from "./types.js";
|
|
2
|
+
import { Beast } from "./types.js";
|
|
3
|
+
import { GameEvent } from "./events.js";
|
|
4
|
+
/** Everything the handlers read that used to live in the client's zustand store. */
|
|
5
|
+
export interface ReplayState {
|
|
6
|
+
adventurer: Adventurer | null;
|
|
7
|
+
bag: Item[];
|
|
8
|
+
beast: Beast | null;
|
|
9
|
+
gameSettings: GameSettingsData | null;
|
|
10
|
+
/** Last chain-confirmed adventurer; `equip` diffs against it to find what changed. */
|
|
11
|
+
adventurerState: Adventurer | null;
|
|
12
|
+
gameId: string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Whether `adventurer.equipment` and `bag` already reflect a pending `equip`.
|
|
15
|
+
*
|
|
16
|
+
* True for the client, whose zustand store equips optimistically the moment the player taps
|
|
17
|
+
* an item, so by the time the action runs the move has happened. False for the off-chain
|
|
18
|
+
* replayer, which holds the state as of the last completed action and must perform the move
|
|
19
|
+
* itself. Defaults to true so the client's behaviour is the one you get by omission.
|
|
20
|
+
*/
|
|
21
|
+
equipmentApplied?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Apply one action to `state` and return the events it produced.
|
|
25
|
+
*
|
|
26
|
+
* This is `useGameCore`'s body verbatim, with the store reads replaced by `state` and the
|
|
27
|
+
* `actionEntropy` reads replaced by `entropy`. It is pure: no store, no RPC, no `Date`, and
|
|
28
|
+
* -- when `entropy` is non-null -- no `Math.random()`. That last property is what lets the
|
|
29
|
+
* client and the off-chain replayer agree, and it is asserted by the entropy test suite.
|
|
30
|
+
*
|
|
31
|
+
* `entropy` is `action_entropy(rolling_i, blockhash)` for a commit-reveal game, or `null` for
|
|
32
|
+
* a legacy dungeon, where the handlers fall back to a settings `game_seed` or `Math.random()`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function applyAction(state: ReplayState, action: GameAction, entropy: bigint | null): GameEvent[];
|
|
35
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2JxC,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,IAAI,EAAE,CAAC;IACZ,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,sFAAsF;IACtF,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,SAAS,EAAE,CAo5Bb"}
|