@dreadwood-types/types 0.1.158 → 0.1.160
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/attackableNpcs.d.ts.map +1 -1
- package/dist/attackableNpcs.js +7 -0
- package/dist/attackableNpcs.js.map +1 -1
- package/dist/bossSignatures.d.ts +1 -1
- package/dist/bossSignatures.d.ts.map +1 -1
- package/dist/bossSignatures.js +7 -0
- package/dist/bossSignatures.js.map +1 -1
- package/dist/constants.d.ts +6 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/cooking.d.ts.map +1 -1
- package/dist/cooking.js +10 -0
- package/dist/cooking.js.map +1 -1
- package/dist/hopewoodWildlife.d.ts +67 -0
- package/dist/hopewoodWildlife.d.ts.map +1 -0
- package/dist/hopewoodWildlife.js +88 -0
- package/dist/hopewoodWildlife.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -0
- package/dist/legacy.d.ts.map +1 -1
- package/dist/legacy.js +1 -0
- package/dist/legacy.js.map +1 -1
- package/dist/messages.d.ts +11 -0
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js.map +1 -1
- package/dist/worldBossRing.d.ts +139 -0
- package/dist/worldBossRing.d.ts.map +1 -0
- package/dist/worldBossRing.js +165 -0
- package/dist/worldBossRing.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World boss rings (James, 2026-10-09; design `.cursor/task-plans/2026-10-09-world-boss-events-design.md`). A ring
|
|
3
|
+
* is an open-air stone floor circled by pillars where, on a fixed server-wide schedule, a boss turns up for everyone
|
|
4
|
+
* nearby to fight together. The first is Ringstone, the Old Ring of Hopewood Common grown outward, between No Harm Farm
|
|
5
|
+
* and Hope Town (tier 1, levels 1-10). Rings are data, so later regions get their own with the same engine.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1 (this file and backend src/worldBossRing.ts) is the place and the countdown: the floor, the pillars, the
|
|
8
|
+
* sign, and six countdown stages, each change told once to everyone online in world chat. The fight is phase 2.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is wall-clock maths: event n starts at n * RING_PERIOD_MS (ms since the Unix epoch), so a restart,
|
|
11
|
+
* a deploy or a second server agrees on the stage and the boss without saving anything.
|
|
12
|
+
*/
|
|
13
|
+
/** One countdown stage, 1 (hours away) to 6 (prepare, then the fight). */
|
|
14
|
+
export type RingStage = 1 | 2 | 3 | 4 | 5 | 6;
|
|
15
|
+
export declare const RING_STAGES: readonly RingStage[];
|
|
16
|
+
/** The bosses a ring may roll (NpcKinds). */
|
|
17
|
+
export type RingBossKind = 'brownbear' | 'giantcrab';
|
|
18
|
+
export type WorldBossRing = {
|
|
19
|
+
id: string;
|
|
20
|
+
/** What players read: the sign, the chat lines. */
|
|
21
|
+
title: string;
|
|
22
|
+
/** Where the chat line says it is. */
|
|
23
|
+
where: string;
|
|
24
|
+
/** The empty centre of the floor, where the boss will stand. */
|
|
25
|
+
centre: {
|
|
26
|
+
x: number;
|
|
27
|
+
z: number;
|
|
28
|
+
};
|
|
29
|
+
/** Tiles within this (Euclidean, tile centres) are the stone floor. */
|
|
30
|
+
floorRadius: number;
|
|
31
|
+
/** The pillars stand on this circle; within it counts as "inside the ring". */
|
|
32
|
+
pillarRadius: number;
|
|
33
|
+
pillarCount: number;
|
|
34
|
+
/** The kit model each pillar is drawn with (a dreadmodel id; a Blender pillar of its own is a later job). */
|
|
35
|
+
pillarModel: string;
|
|
36
|
+
/** Kept clear of everything: the boss and the crowd fight here. */
|
|
37
|
+
clearRadius: number;
|
|
38
|
+
tier: {
|
|
39
|
+
id: number;
|
|
40
|
+
minLevel: number;
|
|
41
|
+
maxLevel: number;
|
|
42
|
+
};
|
|
43
|
+
bossPool: readonly RingBossKind[];
|
|
44
|
+
/** The board at the entrance, beside the worn path up from the road. */
|
|
45
|
+
sign: {
|
|
46
|
+
x: number;
|
|
47
|
+
z: number;
|
|
48
|
+
};
|
|
49
|
+
/** Where the path leaves the floor (the gap in the pillars). */
|
|
50
|
+
entrance: {
|
|
51
|
+
x: number;
|
|
52
|
+
z: number;
|
|
53
|
+
};
|
|
54
|
+
/** The caged chest's place at the floor's edge, away from the entrance. Reserved: its prop is phase 2. */
|
|
55
|
+
cage: {
|
|
56
|
+
x: number;
|
|
57
|
+
z: number;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Ringstone. Centre surveyed 2026-10-09 against Hopewood Common (backend hopewoodCommon.ts): the Common Strips' hedge
|
|
62
|
+
* is at z 884 (their claim to 886), the Orchard Road's rows are z 921-923 (kept clear to 920), the Bracken Brook's
|
|
63
|
+
* water stays west of x 147 at these rows, Hayrick Yard starts at x 204. So the pillar circle (z 887-917, x 151-181)
|
|
64
|
+
* fits between the strips and the road with the sign and the path in the three rows left.
|
|
65
|
+
*/
|
|
66
|
+
export declare const RINGSTONE: WorldBossRing;
|
|
67
|
+
export declare const WORLD_BOSS_RINGS: readonly WorldBossRing[];
|
|
68
|
+
/** The entity id of Ringstone's board: the client shows the live stage over it when clicked or when you are near. */
|
|
69
|
+
export declare const RINGSTONE_SIGN_ID = "ringstone-sign";
|
|
70
|
+
/** How near (Chebyshev tiles) a player stands to the board for it to show the stage by itself. */
|
|
71
|
+
export declare const RING_SIGN_READ_RANGE = 4;
|
|
72
|
+
export declare function worldBossRing(id: string): WorldBossRing | undefined;
|
|
73
|
+
/** Time from one event's start to the next (one constant: 3 hours, 8 a day, while the game has few players). */
|
|
74
|
+
export declare const RING_PERIOD_MS: number;
|
|
75
|
+
/** How long a boss has to be killed once it appears (phase 2). The ring stays on stage 6 for this long. */
|
|
76
|
+
export declare const RING_FIGHT_MS: number;
|
|
77
|
+
/**
|
|
78
|
+
* The stages by time to the next event, longest first: a stage holds while the time left is MORE than its `over`
|
|
79
|
+
* (stage 6 holds from 2 minutes out, through the start and the fight window).
|
|
80
|
+
*/
|
|
81
|
+
export declare const RING_STAGE_TABLE: ReadonlyArray<{
|
|
82
|
+
stage: RingStage;
|
|
83
|
+
over: number;
|
|
84
|
+
text: string;
|
|
85
|
+
colour: string;
|
|
86
|
+
}>;
|
|
87
|
+
export declare function isRingStage(n: unknown): n is RingStage;
|
|
88
|
+
/** The slot of the most recent event start at `now`: event n starts at n * RING_PERIOD_MS. */
|
|
89
|
+
export declare function slotAt(now: number): number;
|
|
90
|
+
/** When the next event starts (strictly after `now`). */
|
|
91
|
+
export declare function nextEventAt(now: number): number;
|
|
92
|
+
/** The countdown stage for this much time left to the next event. */
|
|
93
|
+
export declare function stageAt(msToNext: number): RingStage;
|
|
94
|
+
export declare function stageText(stage: RingStage): string;
|
|
95
|
+
/** The stage's lamp colour (CSS hex), for the sign and the pillar lamps. */
|
|
96
|
+
export declare function stageColour(stage: RingStage): string;
|
|
97
|
+
/** The world chat line for a stage. */
|
|
98
|
+
export declare function chatLine(stage: RingStage, ring?: WorldBossRing): string;
|
|
99
|
+
/**
|
|
100
|
+
* Where the clock stands at `now`: the event it is counting towards (or fighting) and the stage. For RING_FIGHT_MS
|
|
101
|
+
* after an event starts the ring stays on stage 6 for that event (the fight, phase 2); then it counts to the next.
|
|
102
|
+
*/
|
|
103
|
+
export declare function ringClockAt(now: number): {
|
|
104
|
+
eventSlot: number;
|
|
105
|
+
stage: RingStage;
|
|
106
|
+
msToNext: number;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* The boss for an event slot, the same on every server and after every restart, and never the boss of the slot
|
|
110
|
+
* before. With two in the pool they alternate (the phase of the alternation is hashed); with more, even slots roll
|
|
111
|
+
* freely and each odd slot rolls among the bosses that are neither of its even neighbours'.
|
|
112
|
+
*/
|
|
113
|
+
export declare function bossForSlot(slot: number, ring?: WorldBossRing): RingBossKind;
|
|
114
|
+
/** Tile on the ring's stone floor. */
|
|
115
|
+
export declare function inRingFloor(x: number, z: number, ring?: WorldBossRing): boolean;
|
|
116
|
+
/** Tile inside the pillar circle: standing here counts as being in the ring. */
|
|
117
|
+
export declare function inRing(x: number, z: number, ring?: WorldBossRing): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* The pillars' tiles, clockwise from the east, offset half a step so the south (the entrance) falls in a gap
|
|
120
|
+
* between two of them.
|
|
121
|
+
*/
|
|
122
|
+
export declare function ringPillars(ring?: WorldBossRing): Array<{
|
|
123
|
+
x: number;
|
|
124
|
+
z: number;
|
|
125
|
+
}>;
|
|
126
|
+
/**
|
|
127
|
+
* The Old Ring's nine standing stones, moved out from the middle to a loose ring just inside the pillars (James,
|
|
128
|
+
* 2026-10-09: the centre stays empty for the fight). Angles in degrees, clockwise from the east (z grows south), kept
|
|
129
|
+
* off the entrance (south) and the cage (north); radii vary a little so it reads as old and loose, not laid out.
|
|
130
|
+
*/
|
|
131
|
+
export declare const RING_OLD_STONE_ANGLES: ReadonlyArray<{
|
|
132
|
+
deg: number;
|
|
133
|
+
r: number;
|
|
134
|
+
}>;
|
|
135
|
+
export declare function ringOldStones(ring?: WorldBossRing): Array<{
|
|
136
|
+
x: number;
|
|
137
|
+
z: number;
|
|
138
|
+
}>;
|
|
139
|
+
//# sourceMappingURL=worldBossRing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worldBossRing.d.ts","sourceRoot":"","sources":["../src/worldBossRing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World boss rings (James, 2026-10-09; design `.cursor/task-plans/2026-10-09-world-boss-events-design.md`). A ring
|
|
3
|
+
* is an open-air stone floor circled by pillars where, on a fixed server-wide schedule, a boss turns up for everyone
|
|
4
|
+
* nearby to fight together. The first is Ringstone, the Old Ring of Hopewood Common grown outward, between No Harm Farm
|
|
5
|
+
* and Hope Town (tier 1, levels 1-10). Rings are data, so later regions get their own with the same engine.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1 (this file and backend src/worldBossRing.ts) is the place and the countdown: the floor, the pillars, the
|
|
8
|
+
* sign, and six countdown stages, each change told once to everyone online in world chat. The fight is phase 2.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is wall-clock maths: event n starts at n * RING_PERIOD_MS (ms since the Unix epoch), so a restart,
|
|
11
|
+
* a deploy or a second server agrees on the stage and the boss without saving anything.
|
|
12
|
+
*/
|
|
13
|
+
export const RING_STAGES = [1, 2, 3, 4, 5, 6];
|
|
14
|
+
/**
|
|
15
|
+
* Ringstone. Centre surveyed 2026-10-09 against Hopewood Common (backend hopewoodCommon.ts): the Common Strips' hedge
|
|
16
|
+
* is at z 884 (their claim to 886), the Orchard Road's rows are z 921-923 (kept clear to 920), the Bracken Brook's
|
|
17
|
+
* water stays west of x 147 at these rows, Hayrick Yard starts at x 204. So the pillar circle (z 887-917, x 151-181)
|
|
18
|
+
* fits between the strips and the road with the sign and the path in the three rows left.
|
|
19
|
+
*/
|
|
20
|
+
export const RINGSTONE = {
|
|
21
|
+
id: 'ringstone',
|
|
22
|
+
title: 'Ringstone',
|
|
23
|
+
where: 'between the farm and the town',
|
|
24
|
+
centre: { x: 166, z: 902 },
|
|
25
|
+
floorRadius: 13,
|
|
26
|
+
pillarRadius: 15,
|
|
27
|
+
pillarCount: 12,
|
|
28
|
+
pillarModel: 'evmasonrypillar',
|
|
29
|
+
clearRadius: 6,
|
|
30
|
+
tier: { id: 1, minLevel: 1, maxLevel: 10 },
|
|
31
|
+
bossPool: ['brownbear', 'giantcrab'],
|
|
32
|
+
sign: { x: 162, z: 919 },
|
|
33
|
+
entrance: { x: 166, z: 916 },
|
|
34
|
+
cage: { x: 166, z: 890 },
|
|
35
|
+
};
|
|
36
|
+
export const WORLD_BOSS_RINGS = [RINGSTONE];
|
|
37
|
+
/** The entity id of Ringstone's board: the client shows the live stage over it when clicked or when you are near. */
|
|
38
|
+
export const RINGSTONE_SIGN_ID = 'ringstone-sign';
|
|
39
|
+
/** How near (Chebyshev tiles) a player stands to the board for it to show the stage by itself. */
|
|
40
|
+
export const RING_SIGN_READ_RANGE = 4;
|
|
41
|
+
export function worldBossRing(id) {
|
|
42
|
+
return WORLD_BOSS_RINGS.find((r) => r.id === id);
|
|
43
|
+
}
|
|
44
|
+
/** Time from one event's start to the next (one constant: 3 hours, 8 a day, while the game has few players). */
|
|
45
|
+
export const RING_PERIOD_MS = 3 * 60 * 60_000;
|
|
46
|
+
/** How long a boss has to be killed once it appears (phase 2). The ring stays on stage 6 for this long. */
|
|
47
|
+
export const RING_FIGHT_MS = 10 * 60_000;
|
|
48
|
+
const HOUR = 60 * 60_000;
|
|
49
|
+
const MINUTE = 60_000;
|
|
50
|
+
/**
|
|
51
|
+
* The stages by time to the next event, longest first: a stage holds while the time left is MORE than its `over`
|
|
52
|
+
* (stage 6 holds from 2 minutes out, through the start and the fight window).
|
|
53
|
+
*/
|
|
54
|
+
export const RING_STAGE_TABLE = [
|
|
55
|
+
{ stage: 1, over: 2 * HOUR, text: 'Several hours to the next event', colour: '#7f8c8d' },
|
|
56
|
+
{ stage: 2, over: 1 * HOUR, text: 'Over an hour to the next event', colour: '#5b8fd6' },
|
|
57
|
+
{ stage: 3, over: 30 * MINUTE, text: 'Under an hour to the next event', colour: '#4fb36b' },
|
|
58
|
+
{ stage: 4, over: 10 * MINUTE, text: 'The next event is within the hour', colour: '#e3c04a' },
|
|
59
|
+
{ stage: 5, over: 2 * MINUTE, text: 'The next event is close', colour: '#e8892f' },
|
|
60
|
+
{ stage: 6, over: -Infinity, text: 'PREPARE FOR THE NEXT EVENT!', colour: '#e0412f' },
|
|
61
|
+
];
|
|
62
|
+
export function isRingStage(n) {
|
|
63
|
+
return n === 1 || n === 2 || n === 3 || n === 4 || n === 5 || n === 6;
|
|
64
|
+
}
|
|
65
|
+
/** The slot of the most recent event start at `now`: event n starts at n * RING_PERIOD_MS. */
|
|
66
|
+
export function slotAt(now) {
|
|
67
|
+
return Math.floor(now / RING_PERIOD_MS);
|
|
68
|
+
}
|
|
69
|
+
/** When the next event starts (strictly after `now`). */
|
|
70
|
+
export function nextEventAt(now) {
|
|
71
|
+
return (slotAt(now) + 1) * RING_PERIOD_MS;
|
|
72
|
+
}
|
|
73
|
+
/** The countdown stage for this much time left to the next event. */
|
|
74
|
+
export function stageAt(msToNext) {
|
|
75
|
+
for (const row of RING_STAGE_TABLE)
|
|
76
|
+
if (msToNext > row.over)
|
|
77
|
+
return row.stage;
|
|
78
|
+
return 6;
|
|
79
|
+
}
|
|
80
|
+
export function stageText(stage) {
|
|
81
|
+
return RING_STAGE_TABLE.find((r) => r.stage === stage).text;
|
|
82
|
+
}
|
|
83
|
+
/** The stage's lamp colour (CSS hex), for the sign and the pillar lamps. */
|
|
84
|
+
export function stageColour(stage) {
|
|
85
|
+
return RING_STAGE_TABLE.find((r) => r.stage === stage).colour;
|
|
86
|
+
}
|
|
87
|
+
/** The world chat line for a stage. */
|
|
88
|
+
export function chatLine(stage, ring = RINGSTONE) {
|
|
89
|
+
return `World event: ${stageText(stage)} - ${ring.title}, ${ring.where}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Where the clock stands at `now`: the event it is counting towards (or fighting) and the stage. For RING_FIGHT_MS
|
|
93
|
+
* after an event starts the ring stays on stage 6 for that event (the fight, phase 2); then it counts to the next.
|
|
94
|
+
*/
|
|
95
|
+
export function ringClockAt(now) {
|
|
96
|
+
const slot = slotAt(now);
|
|
97
|
+
if (now - slot * RING_PERIOD_MS < RING_FIGHT_MS)
|
|
98
|
+
return { eventSlot: slot, stage: 6, msToNext: 0 };
|
|
99
|
+
const msToNext = nextEventAt(now) - now;
|
|
100
|
+
return { eventSlot: slot + 1, stage: stageAt(msToNext), msToNext };
|
|
101
|
+
}
|
|
102
|
+
function hashSlot(slot, salt) {
|
|
103
|
+
let h = Math.imul(slot ^ 0x5bd1e995, 0x27d4eb2d) ^ Math.imul(salt + 0x165667b1, 0x85ebca6b);
|
|
104
|
+
h = Math.imul(h ^ (h >>> 15), 0x2c1b3c6d);
|
|
105
|
+
h = Math.imul(h ^ (h >>> 12), 0x297a2d39);
|
|
106
|
+
h ^= h >>> 15;
|
|
107
|
+
return h >>> 0;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The boss for an event slot, the same on every server and after every restart, and never the boss of the slot
|
|
111
|
+
* before. With two in the pool they alternate (the phase of the alternation is hashed); with more, even slots roll
|
|
112
|
+
* freely and each odd slot rolls among the bosses that are neither of its even neighbours'.
|
|
113
|
+
*/
|
|
114
|
+
export function bossForSlot(slot, ring = RINGSTONE) {
|
|
115
|
+
const pool = ring.bossPool;
|
|
116
|
+
const n = pool.length;
|
|
117
|
+
if (n === 1)
|
|
118
|
+
return pool[0];
|
|
119
|
+
const salt = ring.id.length * 7919 + ring.id.charCodeAt(0);
|
|
120
|
+
if (n === 2)
|
|
121
|
+
return pool[(((slot % 2) + 2) % 2 + (hashSlot(0, salt) % 2)) % 2];
|
|
122
|
+
const even = (s) => hashSlot(s, salt) % n;
|
|
123
|
+
if (((slot % 2) + 2) % 2 === 0)
|
|
124
|
+
return pool[even(slot)];
|
|
125
|
+
const left = new Set([even(slot - 1), even(slot + 1)]);
|
|
126
|
+
const choices = pool.map((_, i) => i).filter((i) => !left.has(i));
|
|
127
|
+
return pool[choices[hashSlot(slot, salt) % choices.length]];
|
|
128
|
+
}
|
|
129
|
+
/** Tile on the ring's stone floor. */
|
|
130
|
+
export function inRingFloor(x, z, ring = RINGSTONE) {
|
|
131
|
+
return Math.hypot(x - ring.centre.x, z - ring.centre.z) <= ring.floorRadius;
|
|
132
|
+
}
|
|
133
|
+
/** Tile inside the pillar circle: standing here counts as being in the ring. */
|
|
134
|
+
export function inRing(x, z, ring = RINGSTONE) {
|
|
135
|
+
return Math.hypot(x - ring.centre.x, z - ring.centre.z) <= ring.pillarRadius;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The pillars' tiles, clockwise from the east, offset half a step so the south (the entrance) falls in a gap
|
|
139
|
+
* between two of them.
|
|
140
|
+
*/
|
|
141
|
+
export function ringPillars(ring = RINGSTONE) {
|
|
142
|
+
const out = [];
|
|
143
|
+
const step = (Math.PI * 2) / ring.pillarCount;
|
|
144
|
+
for (let i = 0; i < ring.pillarCount; i++) {
|
|
145
|
+
const a = step / 2 + i * step;
|
|
146
|
+
out.push({ x: Math.round(ring.centre.x + Math.cos(a) * ring.pillarRadius), z: Math.round(ring.centre.z + Math.sin(a) * ring.pillarRadius) });
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The Old Ring's nine standing stones, moved out from the middle to a loose ring just inside the pillars (James,
|
|
152
|
+
* 2026-10-09: the centre stays empty for the fight). Angles in degrees, clockwise from the east (z grows south), kept
|
|
153
|
+
* off the entrance (south) and the cage (north); radii vary a little so it reads as old and loose, not laid out.
|
|
154
|
+
*/
|
|
155
|
+
export const RING_OLD_STONE_ANGLES = [
|
|
156
|
+
{ deg: 0, r: 12.5 }, { deg: 33, r: 12 }, { deg: 62, r: 12.6 }, { deg: 124, r: 12.3 }, { deg: 160, r: 12.8 },
|
|
157
|
+
{ deg: 200, r: 12.2 }, { deg: 236, r: 12.6 }, { deg: 302, r: 12.4 }, { deg: 334, r: 12.9 },
|
|
158
|
+
];
|
|
159
|
+
export function ringOldStones(ring = RINGSTONE) {
|
|
160
|
+
return RING_OLD_STONE_ANGLES.map(({ deg, r }) => {
|
|
161
|
+
const a = (deg * Math.PI) / 180;
|
|
162
|
+
return { x: Math.round(ring.centre.x + Math.cos(a) * r), z: Math.round(ring.centre.z + Math.sin(a) * r) };
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=worldBossRing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worldBossRing.js","sourceRoot":"","sources":["../src/worldBossRing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dreadwood-types/types",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.160",
|
|
4
4
|
"description": "Public wire protocol and client-safe constants for Dreadwoods",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
],
|
|
23
23
|
"scripts": {
|
|
24
24
|
"build": "tsc -p tsconfig.json",
|
|
25
|
-
"test": "node --test scripts/animation-test.mjs scripts/starter-jobs-test.mjs scripts/cooking-nudge-test.mjs scripts/surface-chart-test.mjs scripts/south-expansion-test.mjs scripts/rudd-test.mjs scripts/cave-map-test.mjs scripts/birch-combat-test.mjs scripts/fort-rook-bosses-test.mjs scripts/bounty-first-test.mjs scripts/running-test.mjs scripts/energy-test.mjs scripts/starter-town-test.mjs scripts/starter-expansion-test.mjs scripts/five-arches-test.mjs scripts/landing-test.mjs scripts/cove-ship-test.mjs scripts/south-fields-quests-test.mjs scripts/arcane-lands-test.mjs scripts/fair-folk-test.mjs",
|
|
25
|
+
"test": "node --test scripts/animation-test.mjs scripts/starter-jobs-test.mjs scripts/cooking-nudge-test.mjs scripts/surface-chart-test.mjs scripts/south-expansion-test.mjs scripts/rudd-test.mjs scripts/cave-map-test.mjs scripts/birch-combat-test.mjs scripts/fort-rook-bosses-test.mjs scripts/bounty-first-test.mjs scripts/running-test.mjs scripts/energy-test.mjs scripts/starter-town-test.mjs scripts/starter-expansion-test.mjs scripts/five-arches-test.mjs scripts/landing-test.mjs scripts/cove-ship-test.mjs scripts/south-fields-quests-test.mjs scripts/arcane-lands-test.mjs scripts/fair-folk-test.mjs scripts/world-boss-ring-test.mjs scripts/hopewood-wildlife-test.mjs",
|
|
26
26
|
"dev": "tsc -p tsconfig.json --watch",
|
|
27
27
|
"prepare": "npm run build",
|
|
28
28
|
"prepublishOnly": "npm run build"
|