@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.
Files changed (89) hide show
  1. package/dist/actions.d.ts +18 -0
  2. package/dist/actions.d.ts.map +1 -0
  3. package/dist/actions.js +88 -0
  4. package/dist/actions.js.map +1 -0
  5. package/dist/constants/beast.d.ts +28 -0
  6. package/dist/constants/beast.d.ts.map +1 -0
  7. package/dist/constants/beast.js +216 -0
  8. package/dist/constants/beast.js.map +1 -0
  9. package/dist/constants/game.d.ts +23 -0
  10. package/dist/constants/game.d.ts.map +1 -0
  11. package/dist/constants/game.js +26 -0
  12. package/dist/constants/game.js.map +1 -0
  13. package/dist/constants/loot.d.ts +341 -0
  14. package/dist/constants/loot.d.ts.map +1 -0
  15. package/dist/constants/loot.js +456 -0
  16. package/dist/constants/loot.js.map +1 -0
  17. package/dist/constants/obstacle.d.ts +4 -0
  18. package/dist/constants/obstacle.d.ts.map +1 -0
  19. package/dist/constants/obstacle.js +81 -0
  20. package/dist/constants/obstacle.js.map +1 -0
  21. package/dist/events.d.ts +50 -0
  22. package/dist/events.d.ts.map +1 -0
  23. package/dist/events.js +2 -0
  24. package/dist/events.js.map +1 -0
  25. package/dist/index.d.ts +30 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +34 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/packing.d.ts +6 -0
  30. package/dist/packing.d.ts.map +1 -0
  31. package/dist/packing.js +76 -0
  32. package/dist/packing.js.map +1 -0
  33. package/dist/protocol.d.ts +55 -0
  34. package/dist/protocol.d.ts.map +1 -0
  35. package/dist/protocol.js +250 -0
  36. package/dist/protocol.js.map +1 -0
  37. package/dist/replay.d.ts +35 -0
  38. package/dist/replay.d.ts.map +1 -0
  39. package/dist/replay.js +856 -0
  40. package/dist/replay.js.map +1 -0
  41. package/dist/rules/beast.d.ts +264 -0
  42. package/dist/rules/beast.d.ts.map +1 -0
  43. package/dist/rules/beast.js +535 -0
  44. package/dist/rules/beast.js.map +1 -0
  45. package/dist/rules/game.d.ts +35 -0
  46. package/dist/rules/game.d.ts.map +1 -0
  47. package/dist/rules/game.js +462 -0
  48. package/dist/rules/game.js.map +1 -0
  49. package/dist/rules/gameSimulation.d.ts +158 -0
  50. package/dist/rules/gameSimulation.d.ts.map +1 -0
  51. package/dist/rules/gameSimulation.js +845 -0
  52. package/dist/rules/gameSimulation.js.map +1 -0
  53. package/dist/rules/health.d.ts +3 -0
  54. package/dist/rules/health.d.ts.map +1 -0
  55. package/dist/rules/health.js +7 -0
  56. package/dist/rules/health.js.map +1 -0
  57. package/dist/rules/loot.d.ts +100 -0
  58. package/dist/rules/loot.d.ts.map +1 -0
  59. package/dist/rules/loot.js +626 -0
  60. package/dist/rules/loot.js.map +1 -0
  61. package/dist/rules/market.d.ts +28 -0
  62. package/dist/rules/market.d.ts.map +1 -0
  63. package/dist/rules/market.js +83 -0
  64. package/dist/rules/market.js.map +1 -0
  65. package/dist/rules/processFutures.d.ts +79 -0
  66. package/dist/rules/processFutures.d.ts.map +1 -0
  67. package/dist/rules/processFutures.js +429 -0
  68. package/dist/rules/processFutures.js.map +1 -0
  69. package/dist/rules/tokenId.d.ts +31 -0
  70. package/dist/rules/tokenId.d.ts.map +1 -0
  71. package/dist/rules/tokenId.js +102 -0
  72. package/dist/rules/tokenId.js.map +1 -0
  73. package/dist/staging.d.ts +18 -0
  74. package/dist/staging.d.ts.map +1 -0
  75. package/dist/staging.js +27 -0
  76. package/dist/staging.js.map +1 -0
  77. package/dist/transcript.d.ts +64 -0
  78. package/dist/transcript.d.ts.map +1 -0
  79. package/dist/transcript.js +92 -0
  80. package/dist/transcript.js.map +1 -0
  81. package/dist/types.d.ts +141 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/view.d.ts +4 -0
  86. package/dist/view.d.ts.map +1 -0
  87. package/dist/view.js +18 -0
  88. package/dist/view.js.map +1 -0
  89. package/package.json +51 -0
