@mythxengine/types 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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/rules.test.d.ts +5 -0
  3. package/dist/__tests__/rules.test.d.ts.map +1 -0
  4. package/dist/__tests__/rules.test.js +278 -0
  5. package/dist/__tests__/rules.test.js.map +1 -0
  6. package/dist/__tests__/time.test.d.ts +2 -0
  7. package/dist/__tests__/time.test.d.ts.map +1 -0
  8. package/dist/__tests__/time.test.js +125 -0
  9. package/dist/__tests__/time.test.js.map +1 -0
  10. package/dist/game/abilities.d.ts +77 -0
  11. package/dist/game/abilities.d.ts.map +1 -0
  12. package/dist/game/abilities.js +38 -0
  13. package/dist/game/abilities.js.map +1 -0
  14. package/dist/game/actions.d.ts +84 -0
  15. package/dist/game/actions.d.ts.map +1 -0
  16. package/dist/game/actions.js +10 -0
  17. package/dist/game/actions.js.map +1 -0
  18. package/dist/game/character.d.ts +128 -0
  19. package/dist/game/character.d.ts.map +1 -0
  20. package/dist/game/character.js +16 -0
  21. package/dist/game/character.js.map +1 -0
  22. package/dist/game/combat.d.ts +56 -0
  23. package/dist/game/combat.d.ts.map +1 -0
  24. package/dist/game/combat.js +5 -0
  25. package/dist/game/combat.js.map +1 -0
  26. package/dist/game/conditions.d.ts +216 -0
  27. package/dist/game/conditions.d.ts.map +1 -0
  28. package/dist/game/conditions.js +99 -0
  29. package/dist/game/conditions.js.map +1 -0
  30. package/dist/game/dice.d.ts +87 -0
  31. package/dist/game/dice.d.ts.map +1 -0
  32. package/dist/game/dice.js +13 -0
  33. package/dist/game/dice.js.map +1 -0
  34. package/dist/game/events.d.ts +85 -0
  35. package/dist/game/events.d.ts.map +1 -0
  36. package/dist/game/events.js +10 -0
  37. package/dist/game/events.js.map +1 -0
  38. package/dist/game/index.d.ts +13 -0
  39. package/dist/game/index.d.ts.map +1 -0
  40. package/dist/game/index.js +13 -0
  41. package/dist/game/index.js.map +1 -0
  42. package/dist/game/player.d.ts +110 -0
  43. package/dist/game/player.d.ts.map +1 -0
  44. package/dist/game/player.js +45 -0
  45. package/dist/game/player.js.map +1 -0
  46. package/dist/game/state.d.ts +99 -0
  47. package/dist/game/state.d.ts.map +1 -0
  48. package/dist/game/state.js +60 -0
  49. package/dist/game/state.js.map +1 -0
  50. package/dist/index.d.ts +10 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +14 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/rules/abilities.d.ts +82 -0
  55. package/dist/rules/abilities.d.ts.map +1 -0
  56. package/dist/rules/abilities.js +94 -0
  57. package/dist/rules/abilities.js.map +1 -0
  58. package/dist/rules/custom-tests.d.ts +163 -0
  59. package/dist/rules/custom-tests.d.ts.map +1 -0
  60. package/dist/rules/custom-tests.js +43 -0
  61. package/dist/rules/custom-tests.js.map +1 -0
  62. package/dist/rules/difficulties.d.ts +51 -0
  63. package/dist/rules/difficulties.d.ts.map +1 -0
  64. package/dist/rules/difficulties.js +77 -0
  65. package/dist/rules/difficulties.js.map +1 -0
  66. package/dist/rules/index.d.ts +123 -0
  67. package/dist/rules/index.d.ts.map +1 -0
  68. package/dist/rules/index.js +170 -0
  69. package/dist/rules/index.js.map +1 -0
  70. package/dist/rules/mechanics.d.ts +130 -0
  71. package/dist/rules/mechanics.d.ts.map +1 -0
  72. package/dist/rules/mechanics.js +64 -0
  73. package/dist/rules/mechanics.js.map +1 -0
  74. package/dist/session/index.d.ts +228 -0
  75. package/dist/session/index.d.ts.map +1 -0
  76. package/dist/session/index.js +60 -0
  77. package/dist/session/index.js.map +1 -0
  78. package/dist/tools/contract.d.ts +63 -0
  79. package/dist/tools/contract.d.ts.map +1 -0
  80. package/dist/tools/contract.js +36 -0
  81. package/dist/tools/contract.js.map +1 -0
  82. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Proto Labs AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the rules configuration system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=rules.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rules.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Tests for the rules configuration system