@@ -0,0 +1,28 @@
1
+ import type { Equipment, Item } from "../types.js";
2
+ import { Tier } from "./loot.js";
3
+ export interface MarketItem {
4
+ id: number;
5
+ name: string;
6
+ tier: Tier;
7
+ type: string;
8
+ slot: string;
9
+ imageUrl: string;
10
+ price: number;
11
+ }
12
+ export type BagPreviewEntry = {
13
+ kind: "pending";
14
+ item: MarketItem;
15
+ } | {
16
+ kind: "displaced";
17
+ item: Item;
18
+ };
19
+ export interface CartPlacementPreview {
20
+ equipment: Record<string, MarketItem>;
21
+ bag: BagPreviewEntry[];
22
+ }
23
+ export declare function previewCartPlacement(cartItems: MarketItem[], equipment: Equipment | undefined): CartPlacementPreview;
24
+ export declare function generateMarketItems(marketItemIds: number[], charisma: number): MarketItem[];
25
+ export declare function getLevelSeed(levelSalt: number, adventurerId: bigint | string): number;
26
+ export declare function getAvailableItems(adventurerId: bigint | string, seed: number, marketSize: number): number[];
27
+ export declare function potionPrice(level: number, charisma: number): number;
28
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/rules/market.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAa,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAEvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAGrC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,GAAG,EAAE,eAAe,EAAE,CAAC;CACxB;AASD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,UAAU,EAAE,EACvB,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,oBAAoB,CA6BtB;AAqBD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAG3F;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIrF;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAiBV;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,83 @@
1
+ import * as starknet from "@scure/starknet";
2
+ import { ItemUtils, Tier } from "./loot.js";
3
+ // Mirrors the checkout shouldEquip rules in the Market/Explore overlays: the
4
+ // first cart item for an empty equipment slot equips on purchase, a T1/T2
5
+ // weapon equips over an equipped T5 weapon (displacing it to the bag, with the
6
+ // last such weapon in the cart winning the slot), and every other cart item
7
+ // goes to the bag. Bag entries are ordered the way the buy replay bags them —
8
+ // purchases in cart order, with displaced equipment inserted at the point its
9
+ // replacement is processed — so ghost slots keep their position on purchase.
10
+ export function previewCartPlacement(cartItems, equipment) {
11
+ const equipmentPreview = {};
12
+ const bagPreview = [];
13
+ const slotsToEquip = new Set();
14
+ cartItems.forEach((item) => {
15
+ const slot = ItemUtils.getItemSlot(item.id).toLowerCase();
16
+ const slotEmpty = equipment?.[slot]?.id === 0;
17
+ const shouldEquip = (slotEmpty && !slotsToEquip.has(slot)) ||
18
+ (slot === "weapon" &&
19
+ [Tier.T1, Tier.T2].includes(ItemUtils.getItemTier(item.id)) &&
20
+ ItemUtils.getItemTier(equipment?.weapon?.id ?? 0) === Tier.T5);
21
+ if (shouldEquip) {
22
+ slotsToEquip.add(slot);
23
+ const previous = equipmentPreview[slot];
24
+ if (previous) {
25
+ bagPreview.push({ kind: "pending", item: previous });
26
+ }
27
+ else if (!slotEmpty) {
28
+ bagPreview.push({ kind: "displaced", item: equipment[slot] });
29
+ }
30
+ equipmentPreview[slot] = item;
31
+ }
32
+ else {
33
+ bagPreview.push({ kind: "pending", item });
34
+ }
35
+ });
36
+ return { equipment: equipmentPreview, bag: bagPreview };
37
+ }
38
+ function createMarketItem(id, charisma) {
39
+ const tier = ItemUtils.getItemTier(id);
40
+ const price = ItemUtils.getItemPrice(tier, charisma);
41
+ const name = ItemUtils.getItemName(id);
42
+ const type = ItemUtils.getItemType(id);
43
+ const slot = ItemUtils.getItemSlot(id);
44
+ const imageUrl = ItemUtils.getItemImage(id);
45
+ return {
46
+ id,
47
+ name,
48
+ tier,
49
+ type,
50
+ slot,
51
+ imageUrl,
52
+ price,
53
+ };
54
+ }
55
+ export function generateMarketItems(marketItemIds, charisma) {
56
+ const items = marketItemIds.map((id) => createMarketItem(id, charisma));
57
+ return items;
58
+ }
59
+ export function getLevelSeed(levelSalt, adventurerId) {
60
+ if (levelSalt === 0)
61
+ return 0;
62
+ const hash = starknet.poseidonHashMany([BigInt(levelSalt), BigInt(adventurerId)]);
63
+ return Number(BigInt(hash) % 0x10000n);
64
+ }
65
+ export function getAvailableItems(adventurerId, seed, marketSize) {
66
+ const hash = starknet.poseidonHashMany([BigInt(adventurerId), BigInt(seed)]);
67
+ let remaining = BigInt(hash);
68
+ const results = [];
69
+ let passes = 0;
70
+ while (passes < 31 && results.length < marketSize) {
71
+ const byte = Number(remaining & 0xffn);
72
+ remaining = remaining >> 8n;
73
+ passes++;
74
+ if (byte < 202) {
75
+ results.push((byte % 101) + 1);
76
+ }
77
+ }
78
+ return results;
79
+ }
80
+ export function potionPrice(level, charisma) {
81
+ return Math.max(1, level - charisma * 2);
82
+ }
83
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/rules/market.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { Beast } from "../types.js";
2
+ export interface Encounter {
3
+ encounter: string;
4
+ id?: bigint;
5
+ type: string;
6
+ tier: string | number;
7
+ level?: number;
8
+ power?: number;
9
+ gold?: number;
10
+ health?: number;
11
+ location?: string;
12
+ dodgeRoll?: number;
13
+ nextXp: number;
14
+ specialName?: string;
15
+ isCritical?: boolean;
16
+ damage?: number;
17
+ xp: number;
18
+ adventurerLevel?: number;
19
+ }
20
+ export declare function getRandomness(xp: number, adventurerEntropy: bigint): {
21
+ rnd1: bigint;
22
+ rnd2: bigint;
23
+ rnd3: bigint;
24
+ rnd4: bigint;
25
+ rnd5: bigint;
26
+ rnd6: bigint;
27
+ rnd7: bigint;
28
+ rnd8: bigint;
29
+ };
30
+ export declare function getBattleRandomness(xp: number, battleCount: number, seed: bigint): {
31
+ rnd1: bigint;
32
+ rnd2: bigint;
33
+ rnd3: bigint;
34
+ rnd4: bigint;
35
+ };
36
+ export declare function get_simple_entropy(adventurer_xp: number, input_seed: number): bigint;
37
+ export declare function felt_to_two_u64(felt: bigint): {
38
+ u64_1: bigint;
39
+ u64_2: bigint;
40
+ };
41
+ /**
42
+ * `ImplAdventurer::get_beast_entropy` -- the u64 that fixes which beast a given encounter is.
43
+ *
44
+ * Mirrors `poseidon_hash_span([beast_salt, adventurer_id, xp]) % 2^64`. Note it is keyed on the
45
+ * adventurer's stored `beast_salt`, so the salt has to be written BEFORE this is called: the
46
+ * contract sets `beast_salt = (explore_seed & 0x1ffff) | 1` on the encounter branch and then hashes
47
+ * it. Deriving the beast before updating the salt yields a different beast entirely.
48
+ */
49
+ export declare function getBeastEntropy(beastSalt: number, adventurerId: string | bigint, xp: number): bigint;
50
+ /**
51
+ * `ImplStats::generate_starting_stats` -- the level 1 -> 2 allocation, seeded.
52
+ *
53
+ * Twelve points dealt out by repeated `divmod 6` over the level seed, in the contract's stat order.
54
+ * The unseeded sibling in `gameSimulation.ts` draws the same twelve points at random.
55
+ */
56
+ export declare function generateStartingStatsFromSeed(seed: bigint): {
57
+ strength: number;
58
+ dexterity: number;
59
+ vitality: number;
60
+ intelligence: number;
61
+ wisdom: number;
62
+ charisma: number;
63
+ luck: number;
64
+ };
65
+ /**
66
+ * The beast an encounter produces, from an already-derived `get_beast_entropy` value.
67
+ *
68
+ * `getBeastFromSeed` is the settings-`game_seed` entry point into the same computation; this one is
69
+ * for block-hash mode, where the entropy comes from `beast_salt` + the revealed block hash instead.
70
+ * Both land on the identical `(rnd1, rnd3, rnd4, rnd5, rnd6)` -> `beastEncounter` mapping, which is
71
+ * the client's copy of `ImplBeast::get_beast`.
72
+ *
73
+ * Only valid for adventurer level >= 2. At level 1 the contract ignores all of this and returns the
74
+ * fixed starter beast for the equipped weapon type.
75
+ */
76
+ export declare const getBeastFromEntropy: (adventurer_xp: number, beastEntropy: bigint) => Beast;
77
+ export declare const getBeastFromSeed: (adventurer_xp: number, entropy: number) => Beast;
78
+ export declare function listAllEncounters(xp: number, entropy: number, adventurerLevel: number, hasBeast: boolean): Encounter[];
79
+ //# sourceMappingURL=processFutures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processFutures.d.ts","sourceRoot":"","sources":["../../src/rules/processFutures.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQpC,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0CD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;;;;;;;;;EAgBlE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;EAWhF;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAU9E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,EAAE,EAAE,MAAM,GACT,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG;IAC3D,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,EAAE,MAAM,CAAC;CACd,CAwBA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAAe,MAAM,EAAE,cAAc,MAAM,KAAG,KACzC,CAAC;AAE1C,eAAO,MAAM,gBAAgB,GAAI,eAAe,MAAM,EAAE,SAAS,MAAM,KAAG,KAIzE,CAAC;AAwIF,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,GAChB,SAAS,EAAE,CASb"}
@@ -0,0 +1,429 @@
1
+ import * as starknet from "@scure/starknet";
2
+ import { BEAST_NAME_PREFIXES, BEAST_NAME_SUFFIXES, BEAST_NAMES, BEAST_SPECIAL_NAME_LEVEL_UNLOCK, } from "../constants/beast.js";
3
+ const MAX_ID = BigInt(75);
4
+ const TWO_POW_64_NZ = BigInt("18446744073709551616");
5
+ const TWO_POW_32_NZ = BigInt("4294967296");
6
+ const TWO_POW_16_NZ = BigInt("65536");
7
+ const TWO_POW_8_NZ = BigInt("256");
8
+ function getLower128Bits(bigInt) {
9
+ // Create a mask with 128 1's
10
+ const mask = (1n << 128n) - 1n;
11
+ // Use bitwise AND to keep only the lower 128 bits
12
+ return bigInt & mask;
13
+ }
14
+ function split_poseidon(poseidon) {
15
+ const u128_low = getLower128Bits(poseidon);
16
+ const rnd1_u64 = u128_low / TWO_POW_64_NZ;
17
+ const rnd2_u64 = u128_low % TWO_POW_64_NZ;
18
+ const rnd1_u32 = rnd1_u64 / TWO_POW_32_NZ;
19
+ const rnd2_u32 = rnd1_u64 % TWO_POW_32_NZ;
20
+ const rnd3_u32 = rnd2_u64 / TWO_POW_32_NZ;
21
+ const rnd4_u32 = rnd2_u64 % TWO_POW_32_NZ;
22
+ const rnd1_u16 = rnd3_u32 / TWO_POW_16_NZ;
23
+ const rnd2_u16 = rnd3_u32 % TWO_POW_16_NZ;
24
+ const rnd3_u16 = rnd4_u32 / TWO_POW_16_NZ;
25
+ const rnd4_u16 = rnd4_u32 % TWO_POW_16_NZ;
26
+ const rnd1_u8 = rnd3_u16 / TWO_POW_8_NZ;
27
+ const rnd2_u8 = rnd3_u16 % TWO_POW_8_NZ;
28
+ const rnd3_u8 = rnd4_u16 / TWO_POW_8_NZ;
29
+ const rnd4_u8 = rnd4_u16 % TWO_POW_8_NZ;
30
+ return {
31
+ rnd1_u32,
32
+ rnd2_u32,
33
+ rnd1_u16,
34
+ rnd2_u16,
35
+ rnd1_u8,
36
+ rnd2_u8,
37
+ rnd3_u8,
38
+ rnd4_u8,
39
+ };
40
+ }
41
+ export function getRandomness(xp, adventurerEntropy) {
42
+ const params = [BigInt(xp), adventurerEntropy];
43
+ const poseidon = starknet.poseidonHashMany(params);
44
+ const { rnd1_u32, rnd2_u32, rnd1_u16, rnd2_u16, rnd1_u8, rnd2_u8, rnd3_u8, rnd4_u8 } = split_poseidon(poseidon);
45
+ return {
46
+ rnd1: rnd1_u32,
47
+ rnd2: rnd2_u32,
48
+ rnd3: rnd1_u16,
49
+ rnd4: rnd2_u16,
50
+ rnd5: rnd1_u8,
51
+ rnd6: rnd2_u8,
52
+ rnd7: rnd3_u8,
53
+ rnd8: rnd4_u8,
54
+ };
55
+ }
56
+ export function getBattleRandomness(xp, battleCount, seed) {
57
+ const poseidon = starknet.poseidonHashMany([BigInt(xp), seed, BigInt(battleCount)]);
58
+ const u32 = poseidon & ((1n << 32n) - 1n);
59
+ const rnd1_u16 = u32 / TWO_POW_16_NZ;
60
+ const rnd2_u16 = u32 % TWO_POW_16_NZ;
61
+ return {
62
+ rnd1: rnd1_u16 / TWO_POW_8_NZ,
63
+ rnd2: rnd1_u16 % TWO_POW_8_NZ,
64
+ rnd3: rnd2_u16 / TWO_POW_8_NZ,
65
+ rnd4: rnd2_u16 % TWO_POW_8_NZ,
66
+ };
67
+ }
68
+ export function get_simple_entropy(adventurer_xp, input_seed) {
69
+ const params = [BigInt(adventurer_xp), BigInt(input_seed)];
70
+ return starknet.poseidonHashMany(params);
71
+ }
72
+ export function felt_to_two_u64(felt) {
73
+ // Create a mask with 128 1's
74
+ const mask = (1n << 128n) - 1n;
75
+ // Get lower 128 bits
76
+ const u128 = felt & mask;
77
+ // Split into two u64s
78
+ return {
79
+ u64_1: u128 / TWO_POW_64_NZ,
80
+ u64_2: u128 % TWO_POW_64_NZ,
81
+ };
82
+ }
83
+ /**
84
+ * `ImplAdventurer::get_beast_entropy` -- the u64 that fixes which beast a given encounter is.
85
+ *
86
+ * Mirrors `poseidon_hash_span([beast_salt, adventurer_id, xp]) % 2^64`. Note it is keyed on the
87
+ * adventurer's stored `beast_salt`, so the salt has to be written BEFORE this is called: the
88
+ * contract sets `beast_salt = (explore_seed & 0x1ffff) | 1` on the encounter branch and then hashes
89
+ * it. Deriving the beast before updating the salt yields a different beast entirely.
90
+ */
91
+ export function getBeastEntropy(beastSalt, adventurerId, xp) {
92
+ const hash = starknet.poseidonHashMany([BigInt(beastSalt), BigInt(adventurerId), BigInt(xp)]);
93
+ return hash % TWO_POW_64_NZ;
94
+ }
95
+ /**
96
+ * `ImplStats::generate_starting_stats` -- the level 1 -> 2 allocation, seeded.
97
+ *
98
+ * Twelve points dealt out by repeated `divmod 6` over the level seed, in the contract's stat order.
99
+ * The unseeded sibling in `gameSimulation.ts` draws the same twelve points at random.
100
+ */
101
+ export function generateStartingStatsFromSeed(seed) {
102
+ const stats = {
103
+ strength: 0,
104
+ dexterity: 0,
105
+ vitality: 0,
106
+ intelligence: 0,
107
+ wisdom: 0,
108
+ charisma: 0,
109
+ luck: 0,
110
+ };
111
+ const order = [
112
+ "strength",
113
+ "dexterity",
114
+ "vitality",
115
+ "intelligence",
116
+ "wisdom",
117
+ "charisma",
118
+ ];
119
+ let entropy = seed & (TWO_POW_64_NZ - 1n);
120
+ for (let i = 0; i < 12; i += 1) {
121
+ stats[order[Number(entropy % 6n)]] += 1;
122
+ entropy /= 6n;
123
+ }
124
+ return stats;
125
+ }
126
+ /**
127
+ * The beast an encounter produces, from an already-derived `get_beast_entropy` value.
128
+ *
129
+ * `getBeastFromSeed` is the settings-`game_seed` entry point into the same computation; this one is
130
+ * for block-hash mode, where the entropy comes from `beast_salt` + the revealed block hash instead.
131
+ * Both land on the identical `(rnd1, rnd3, rnd4, rnd5, rnd6)` -> `beastEncounter` mapping, which is
132
+ * the client's copy of `ImplBeast::get_beast`.
133
+ *
134
+ * Only valid for adventurer level >= 2. At level 1 the contract ignores all of this and returns the
135
+ * fixed starter beast for the equipped weapon type.
136
+ */
137
+ export const getBeastFromEntropy = (adventurer_xp, beastEntropy) => buildBeast(adventurer_xp, beastEntropy);
138
+ export const getBeastFromSeed = (adventurer_xp, entropy) => {
139
+ const felt = get_simple_entropy(adventurer_xp, entropy);
140
+ const { u64_1 } = felt_to_two_u64(felt);
141
+ return buildBeast(adventurer_xp, u64_1);
142
+ };
143
+ const buildBeast = (adventurer_xp, beastEntropy) => {
144
+ const level = Math.floor(Math.sqrt(adventurer_xp));
145
+ const { rnd1, rnd3, rnd4, rnd5, rnd6, rnd7 } = getRandomness(adventurer_xp, beastEntropy);
146
+ const u64_1 = beastEntropy;
147
+ const encounter = beastEncounter(BigInt(level), adventurer_xp, rnd1, rnd3, rnd4, rnd5, rnd6, rnd7, rnd5, rnd6);
148
+ return {
149
+ id: Number(encounter.id),
150
+ traitSeed: u64_1,
151
+ baseName: BEAST_NAMES[Number(encounter.id)],
152
+ name: encounter.level >= BEAST_SPECIAL_NAME_LEVEL_UNLOCK
153
+ ? `"${encounter.specialName}" ${BEAST_NAMES[Number(encounter.id)]}`
154
+ : BEAST_NAMES[Number(encounter.id)],
155
+ health: encounter.health,
156
+ level: encounter.level,
157
+ type: encounter.type,
158
+ tier: Number(encounter.tier),
159
+ specialPrefix: encounter.level >= BEAST_SPECIAL_NAME_LEVEL_UNLOCK
160
+ ? BEAST_NAME_PREFIXES[1 + Number(rnd5 % BigInt(69))]
161
+ : null,
162
+ specialSuffix: encounter.level >= BEAST_SPECIAL_NAME_LEVEL_UNLOCK
163
+ ? BEAST_NAME_SUFFIXES[1 + Number(rnd6 % BigInt(18))]
164
+ : null,
165
+ isCollectable: false,
166
+ };
167
+ };
168
+ // Helper functions
169
+ function getTier(id) {
170
+ if ((id >= 1 && id <= 5) || (id >= 26 && id < 31) || (id >= 51 && id < 56)) {
171
+ return BigInt(1);
172
+ }
173
+ else if ((id >= 6 && id < 11) || (id >= 31 && id < 36) || (id >= 56 && id < 61)) {
174
+ return BigInt(2);
175
+ }
176
+ else if ((id >= 11 && id < 16) || (id >= 36 && id < 41) || (id >= 61 && id < 66)) {
177
+ return BigInt(3);
178
+ }
179
+ else if ((id >= 16 && id < 21) || (id >= 41 && id < 46) || (id >= 66 && id < 71)) {
180
+ return BigInt(4);
181
+ }
182
+ else {
183
+ return BigInt(5);
184
+ }
185
+ }
186
+ function getType(id) {
187
+ if (id >= 0 && id < 26) {
188
+ return "Magic";
189
+ }
190
+ else if (id < 51) {
191
+ return "Blade";
192
+ }
193
+ else if (id < 76) {
194
+ return "Bludgeon";
195
+ }
196
+ else {
197
+ return "None";
198
+ }
199
+ }
200
+ function getBeastHealth(level, seed) {
201
+ let health = BigInt(1) + (seed % (level * BigInt(20)));
202
+ if (level >= BigInt(50)) {
203
+ health += BigInt(500);
204
+ }
205
+ else if (level >= BigInt(40)) {
206
+ health += BigInt(400);
207
+ }
208
+ else if (level >= BigInt(30)) {
209
+ health += BigInt(200);
210
+ }
211
+ else if (level >= BigInt(20)) {
212
+ health += BigInt(100);
213
+ }
214
+ else {
215
+ health += BigInt(10);
216
+ }
217
+ if (health > BigInt(1023)) {
218
+ return BigInt(1023);
219
+ }
220
+ else {
221
+ return health;
222
+ }
223
+ }
224
+ function getObstacleLevel(level, entropy) {
225
+ let obstacleLevel = BigInt(1) + (entropy % (level * BigInt(3)));
226
+ if (level >= BigInt(50)) {
227
+ obstacleLevel += BigInt(80);
228
+ }
229
+ else if (level >= BigInt(40)) {
230
+ obstacleLevel += BigInt(40);
231
+ }
232
+ else if (level >= BigInt(30)) {
233
+ obstacleLevel += BigInt(20);
234
+ }
235
+ else if (level >= BigInt(20)) {
236
+ obstacleLevel += BigInt(10);
237
+ }
238
+ return obstacleLevel;
239
+ }
240
+ function getDiscoveryItem(tier_rnd, item_rnd) {
241
+ const roll = (tier_rnd * BigInt(100) + BigInt(127)) / BigInt(255);
242
+ let itemIndex = 0;
243
+ // 50% chance of T5
244
+ if (roll < BigInt(50)) {
245
+ itemIndex = Number(item_rnd % BigInt(69));
246
+ return BEAST_NAME_PREFIXES[itemIndex];
247
+ // 30% chance of T4
248
+ }
249
+ else if (roll < BigInt(80)) {
250
+ itemIndex = Number(item_rnd % BigInt(69));
251
+ return BEAST_NAME_PREFIXES[itemIndex];
252
+ // 12% chance of T3
253
+ }
254
+ else if (roll < BigInt(92)) {
255
+ itemIndex = Number(item_rnd % BigInt(69));
256
+ return BEAST_NAME_PREFIXES[itemIndex];
257
+ // 6% chance of T2
258
+ }
259
+ else if (roll < BigInt(98)) {
260
+ itemIndex = Number(item_rnd % BigInt(69));
261
+ return BEAST_NAME_PREFIXES[itemIndex];
262
+ // 2% chance of T1
263
+ }
264
+ else {
265
+ itemIndex = Number(item_rnd % BigInt(69));
266
+ return BEAST_NAME_PREFIXES[itemIndex];
267
+ }
268
+ }
269
+ export function listAllEncounters(xp, entropy, adventurerLevel, hasBeast) {
270
+ let encounters = [];
271
+ if (xp === 0) {
272
+ xp = 4;
273
+ }
274
+ encounters = recurseEncounters(encounters, [xp], entropy, adventurerLevel, hasBeast);
275
+ return encounters;
276
+ }
277
+ function recurseEncounters(encounters, xpList, entropy, adventurerLevel, hasBeast) {
278
+ if (encounters.length > 49) {
279
+ return encounters;
280
+ }
281
+ const xp = xpList.sort((a, b) => a - b).shift();
282
+ const felt = get_simple_entropy(xp, entropy);
283
+ const { u64_1 } = felt_to_two_u64(felt);
284
+ const nextEncounter = {
285
+ ...getNextEncounter(xp, u64_1, hasBeast),
286
+ adventurerLevel: Math.floor(Math.sqrt(xp)),
287
+ xp: xp,
288
+ };
289
+ encounters.push(nextEncounter);
290
+ if (nextEncounter.encounter === "Beast") {
291
+ if (!xpList.includes(xp + 1)) {
292
+ xpList.push(xp + 1);
293
+ }
294
+ }
295
+ if (!xpList.includes(nextEncounter.nextXp)) {
296
+ xpList.push(nextEncounter.nextXp);
297
+ }
298
+ return recurseEncounters(encounters, xpList, entropy, adventurerLevel, false);
299
+ }
300
+ function getNextEncounter(xp, adventurerEntropy, hasBeast) {
301
+ const { rnd1, rnd3, rnd4, rnd5, rnd6, rnd7, rnd8 } = getRandomness(xp, adventurerEntropy);
302
+ const level = BigInt(Math.floor(Math.sqrt(xp)));
303
+ const encounter = Number(rnd8 % BigInt(3));
304
+ if (hasBeast || encounter === 0) {
305
+ return beastEncounter(level, xp, rnd1, rnd3, rnd4, rnd5, rnd6, rnd7, rnd5, rnd6);
306
+ }
307
+ else if (encounter === 1) {
308
+ return obstacleEncounter(level, rnd1, rnd4, rnd5, rnd6, rnd7, xp);
309
+ }
310
+ else {
311
+ return discoveryEncounter(level, rnd5, rnd6, rnd7, xp);
312
+ }
313
+ }
314
+ function beastEncounter(level, xp, seed, health_rnd, level_rnd, dmg_location_rnd, crit_hit_rnd, ambush_rnd, specials1_rnd, specials2_rnd) {
315
+ const beast_id = (seed % MAX_ID) + BigInt(1);
316
+ const beast_health = getBeastHealth(level, health_rnd);
317
+ const beast_tier = getTier(beast_id);
318
+ const beast_type = getType(beast_id);
319
+ const beast_level = getObstacleLevel(level, level_rnd);
320
+ const power = (BigInt(6) - beast_tier) * beast_level;
321
+ const ambush_location = getAttackLocation(dmg_location_rnd);
322
+ const roll = abilityBasedAvoidThreat(level, ambush_rnd);
323
+ const xp_reward = getXpReward(beast_level, beast_tier, Number(level));
324
+ const specialName = getSpecialName(specials1_rnd, specials2_rnd);
325
+ const isCritical = getCritical(Number(level * BigInt(3)), crit_hit_rnd);
326
+ return {
327
+ encounter: "Beast",
328
+ id: beast_id,
329
+ type: beast_type,
330
+ tier: Number(beast_tier),
331
+ level: Number(beast_level),
332
+ power: Number(power),
333
+ health: Number(beast_health),
334
+ location: ambush_location,
335
+ dodgeRoll: Number(roll) + 1,
336
+ nextXp: xp + Number(xp_reward),
337
+ xp,
338
+ specialName,
339
+ isCritical,
340
+ };
341
+ }
342
+ function obstacleEncounter(level, seed, level_rnd, dmg_location_rnd, crit_hit_rnd, dodge_rnd, xp) {
343
+ const obstacle_id = (seed % MAX_ID) + BigInt(1);
344
+ const obstacle_level = getObstacleLevel(level, level_rnd);
345
+ const obstacle_tier = getTier(obstacle_id);
346
+ const obstacle_type = getType(obstacle_id);
347
+ const power = (BigInt(6) - obstacle_tier) * obstacle_level;
348
+ const location = getAttackLocation(dmg_location_rnd);
349
+ const roll = abilityBasedAvoidThreat(level, dodge_rnd);
350
+ const xp_reward = getXpReward(obstacle_level, obstacle_tier, Number(level));
351
+ const isCritical = getCritical(Number(level * BigInt(3)), crit_hit_rnd);
352
+ return {
353
+ encounter: "Obstacle",
354
+ id: obstacle_id,
355
+ type: obstacle_type,
356
+ tier: Number(obstacle_tier),
357
+ level: Number(obstacle_level),
358
+ power: Number(power),
359
+ location: location,
360
+ dodgeRoll: Number(roll) + 1,
361
+ nextXp: xp + Number(xp_reward),
362
+ isCritical,
363
+ xp,
364
+ };
365
+ }
366
+ function discoveryEncounter(level, discovery_type_rnd, amount_rnd1, amount_rnd2, xp) {
367
+ const type = (discovery_type_rnd * BigInt(100) + BigInt(127)) / BigInt(255);
368
+ let discovery_amount = BigInt(0);
369
+ let discovery_type = "";
370
+ if (type < BigInt(45)) {
371
+ discovery_type = "Gold";
372
+ discovery_amount = (amount_rnd1 % level) + BigInt(1);
373
+ }
374
+ else if (type < BigInt(90)) {
375
+ discovery_type = "Health";
376
+ discovery_amount = ((amount_rnd1 % level) + BigInt(1)) * BigInt(2);
377
+ }
378
+ else {
379
+ discovery_type = "Loot";
380
+ }
381
+ const discovery_item = getDiscoveryItem(amount_rnd1, amount_rnd2);
382
+ return {
383
+ encounter: "Discovery",
384
+ type: discovery_type,
385
+ tier: type < BigInt(90) ? `${Number(discovery_amount)}` : discovery_item,
386
+ nextXp: xp + 1,
387
+ xp,
388
+ };
389
+ }
390
+ function getAttackLocation(entropy) {
391
+ const slots = BigInt(5);
392
+ const rnd_slot = Number(entropy % slots);
393
+ if (rnd_slot == 0) {
394
+ return "Chest";
395
+ }
396
+ else if (rnd_slot == 1) {
397
+ return "Head";
398
+ }
399
+ else if (rnd_slot == 2) {
400
+ return "Waist";
401
+ }
402
+ else if (rnd_slot == 3) {
403
+ return "Foot";
404
+ }
405
+ else if (rnd_slot == 4) {
406
+ return "Hand";
407
+ }
408
+ return "Unknown";
409
+ }
410
+ function getXpReward(level, tier, adventurerLevel) {
411
+ const xp = ((BigInt(6) - tier) * level) / BigInt(2);
412
+ const adusted_xp = (xp * BigInt(100 - Math.min(adventurerLevel * 2, 95))) / BigInt(100);
413
+ if (adusted_xp < BigInt(4)) {
414
+ return BigInt(4);
415
+ }
416
+ return adusted_xp;
417
+ }
418
+ function abilityBasedAvoidThreat(level, entropy) {
419
+ return (level * entropy) / BigInt(255);
420
+ }
421
+ function getCritical(luck, entropy) {
422
+ return (BigInt(luck) * BigInt(255)) / BigInt(100) > entropy;
423
+ }
424
+ function getSpecialName(special_2_seed, special_3_seed) {
425
+ const special2 = 1 + Number(special_2_seed % BigInt(69));
426
+ const special3 = 1 + Number(special_3_seed % BigInt(18));
427
+ return `${BEAST_NAME_PREFIXES[special2]} ${BEAST_NAME_SUFFIXES[special3]}`;
428
+ }
429
+ //# sourceMappingURL=processFutures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processFutures.js","sourceRoot":"","sources":["../../src/rules/processFutures.ts"],"names":[],"mappings":"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"}