3
+ */
4
+ import { describe, it, expect } from "vitest";
5
+ import { resolveAbilities, BASE_ABILITIES, createDefaultAbilitiesRecord, resolveDifficulties, BASE_DIFFICULTIES, difficultiesToRecord, resolveMechanics, resolveRules, validateRulesConfig, getAbilityIds, isRollUnderSystem, parseFormula, } from "../rules/index.js";
6
+ describe("Abilities", () => {
7
+ describe("resolveAbilities", () => {
8
+ it("returns base abilities when no config provided", () => {
9
+ const abilities = resolveAbilities();
10
+ expect(abilities).toEqual(BASE_ABILITIES);
11
+ expect(abilities.map((a) => a.id)).toEqual(["STR", "AGI", "WIT", "CON"]);
12
+ });
13
+ it("replaces all abilities when replace is provided", () => {
14
+ const customAbilities = [
15
+ { id: "STR", name: "Strength", description: "Physical", minValue: 10, maxValue: 80, defaultValue: 30 },
16
+ { id: "SPD", name: "Speed", description: "Quickness", minValue: 10, maxValue: 80, defaultValue: 30 },
17
+ ];
18
+ const abilities = resolveAbilities({ replace: customAbilities });
19
+ expect(abilities).toEqual(customAbilities);
20
+ expect(abilities.map((a) => a.id)).toEqual(["STR", "SPD"]);
21
+ });
22
+ it("adds abilities to base set", () => {
23
+ const stressAbility = {
24
+ id: "STRESS",
25
+ name: "Stress",
26
+ description: "Mental strain",
27
+ minValue: 0,
28
+ maxValue: 20,
29
+ defaultValue: 2,
30
+ };
31
+ const abilities = resolveAbilities({ add: [stressAbility] });
32
+ expect(abilities.length).toBe(5);
33
+ expect(abilities.map((a) => a.id)).toEqual(["STR", "AGI", "WIT", "CON", "STRESS"]);
34
+ });
35
+ it("overrides specific ability properties", () => {
36
+ const abilities = resolveAbilities({
37
+ override: {
38
+ STR: { name: "Might", description: "Raw physical power" },
39
+ },
40
+ });
41
+ const str = abilities.find((a) => a.id === "STR");
42
+ expect(str.name).toBe("Might");
43
+ expect(str.description).toBe("Raw physical power");
44
+ expect(str.minValue).toBe(-3); // Unchanged
45
+ });
46
+ });
47
+ describe("createDefaultAbilitiesRecord", () => {
48
+ it("creates record from base abilities", () => {
49
+ const record = createDefaultAbilitiesRecord(BASE_ABILITIES);
50
+ expect(record).toEqual({ STR: 0, AGI: 0, WIT: 0, CON: 0 });
51
+ });
52
+ it("respects custom default values", () => {
53
+ const abilities = [
54
+ { id: "STR", name: "Strength", description: "", minValue: 10, maxValue: 80, defaultValue: 30 },
55
+ { id: "STRESS", name: "Stress", description: "", minValue: 0, maxValue: 20, defaultValue: 2 },
56
+ ];
57
+ const record = createDefaultAbilitiesRecord(abilities);
58
+ expect(record).toEqual({ STR: 30, STRESS: 2 });
59
+ });
60
+ });
61
+ });
62
+ describe("Difficulties", () => {
63
+ describe("resolveDifficulties", () => {
64
+ it("returns base difficulties when no config provided", () => {
65
+ const diffs = resolveDifficulties();
66
+ expect(diffs).toEqual(BASE_DIFFICULTIES);
67
+ });
68
+ it("adds custom difficulties and sorts by target", () => {
69
+ const diffs = resolveDifficulties({
70
+ add: [{ id: "TRIVIAL", name: "Trivial", target: 4 }],
71
+ });
72
+ expect(diffs[0].id).toBe("TRIVIAL");
73
+ expect(diffs[0].target).toBe(4);
74
+ });
75
+ it("replaces all difficulties", () => {
76
+ const diffs = resolveDifficulties({
77
+ replace: [
78
+ { id: "ROUTINE", name: "Routine", target: 20 },
79
+ { id: "HARD", name: "Hard", target: 40 },
80
+ ],
81
+ });
82
+ expect(diffs.length).toBe(2);
83
+ expect(diffs.map((d) => d.id)).toEqual(["ROUTINE", "HARD"]);
84
+ });
85
+ });
86
+ describe("difficultiesToRecord", () => {
87
+ it("creates lookup record", () => {
88
+ const record = difficultiesToRecord(BASE_DIFFICULTIES);
89
+ expect(record).toEqual({
90
+ EASY: 8,
91
+ STANDARD: 12,
92
+ HARD: 16,
93
+ EXTREME: 20,
94
+ });
95
+ });
96
+ });
97
+ });
98
+ describe("Mechanics", () => {
99
+ describe("resolveMechanics", () => {
100
+ it("returns defaults when no config provided", () => {
101
+ const mechanics = resolveMechanics();
102
+ expect(mechanics.defense.base).toBe(10);
103
+ expect(mechanics.defense.ability).toBe("AGI");
104
+ expect(mechanics.criticals.successOn).toEqual([20]);
105
+ expect(mechanics.criticals.failureOn).toEqual([1]);
106
+ expect(mechanics.damage.addAbility).toBe(true);
107
+ });
108
+ it("merges partial config with defaults", () => {
109
+ const mechanics = resolveMechanics({
110
+ defense: { base: 8 },
111
+ criticals: { successOn: [19, 20] },
112
+ });
113
+ expect(mechanics.defense.base).toBe(8);
114
+ expect(mechanics.defense.ability).toBe("AGI"); // Default preserved
115
+ expect(mechanics.criticals.successOn).toEqual([19, 20]);
116
+ expect(mechanics.criticals.failureOn).toEqual([1]); // Default preserved
117
+ });
118
+ it("supports roll-under configuration", () => {
119
+ const mechanics = resolveMechanics({
120
+ rollUnder: {
121
+ enabled: true,
122
+ dice: "d100",
123
+ criticalSuccessRange: [1, 5],
124
+ criticalFailureRange: [96, 100],
125
+ },
126
+ });
127
+ expect(mechanics.rollUnder?.enabled).toBe(true);
128
+ expect(mechanics.rollUnder?.dice).toBe("d100");
129
+ });
130
+ });
131
+ });
132
+ describe("Full Rules Resolution", () => {
133
+ describe("resolveRules", () => {
134
+ it("returns default rules when no config", () => {
135
+ const rules = resolveRules();
136
+ expect(rules.abilities.length).toBe(4);
137
+ expect(rules.difficulties.length).toBe(4);
138
+ expect(rules.customTests.length).toBe(0);
139
+ expect(rules.abilityMap.get("STR")).toBeDefined();
140
+ expect(rules.difficultyMap.get("STANDARD")?.target).toBe(12);
141
+ });
142
+ it("resolves complex Mothership-style config", () => {
143
+ const config = {
144
+ abilities: {
145
+ replace: [
146
+ { id: "STR", name: "Strength", description: "", minValue: 10, maxValue: 80, defaultValue: 30 },
147
+ { id: "SPD", name: "Speed", description: "", minValue: 10, maxValue: 80, defaultValue: 30 },
148
+ { id: "INT", name: "Intellect", description: "", minValue: 10, maxValue: 80, defaultValue: 30 },
149
+ { id: "CMB", name: "Combat", description: "", minValue: 10, maxValue: 80, defaultValue: 30 },
150
+ { id: "SAN", name: "Sanity", description: "", minValue: 0, maxValue: 100, defaultValue: 30 },
151
+ { id: "STRESS", name: "Stress", description: "", minValue: 0, maxValue: 20, defaultValue: 2 },
152
+ ],
153
+ },
154
+ mechanics: {
155
+ rollUnder: { enabled: true, dice: "d100" },
156
+ },
157
+ customTests: {
158
+ tests: [
159
+ {
160
+ id: "panic",
161
+ name: "Panic Check",
162
+ description: "Roll when encountering horror",
163
+ triggers: ["witness_death", "see_creature"],
164
+ roll: { dice: "d100", underAbility: "SAN" },
165
+ outcomes: {
166
+ success: { description: "You keep it together" },
167
+ failure: { description: "Roll on panic table" },
168
+ },
169
+ },
170
+ ],
171
+ },
172
+ };
173
+ const rules = resolveRules(config);
174
+ expect(rules.abilities.length).toBe(6);
175
+ expect(rules.abilityMap.get("STRESS")).toBeDefined();
176
+ expect(rules.mechanics.rollUnder?.enabled).toBe(true);
177
+ expect(rules.customTests.length).toBe(1);
178
+ expect(rules.customTestMap.get("panic")?.name).toBe("Panic Check");
179
+ });
180
+ });
181
+ describe("validateRulesConfig", () => {
182
+ it("returns no errors for valid config", () => {
183
+ const errors = validateRulesConfig({
184
+ abilities: {
185
+ add: [{ id: "STRESS", name: "Stress", description: "", minValue: 0, maxValue: 20, defaultValue: 2 }],
186
+ },
187
+ });
188
+ expect(errors).toEqual([]);
189
+ });
190
+ it("detects duplicate ability IDs", () => {
191
+ const errors = validateRulesConfig({
192
+ abilities: {
193
+ replace: [
194
+ { id: "STR", name: "Strength", description: "", minValue: -3, maxValue: 3, defaultValue: 0 },
195
+ { id: "STR", name: "Strength2", description: "", minValue: -3, maxValue: 3, defaultValue: 0 },
196
+ ],
197
+ },
198
+ });
199
+ expect(errors).toContain("Duplicate ability ID: STR");
200
+ });
201
+ it("detects invalid ability ranges", () => {
202
+ const errors = validateRulesConfig({
203
+ abilities: {
204
+ replace: [
205
+ { id: "BAD", name: "Bad", description: "", minValue: 10, maxValue: 5, defaultValue: 7 },
206
+ ],
207
+ },
208
+ });
209
+ expect(errors).toContain("Ability BAD: minValue must be less than maxValue");
210
+ });
211
+ it("detects conflicting critical ranges", () => {
212
+ const errors = validateRulesConfig({
213
+ mechanics: {
214
+ criticals: {
215
+ successOn: [19, 20],
216
+ failureOn: [1, 2, 19], // 19 overlaps!
217
+ },
218
+ },
219
+ });
220
+ expect(errors.some((e) => e.includes("overlap"))).toBe(true);
221
+ });
222
+ it("requires at least success or failure outcome for custom tests", () => {
223
+ const errors = validateRulesConfig({
224
+ customTests: {
225
+ tests: [
226
+ {
227
+ id: "bad",
228
+ name: "Bad Test",
229
+ description: "",
230
+ triggers: ["manual"],
231
+ roll: { dice: "d20" },
232
+ outcomes: {}, // Missing both success and failure
233
+ },
234
+ ],
235
+ },
236
+ });
237
+ expect(errors).toContain("Custom test bad: at least success or failure outcome is required");
238
+ });
239
+ });
240
+ describe("helper functions", () => {
241
+ it("isRollUnderSystem detects roll-under", () => {
242
+ expect(isRollUnderSystem()).toBe(false);
243
+ expect(isRollUnderSystem({ mechanics: { rollUnder: { enabled: true, dice: "d100" } } })).toBe(true);
244
+ expect(isRollUnderSystem({ mechanics: { rollUnder: { enabled: false, dice: "d100" } } })).toBe(false);
245
+ });
246
+ it("getAbilityIds returns IDs", () => {
247
+ expect(getAbilityIds()).toEqual(["STR", "AGI", "WIT", "CON"]);
248
+ expect(getAbilityIds({
249
+ abilities: { add: [{ id: "STRESS", name: "Stress", description: "", minValue: 0, maxValue: 20, defaultValue: 2 }] },
250
+ })).toEqual(["STR", "AGI", "WIT", "CON", "STRESS"]);
251
+ });
252
+ });
253
+ });
254
+ describe("Formula Parsing", () => {
255
+ describe("parseFormula", () => {
256
+ it("evaluates simple addition", () => {
257
+ const fn = parseFormula("{STRESS} + 10");
258
+ expect(fn({ STRESS: 5 })).toBe(15);
259
+ });
260
+ it("evaluates multiplication", () => {
261
+ const fn = parseFormula("{STRESS} * 2");
262
+ expect(fn({ STRESS: 7 })).toBe(14);
263
+ });
264
+ it("evaluates complex formulas", () => {
265
+ const fn = parseFormula("20 - {WIT} + ({STRESS} * 2)");
266
+ expect(fn({ WIT: 3, STRESS: 5 })).toBe(27);
267
+ });
268
+ it("handles multiple ability references", () => {
269
+ const fn = parseFormula("{STR} + {AGI} + {WIT}");
270
+ expect(fn({ STR: 2, AGI: 1, WIT: 3 })).toBe(6);
271
+ });
272
+ it("rejects invalid expressions", () => {
273
+ const fn = parseFormula("{STR}; console.log('bad')");
274
+ expect(() => fn({ STR: 1 })).toThrow("Invalid formula expression");
275
+ });
276
+ });
277
+ });
278
+ //# sourceMappingURL=rules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.test.js","sourceRoot":"","sources":["../../src/__tests__/rules.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=time.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/time.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createInitialGameTime, advanceGameTime, gameTimeToMinutes, compareGameTime, minutesUntil, formatDuration, } from "../game/state.js";
3
+ describe("createInitialGameTime", () => {
4
+ it("returns day 1 at 6:00 AM", () => {
5
+ const time = createInitialGameTime();
6
+ expect(time).toEqual({ day: 1, hour: 6, minute: 0 });
7
+ });
8
+ });
9
+ describe("advanceGameTime", () => {
10
+ it("advances minutes within the same hour", () => {
11
+ const time = { day: 1, hour: 10, minute: 15 };
12
+ const result = advanceGameTime(time, 30);
13
+ expect(result).toEqual({ day: 1, hour: 10, minute: 45 });
14
+ });
15
+ it("rolls over to the next hour", () => {
16
+ const time = { day: 1, hour: 10, minute: 45 };
17
+ const result = advanceGameTime(time, 30);
18
+ expect(result).toEqual({ day: 1, hour: 11, minute: 15 });
19
+ });
20
+ it("rolls over to the next day", () => {
21
+ const time = { day: 1, hour: 23, minute: 30 };
22
+ const result = advanceGameTime(time, 60);
23
+ expect(result).toEqual({ day: 2, hour: 0, minute: 30 });
24
+ });
25
+ it("handles multiple day advancement", () => {
26
+ const time = { day: 1, hour: 12, minute: 0 };
27
+ const result = advanceGameTime(time, 60 * 24 * 2 + 30); // 2 days and 30 minutes
28
+ expect(result).toEqual({ day: 3, hour: 12, minute: 30 });
29
+ });
30
+ it("handles exactly 24 hours", () => {
31
+ const time = { day: 1, hour: 6, minute: 0 };
32
+ const result = advanceGameTime(time, 60 * 24);
33
+ expect(result).toEqual({ day: 2, hour: 6, minute: 0 });
34
+ });
35
+ it("handles midnight edge case", () => {
36
+ const time = { day: 1, hour: 23, minute: 59 };
37
+ const result = advanceGameTime(time, 1);
38
+ expect(result).toEqual({ day: 2, hour: 0, minute: 0 });
39
+ });
40
+ });
41
+ describe("gameTimeToMinutes", () => {
42
+ it("converts day 1 6:00 AM to minutes", () => {
43
+ const time = { day: 1, hour: 6, minute: 0 };
44
+ expect(gameTimeToMinutes(time)).toBe(6 * 60);
45
+ });
46
+ it("converts day 2 midnight to minutes", () => {
47
+ const time = { day: 2, hour: 0, minute: 0 };
48
+ expect(gameTimeToMinutes(time)).toBe(24 * 60);
49
+ });
50
+ it("converts complex time correctly", () => {
51
+ const time = { day: 3, hour: 14, minute: 30 };
52
+ // (3-1) * 24 * 60 + 14 * 60 + 30 = 2880 + 840 + 30 = 3750
53
+ expect(gameTimeToMinutes(time)).toBe(3750);
54
+ });
55
+ });
56
+ describe("compareGameTime", () => {
57
+ it("returns negative when a < b", () => {
58
+ const a = { day: 1, hour: 10, minute: 0 };
59
+ const b = { day: 1, hour: 11, minute: 0 };
60
+ expect(compareGameTime(a, b)).toBeLessThan(0);
61
+ });
62
+ it("returns positive when a > b", () => {
63
+ const a = { day: 2, hour: 10, minute: 0 };
64
+ const b = { day: 1, hour: 10, minute: 0 };
65
+ expect(compareGameTime(a, b)).toBeGreaterThan(0);
66
+ });
67
+ it("returns zero when equal", () => {
68
+ const a = { day: 1, hour: 10, minute: 30 };
69
+ const b = { day: 1, hour: 10, minute: 30 };
70
+ expect(compareGameTime(a, b)).toBe(0);
71
+ });
72
+ it("compares across days correctly", () => {
73
+ const a = { day: 1, hour: 23, minute: 59 };
74
+ const b = { day: 2, hour: 0, minute: 0 };
75
+ expect(compareGameTime(a, b)).toBeLessThan(0);
76
+ });
77
+ });
78
+ describe("minutesUntil", () => {
79
+ it("calculates positive difference", () => {
80
+ const current = { day: 1, hour: 10, minute: 0 };
81
+ const target = { day: 1, hour: 11, minute: 30 };
82
+ expect(minutesUntil(current, target)).toBe(90);
83
+ });
84
+ it("returns negative when target is in the past", () => {
85
+ const current = { day: 1, hour: 12, minute: 0 };
86
+ const target = { day: 1, hour: 10, minute: 0 };
87
+ expect(minutesUntil(current, target)).toBe(-120);
88
+ });
89
+ it("calculates across days", () => {
90
+ const current = { day: 1, hour: 22, minute: 0 };
91
+ const target = { day: 2, hour: 2, minute: 0 };
92
+ expect(minutesUntil(current, target)).toBe(240);
93
+ });
94
+ it("returns zero when times are equal", () => {
95
+ const time = { day: 1, hour: 10, minute: 30 };
96
+ expect(minutesUntil(time, time)).toBe(0);
97
+ });
98
+ });
99
+ describe("formatDuration", () => {
100
+ it("formats expired", () => {
101
+ expect(formatDuration(-1)).toBe("expired");
102
+ expect(formatDuration(-100)).toBe("expired");
103
+ });
104
+ it("formats now", () => {
105
+ expect(formatDuration(0)).toBe("now");
106
+ });
107
+ it("formats minutes only", () => {
108
+ expect(formatDuration(30)).toBe("30 minutes");
109
+ expect(formatDuration(1)).toBe("1 minute");
110
+ });
111
+ it("formats hours only", () => {
112
+ expect(formatDuration(60)).toBe("1 hour");
113
+ expect(formatDuration(120)).toBe("2 hours");
114
+ });
115
+ it("formats hours and minutes", () => {
116
+ expect(formatDuration(90)).toBe("1 hour 30 minutes");
117
+ expect(formatDuration(150)).toBe("2 hours 30 minutes");
118
+ expect(formatDuration(61)).toBe("1 hour 1 minute");
119
+ });
120
+ it("handles large durations", () => {
121
+ expect(formatDuration(24 * 60)).toBe("24 hours");
122
+ expect(formatDuration(25 * 60 + 15)).toBe("25 hours 15 minutes");
123
+ });
124
+ });
125
+ //# sourceMappingURL=time.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.test.js","sourceRoot":"","sources":["../../src/__tests__/time.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Core ability system
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * The four core ability names
7
+ */
8
+ export declare const CORE_ABILITY_NAMES: readonly ["STR", "AGI", "WIT", "CON"];
9
+ /**
10
+ * Core ability name type - the four standard abilities
11
+ */
12
+ export type CoreAbilityName = (typeof CORE_ABILITY_NAMES)[number];
13
+ /**
14
+ * Zod schema for core ability names
15
+ */
16
+ export declare const CoreAbilityNameSchema: z.ZodEnum<["STR", "AGI", "WIT", "CON"]>;
17
+ /**
18
+ * The four core abilities - modifiers range from -3 to +3
19
+ *
20
+ * NOTE: The index signature is included for compatibility with custom abilities
21
+ * in extensible rules configurations. For type-safe access to core abilities,
22
+ * prefer using CoreAbilityName and explicit property access.
23
+ */
24
+ export interface Abilities {
25
+ /** Physical power, melee damage, carrying */
26
+ STR: number;
27
+ /** Speed, reflexes, ranged attacks, defense */
28
+ AGI: number;
29
+ /** Intelligence, perception, social, magic */
30
+ WIT: number;
31
+ /** Toughness, HP, endurance, resistance */
32
+ CON: number;
33
+ /** Index signature for custom abilities - prefer explicit access for core abilities */
34
+ [key: string]: number;
35
+ }
36
+ /**
37
+ * Zod schema for validating Abilities object
38
+ */
39
+ export declare const AbilitiesSchema: z.ZodObject<{
40
+ STR: z.ZodNumber;
41
+ AGI: z.ZodNumber;
42
+ WIT: z.ZodNumber;
43
+ CON: z.ZodNumber;
44
+ }, "strip", z.ZodTypeAny, {
45
+ STR: number;
46
+ AGI: number;
47
+ WIT: number;
48
+ CON: number;
49
+ }, {
50
+ STR: number;
51
+ AGI: number;
52
+ WIT: number;
53
+ CON: number;
54
+ }>;
55
+ /**
56
+ * Dynamic abilities map - use when custom abilities are supported
57
+ * or when dynamic string access is needed
58
+ */
59
+ export type DynamicAbilities = Record<string, number>;
60
+ /**
61
+ * Ability name type - use CoreAbilityName for type-safe access
62
+ * @deprecated Use CoreAbilityName for new code
63
+ */
64
+ export type AbilityName = CoreAbilityName;
65
+ /** Minimum ability modifier */
66
+ export declare const ABILITY_MIN = -3;
67
+ /** Maximum ability modifier */
68
+ export declare const ABILITY_MAX = 3;
69
+ /**
70
+ * Create default abilities (all zero)
71
+ */
72
+ export declare function createDefaultAbilities(): Abilities;
73
+ /**
74
+ * Validate ability value is within range
75
+ */
76
+ export declare function isValidAbilityValue(value: number): boolean;
77
+ //# sourceMappingURL=abilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abilities.d.ts","sourceRoot":"","sources":["../../src/game/abilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,kBAAkB,uCAAwC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,qBAAqB,yCAA6B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,+BAA+B;AAC/B,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,+BAA+B;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,SAAS,CAElD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Core ability system
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * The four core ability names
7
+ */
8
+ export const CORE_ABILITY_NAMES = ["STR", "AGI", "WIT", "CON"];
9
+ /**
10
+ * Zod schema for core ability names
11
+ */
12
+ export const CoreAbilityNameSchema = z.enum(CORE_ABILITY_NAMES);
13
+ /**
14
+ * Zod schema for validating Abilities object
15
+ */
16
+ export const AbilitiesSchema = z.object({
17
+ STR: z.number().int().min(-3).max(3),
18
+ AGI: z.number().int().min(-3).max(3),
19
+ WIT: z.number().int().min(-3).max(3),
20
+ CON: z.number().int().min(-3).max(3),
21
+ });
22
+ /** Minimum ability modifier */
23
+ export const ABILITY_MIN = -3;
24
+ /** Maximum ability modifier */
25
+ export const ABILITY_MAX = 3;
26
+ /**
27
+ * Create default abilities (all zero)
28
+ */
29
+ export function createDefaultAbilities() {
30
+ return { STR: 0, AGI: 0, WIT: 0, CON: 0 };
31
+ }
32
+ /**
33
+ * Validate ability value is within range
34
+ */
35
+ export function isValidAbilityValue(value) {
36
+ return Number.isInteger(value) && value >= ABILITY_MIN && value <= ABILITY_MAX;
37
+ }
38
+ //# sourceMappingURL=abilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abilities.js","sourceRoot":"","sources":["../../src/game/abilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAOxE;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAsBhE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACrC,CAAC,CAAC;AAcH,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC;AAE9B,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,CAAC;AACjF,CAAC"}