screeps-clockwork 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,7 +1,100 @@
1
1
  # Screeps Clockwork
2
2
 
3
- ## Environment Setup
3
+ <div style="text-align: center;"><a href="https://glitchassassin.github.io/screeps-clockwork/">Understand the Theory</a> | <a href="https://glitchassassin.github.io/screeps-clockwork/api/">API Docs</a></div>
4
4
 
5
- [Rust & cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html)
6
- [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/)
7
- [node LTS](https://github.com/nvm-sh/nvm)
5
+ ## Usage
6
+
7
+ This guide will assume you're using Rollup along the lines of the Screeps Typescript starter kit.
8
+
9
+ Set up dependencies:
10
+
11
+ ```
12
+ npm install screeps-clockwork
13
+ npm install -D @rollup/plugin-wasm rollup-plugin-copy
14
+ ```
15
+
16
+ Update your Rollup build script to copy the WASM binary to your dist folder:
17
+
18
+ ```js
19
+ // add to existing dependencies
20
+ import wasm from '@rollup/plugin-wasm';
21
+ import copy from 'rollup-plugin-copy';
22
+
23
+ // ...
24
+
25
+ export default {
26
+ // ...
27
+ external: ['screeps_clockwork.wasm'],
28
+ plugins: [
29
+ clear({ targets: ['dist'] }),
30
+ wasm(),
31
+ copy({
32
+ targets: [
33
+ {
34
+ src: 'node_modules/screeps-clockwork/dist/screeps_clockwork.wasm',
35
+ dest: 'dist'
36
+ }
37
+ ]
38
+ }),
39
+ // ...
40
+ screeps({ config: cfg, dryRun: cfg == null })
41
+ ]
42
+ };
43
+ ```
44
+
45
+ `rollup-plugin-screeps` will automatically push the wasm file out when it deploys.
46
+
47
+ ## Dev Setup
48
+
49
+ Dependencies to build and run the project:
50
+
51
+ ```bash
52
+ # Install Rust + Cargo via rustup
53
+ curl https://sh.rustup.rs -sSf | sh
54
+
55
+ # Install wasm-pack
56
+ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
57
+
58
+ # Add rust-src component
59
+ rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
60
+
61
+ # Install nvm
62
+ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
63
+
64
+ # Install node
65
+ nvm install --lts
66
+ nvm use --lts
67
+ nvm alias default --lts # optional
68
+ ```
69
+
70
+ To build the project:
71
+
72
+ ```bash
73
+ npm run build
74
+ ```
75
+
76
+ To set up the local Screeps server, you'll need to have docker installed:
77
+
78
+ ```bash
79
+ cp .env.sample .env # fill this out with the path to your Screeps .nw package and Steam key
80
+ ./reset-docker.sh
81
+ ```
82
+
83
+ Once running, you can log in and spawn into the server with the [local screeps-steamless-client](http://localhost:8080/).
84
+
85
+ - **Username:** clockwork
86
+ - **Password:** passw0rd
87
+
88
+ To deploy the test codebase, once the server is running:
89
+
90
+ ```bash
91
+ npm run watch
92
+ ```
93
+
94
+ Set up commitizen and pre-commit for conventional commits:
95
+
96
+ ```bash
97
+ # requires Python 3.8+
98
+ pip install --user -U commitizen pre-commit
99
+ pre-commit install
100
+ ```
package/dist/index.js CHANGED
@@ -4,13 +4,25 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
6
6
 
7
+ var EncoderDecoderTogether_min = {};
8
+
9
+ var hasRequiredEncoderDecoderTogether_min;
10
+
11
+ function requireEncoderDecoderTogether_min () {
12
+ if (hasRequiredEncoderDecoderTogether_min) return EncoderDecoderTogether_min;
13
+ hasRequiredEncoderDecoderTogether_min = 1;
7
14
  (function(q){function y(){}function C(b){var c=b.charCodeAt(0)|0;if(55296<=c)if(56319>=c)if(b=b.charCodeAt(1)|0,56320<=b&&57343>=b){if(c=(c<<10)+b-56613888|0,65535<c)return v(240|c>>18,128|c>>12&63,128|c>>6&63,128|c&63)}else c=65533;else 57343>=c&&(c=65533);return 2047>=c?v(192|c>>6,128|c&63):v(224|c>>12,128|c>>6&63,128|c&63)}function z(){}function A(b,c){var g=void 0===b?"":(""+b).replace(D,C),d=g.length|0,a=0,k=0,f=c.length|0,h=b.length|0;f<d&&(d=f);a:for(;a<d;a=a+1|0){b=g.charCodeAt(a)|
8
- 0;switch(b>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:k=k+1|0;case 8:case 9:case 10:case 11:break;case 12:case 13:if((a+1|0)<f){k=k+1|0;break}case 14:if((a+2|0)<f){k=k+1|0;break}case 15:if((a+3|0)<f){k=k+1|0;break}default:break a}c[a]=b;}return {written:a,read:h<k?h:k}}var v=String.fromCharCode,x={}.toString,E=x.call(q.SharedArrayBuffer),F=x(),t=q.Uint8Array,w=t||Array,u=t?ArrayBuffer:w,G=u.isView||function(b){return b&&"length"in b},H=x.call(u.prototype),B=z.prototype;u=q.TextEncoder;
9
- var D=/[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g,e=new (t?Uint16Array:w)(32);y.prototype.decode=function(b){if(!G(b)){var c=x.call(b);if(c!==H&&c!==E&&c!==F)throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");b=t?new w(b):b||[];}for(var g=c="",d=0,a=b.length|0,k=a-32|0,f,h,l=0,r=0,n,m=0,p=-1;d<a;){for(f=d<=k?32:a-d|0;m<f;d=d+1|0,m=m+1|0){h=b[d]&255;switch(h>>4){case 15:n=b[d=d+1|0]&255;if(2!==n>>6||
10
- 247<h){d=d-1|0;break}l=(h&7)<<6|n&63;r=5;h=256;case 14:n=b[d=d+1|0]&255,l<<=6,l|=(h&15)<<6|n&63,r=2===n>>6?r+4|0:24,h=h+256&768;case 13:case 12:n=b[d=d+1|0]&255,l<<=6,l|=(h&31)<<6|n&63,r=r+7|0,d<a&&2===n>>6&&l>>r&&1114112>l?(h=l,l=l-65536|0,0<=l&&(p=(l>>10)+55296|0,h=(l&1023)+56320|0,31>m?(e[m]=p,m=m+1|0,p=-1):(n=p,p=h,h=n))):(h>>=8,d=d-h-1|0,h=65533),l=r=0,f=d<=k?32:a-d|0;default:e[m]=h;continue;case 11:case 10:case 9:case 8:}e[m]=65533;}g+=v(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],
11
- e[11],e[12],e[13],e[14],e[15],e[16],e[17],e[18],e[19],e[20],e[21],e[22],e[23],e[24],e[25],e[26],e[27],e[28],e[29],e[30],e[31]);32>m&&(g=g.slice(0,m-32|0));if(d<a){if(e[0]=p,m=~p>>>31,p=-1,g.length<c.length)continue}else -1!==p&&(g+=v(p));c+=g;g="";}return c};B.encode=function(b){b=void 0===b?"":""+b;var c=b.length|0,g=new w((c<<1)+8|0),d,a=0,k=!t;for(d=0;d<c;d=d+1|0,a=a+1|0){var f=b.charCodeAt(d)|0;if(127>=f)g[a]=f;else {if(2047>=f)g[a]=192|f>>6;else {a:{if(55296<=f)if(56319>=f){var h=b.charCodeAt(d=
12
- d+1|0)|0;if(56320<=h&&57343>=h){f=(f<<10)+h-56613888|0;if(65535<f){g[a]=240|f>>18;g[a=a+1|0]=128|f>>12&63;g[a=a+1|0]=128|f>>6&63;g[a=a+1|0]=128|f&63;continue}break a}f=65533;}else 57343>=f&&(f=65533);!k&&d<<1<a&&d<<1<(a-7|0)&&(k=!0,h=new w(3*c),h.set(g),g=h);}g[a]=224|f>>12;g[a=a+1|0]=128|f>>6&63;}g[a=a+1|0]=128|f&63;}}return t?g.subarray(0,a):g.slice(0,a)};B.encodeInto=A;if(!u)q.TextDecoder=y,q.TextEncoder=z;else if(!(q=u.prototype).encodeInto){var I=new u;q.encodeInto=function(b,c){var g=b.length|0,
13
- d=c.length|0;if(g<d>>1){var a=I.encode(b);if((a.length|0)<d)return c.set(a),{read:g,written:a.length|0}}return A(b,c)};}})("undefined"==typeof commonjsGlobal?"undefined"==typeof self?commonjsGlobal:self:commonjsGlobal);//AnonyCo
15
+ 0;switch(b>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:k=k+1|0;case 8:case 9:case 10:case 11:break;case 12:case 13:if((a+1|0)<f){k=k+1|0;break}case 14:if((a+2|0)<f){k=k+1|0;break}case 15:if((a+3|0)<f){k=k+1|0;break}default:break a}c[a]=b;}return {written:a,read:h<k?h:k}}var v=String.fromCharCode,x={}.toString,E=x.call(q.SharedArrayBuffer),F=x(),t=q.Uint8Array,w=t||Array,u=t?ArrayBuffer:w,G=u.isView||function(b){return b&&"length"in b},H=x.call(u.prototype),B=z.prototype;u=q.TextEncoder;
16
+ var D=/[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g,e=new (t?Uint16Array:w)(32);y.prototype.decode=function(b){if(!G(b)){var c=x.call(b);if(c!==H&&c!==E&&c!==F)throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");b=t?new w(b):b||[];}for(var g=c="",d=0,a=b.length|0,k=a-32|0,f,h,l=0,r=0,n,m=0,p=-1;d<a;){for(f=d<=k?32:a-d|0;m<f;d=d+1|0,m=m+1|0){h=b[d]&255;switch(h>>4){case 15:n=b[d=d+1|0]&255;if(2!==n>>6||
17
+ 247<h){d=d-1|0;break}l=(h&7)<<6|n&63;r=5;h=256;case 14:n=b[d=d+1|0]&255,l<<=6,l|=(h&15)<<6|n&63,r=2===n>>6?r+4|0:24,h=h+256&768;case 13:case 12:n=b[d=d+1|0]&255,l<<=6,l|=(h&31)<<6|n&63,r=r+7|0,d<a&&2===n>>6&&l>>r&&1114112>l?(h=l,l=l-65536|0,0<=l&&(p=(l>>10)+55296|0,h=(l&1023)+56320|0,31>m?(e[m]=p,m=m+1|0,p=-1):(n=p,p=h,h=n))):(h>>=8,d=d-h-1|0,h=65533),l=r=0,f=d<=k?32:a-d|0;default:e[m]=h;continue;case 11:case 10:case 9:case 8:}e[m]=65533;}g+=v(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],
18
+ e[11],e[12],e[13],e[14],e[15],e[16],e[17],e[18],e[19],e[20],e[21],e[22],e[23],e[24],e[25],e[26],e[27],e[28],e[29],e[30],e[31]);32>m&&(g=g.slice(0,m-32|0));if(d<a){if(e[0]=p,m=~p>>>31,p=-1,g.length<c.length)continue}else -1!==p&&(g+=v(p));c+=g;g="";}return c};B.encode=function(b){b=void 0===b?"":""+b;var c=b.length|0,g=new w((c<<1)+8|0),d,a=0,k=!t;for(d=0;d<c;d=d+1|0,a=a+1|0){var f=b.charCodeAt(d)|0;if(127>=f)g[a]=f;else {if(2047>=f)g[a]=192|f>>6;else {a:{if(55296<=f)if(56319>=f){var h=b.charCodeAt(d=
19
+ d+1|0)|0;if(56320<=h&&57343>=h){f=(f<<10)+h-56613888|0;if(65535<f){g[a]=240|f>>18;g[a=a+1|0]=128|f>>12&63;g[a=a+1|0]=128|f>>6&63;g[a=a+1|0]=128|f&63;continue}break a}f=65533;}else 57343>=f&&(f=65533);!k&&d<<1<a&&d<<1<(a-7|0)&&(k=!0,h=new w(3*c),h.set(g),g=h);}g[a]=224|f>>12;g[a=a+1|0]=128|f>>6&63;}g[a=a+1|0]=128|f&63;}}return t?g.subarray(0,a):g.slice(0,a)};B.encodeInto=A;if(!u)q.TextDecoder=y,q.TextEncoder=z;else if(!(q=u.prototype).encodeInto){var I=new u;q.encodeInto=function(b,c){var g=b.length|0,
20
+ d=c.length|0;if(g<d>>1){var a=I.encode(b);if((a.length|0)<d)return c.set(a),{read:g,written:a.length|0}}return A(b,c)};}})("undefined"==typeof commonjsGlobal?"undefined"==typeof self?EncoderDecoderTogether_min:self:commonjsGlobal);//AnonyCo
21
+
22
+ return EncoderDecoderTogether_min;
23
+ }
24
+
25
+ requireEncoderDecoderTogether_min();
14
26
 
15
27
  let wasm;
16
28
 
@@ -72,6 +84,36 @@ function getStringFromWasm0(ptr, len) {
72
84
  ptr = ptr >>> 0;
73
85
  return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
74
86
  }
87
+ /**
88
+ * @returns {string}
89
+ */
90
+ function version() {
91
+ let deferred1_0;
92
+ let deferred1_1;
93
+ try {
94
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
95
+ wasm.version(retptr);
96
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
97
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
98
+ deferred1_0 = r0;
99
+ deferred1_1 = r1;
100
+ return getStringFromWasm0(r0, r1);
101
+ } finally {
102
+ wasm.__wbindgen_add_to_stack_pointer(16);
103
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Exports the global range calculation between two positions.
109
+ * @param {number} packed_pos_1
110
+ * @param {number} packed_pos_2
111
+ * @returns {number}
112
+ */
113
+ function get_range(packed_pos_1, packed_pos_2) {
114
+ const ret = wasm.get_range(packed_pos_1, packed_pos_2);
115
+ return ret >>> 0;
116
+ }
75
117
 
76
118
  let cachedUint32ArrayMemory0 = null;
77
119
 
@@ -98,87 +140,64 @@ function _assertClass(instance, klass) {
98
140
  return instance.ptr;
99
141
  }
100
142
  /**
101
- *
102
- * * WASM wrapper for the BFS distance map function.
103
- *
143
+ * WASM wrapper for the Dijkstra flow field function.
104
144
  * @param {Uint32Array} start_packed
105
145
  * @param {ClockworkCostMatrix} cost_matrix
106
- * @returns {DistanceMap}
146
+ * @returns {FlowField}
107
147
  */
108
- function js_bfs_distance_map(start_packed, cost_matrix) {
148
+ function js_dijkstra_flow_field(start_packed, cost_matrix) {
109
149
  const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
110
150
  const len0 = WASM_VECTOR_LEN;
111
151
  _assertClass(cost_matrix, ClockworkCostMatrix);
112
- const ret = wasm.js_bfs_distance_map(ptr0, len0, cost_matrix.__wbg_ptr);
113
- return DistanceMap.__wrap(ret);
152
+ const ret = wasm.js_dijkstra_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
153
+ return FlowField.__wrap(ret);
114
154
  }
115
155
 
116
156
  /**
117
- *
118
- * * WASM wrapper for the BFS flow field function.
119
- *
157
+ * WASM wrapper for the Dijkstra mono flow field function.
120
158
  * @param {Uint32Array} start_packed
121
159
  * @param {ClockworkCostMatrix} cost_matrix
122
- * @returns {FlowField}
160
+ * @returns {MonoFlowField}
123
161
  */
124
- function js_bfs_flow_field(start_packed, cost_matrix) {
162
+ function js_dijkstra_mono_flow_field(start_packed, cost_matrix) {
125
163
  const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
126
164
  const len0 = WASM_VECTOR_LEN;
127
165
  _assertClass(cost_matrix, ClockworkCostMatrix);
128
- const ret = wasm.js_bfs_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
129
- return FlowField.__wrap(ret);
166
+ const ret = wasm.js_dijkstra_mono_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
167
+ return MonoFlowField.__wrap(ret);
130
168
  }
131
169
 
132
170
  /**
133
- *
134
- * * WASM wrapper for the BFS mono flow field function.
135
- *
171
+ * WASM wrapper for the BFS flow field function.
136
172
  * @param {Uint32Array} start_packed
137
173
  * @param {ClockworkCostMatrix} cost_matrix
138
- * @returns {MonoFlowField}
174
+ * @returns {FlowField}
139
175
  */
140
- function js_bfs_mono_flow_field(start_packed, cost_matrix) {
176
+ function js_bfs_flow_field(start_packed, cost_matrix) {
141
177
  const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
142
178
  const len0 = WASM_VECTOR_LEN;
143
179
  _assertClass(cost_matrix, ClockworkCostMatrix);
144
- const ret = wasm.js_bfs_mono_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
145
- return MonoFlowField.__wrap(ret);
146
- }
147
-
148
- /**
149
- * @returns {string}
150
- */
151
- function version() {
152
- let deferred1_0;
153
- let deferred1_1;
154
- try {
155
- const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
156
- wasm.version(retptr);
157
- var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
158
- var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
159
- deferred1_0 = r0;
160
- deferred1_1 = r1;
161
- return getStringFromWasm0(r0, r1);
162
- } finally {
163
- wasm.__wbindgen_add_to_stack_pointer(16);
164
- wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
165
- }
166
- }
167
-
168
- /**
169
- * @param {number} packed_pos_1
170
- * @param {number} packed_pos_2
171
- * @returns {number}
172
- */
173
- function get_range(packed_pos_1, packed_pos_2) {
174
- const ret = wasm.get_range(packed_pos_1, packed_pos_2);
175
- return ret >>> 0;
180
+ const ret = wasm.js_bfs_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
181
+ return FlowField.__wrap(ret);
176
182
  }
177
183
 
178
184
  function getArrayU32FromWasm0(ptr, len) {
179
185
  ptr = ptr >>> 0;
180
186
  return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
181
187
  }
188
+ /**
189
+ * WASM wrapper for the Dijkstra distance map function.
190
+ * @param {Uint32Array} start_packed
191
+ * @param {ClockworkCostMatrix} cost_matrix
192
+ * @returns {DistanceMap}
193
+ */
194
+ function js_dijkstra_distance_map(start_packed, cost_matrix) {
195
+ const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
196
+ const len0 = WASM_VECTOR_LEN;
197
+ _assertClass(cost_matrix, ClockworkCostMatrix);
198
+ const ret = wasm.js_dijkstra_distance_map(ptr0, len0, cost_matrix.__wbg_ptr);
199
+ return DistanceMap.__wrap(ret);
200
+ }
182
201
 
183
202
  function getArrayJsValueFromWasm0(ptr, len) {
184
203
  ptr = ptr >>> 0;
@@ -199,6 +218,34 @@ function passArrayJsValueToWasm0(array, malloc) {
199
218
  WASM_VECTOR_LEN = array.length;
200
219
  return ptr;
201
220
  }
221
+ /**
222
+ * WASM wrapper for the BFS distance map function.
223
+ * @param {Uint32Array} start_packed
224
+ * @param {ClockworkCostMatrix} cost_matrix
225
+ * @returns {DistanceMap}
226
+ */
227
+ function js_bfs_distance_map(start_packed, cost_matrix) {
228
+ const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
229
+ const len0 = WASM_VECTOR_LEN;
230
+ _assertClass(cost_matrix, ClockworkCostMatrix);
231
+ const ret = wasm.js_bfs_distance_map(ptr0, len0, cost_matrix.__wbg_ptr);
232
+ return DistanceMap.__wrap(ret);
233
+ }
234
+
235
+ /**
236
+ * WASM wrapper for the BFS mono flow field function.
237
+ * @param {Uint32Array} start_packed
238
+ * @param {ClockworkCostMatrix} cost_matrix
239
+ * @returns {MonoFlowField}
240
+ */
241
+ function js_bfs_mono_flow_field(start_packed, cost_matrix) {
242
+ const ptr0 = passArray32ToWasm0(start_packed, wasm.__wbindgen_malloc);
243
+ const len0 = WASM_VECTOR_LEN;
244
+ _assertClass(cost_matrix, ClockworkCostMatrix);
245
+ const ret = wasm.js_bfs_mono_flow_field(ptr0, len0, cost_matrix.__wbg_ptr);
246
+ return MonoFlowField.__wrap(ret);
247
+ }
248
+
202
249
  /**
203
250
  * Translates `COLOR_*` and `COLORS_ALL` constants.
204
251
  */
@@ -256,7 +303,11 @@ Object.freeze({ Plain:0,"0":"Plain",Wall:1,"1":"Wall",Swamp:2,"2":"Swamp", });
256
303
  const ClockworkCostMatrixFinalization = (typeof FinalizationRegistry === 'undefined')
257
304
  ? { register: () => {}, unregister: () => {} }
258
305
  : new FinalizationRegistry(ptr => wasm.__wbg_clockworkcostmatrix_free(ptr >>> 0, 1));
259
-
306
+ /**
307
+ * A wrapper around the `LocalCostMatrix` type from the Screeps API.
308
+ * Instances can be passed between WASM and JS as a pointer, using the
309
+ * methods to get and set values, rather than copying the entire matrix.
310
+ */
260
311
  class ClockworkCostMatrix {
261
312
 
262
313
  __destroy_into_raw() {
@@ -270,13 +321,19 @@ class ClockworkCostMatrix {
270
321
  const ptr = this.__destroy_into_raw();
271
322
  wasm.__wbg_clockworkcostmatrix_free(ptr, 0);
272
323
  }
273
- constructor() {
274
- const ret = wasm.clockworkcostmatrix_new();
324
+ /**
325
+ * Creates a new cost matrix within the WASM module. Optionally, a default value
326
+ * can be provided to initialize all cells in the matrix to that value.
327
+ * @param {number | undefined} [_default]
328
+ */
329
+ constructor(_default) {
330
+ const ret = wasm.clockworkcostmatrix_new(isLikeNone(_default) ? 0xFFFFFF : _default);
275
331
  this.__wbg_ptr = ret >>> 0;
276
332
  ClockworkCostMatrixFinalization.register(this, this.__wbg_ptr, this);
277
333
  return this;
278
334
  }
279
335
  /**
336
+ * Gets the cost of a given position in the cost matrix.
280
337
  * @param {number} x
281
338
  * @param {number} y
282
339
  * @returns {number}
@@ -286,6 +343,7 @@ class ClockworkCostMatrix {
286
343
  return ret;
287
344
  }
288
345
  /**
346
+ * Sets the cost of a given position in the cost matrix.
289
347
  * @param {number} x
290
348
  * @param {number} y
291
349
  * @param {number} value
@@ -299,7 +357,7 @@ const DistanceMapFinalization = (typeof FinalizationRegistry === 'undefined')
299
357
  ? { register: () => {}, unregister: () => {} }
300
358
  : new FinalizationRegistry(ptr => wasm.__wbg_distancemap_free(ptr >>> 0, 1));
301
359
  /**
302
- * Maps arbitrary data onto individual room tile positions.
360
+ * Maps a distance value onto individual room tile positions.
303
361
  */
304
362
  class DistanceMap {
305
363
 
@@ -323,6 +381,7 @@ class DistanceMap {
323
381
  wasm.__wbg_distancemap_free(ptr, 0);
324
382
  }
325
383
  /**
384
+ * Converts the distance map into a flat array of distances.
326
385
  * @returns {Uint32Array}
327
386
  */
328
387
  toArray() {
@@ -339,6 +398,7 @@ class DistanceMap {
339
398
  }
340
399
  }
341
400
  /**
401
+ * Gets the distance value at a given position.
342
402
  * @param {number} x
343
403
  * @param {number} y
344
404
  * @returns {number}
@@ -348,6 +408,7 @@ class DistanceMap {
348
408
  return ret >>> 0;
349
409
  }
350
410
  /**
411
+ * Sets the distance value at a given position.
351
412
  * @param {number} x
352
413
  * @param {number} y
353
414
  * @param {number} value
@@ -361,12 +422,10 @@ const FlowFieldFinalization = (typeof FinalizationRegistry === 'undefined')
361
422
  ? { register: () => {}, unregister: () => {} }
362
423
  : new FinalizationRegistry(ptr => wasm.__wbg_flowfield_free(ptr >>> 0, 1));
363
424
  /**
364
- *
365
- * * A flow field is a 50x50 grid (representing a room), representing viable directions
366
- * * to travel to reach a particular target (or targets). A given tile may have multiple
367
- * * equally valid directions, so we represent this as a bitfield (where each bit in an
368
- * * 8-bit unsigned integer represents a direction that is either viable or not).
369
- *
425
+ * A flow field is a 50x50 grid (representing a room), representing viable directions
426
+ * to travel to reach a particular target (or targets). A given tile may have multiple
427
+ * equally valid directions, so we represent this as a bitfield (where each bit in an
428
+ * 8-bit unsigned integer represents a direction that is either viable or not).
370
429
  */
371
430
  class FlowField {
372
431
 
@@ -390,9 +449,7 @@ class FlowField {
390
449
  wasm.__wbg_flowfield_free(ptr, 0);
391
450
  }
392
451
  /**
393
- *
394
- * * Get the internal value for a given coordinate.
395
- *
452
+ * Get the internal value for a given coordinate.
396
453
  * @param {number} x
397
454
  * @param {number} y
398
455
  * @returns {number}
@@ -402,9 +459,7 @@ class FlowField {
402
459
  return ret;
403
460
  }
404
461
  /**
405
- *
406
- * * Set the internal value for a given coordinate.
407
- *
462
+ * Set the internal value for a given coordinate.
408
463
  * @param {number} x
409
464
  * @param {number} y
410
465
  * @param {number} value
@@ -413,9 +468,7 @@ class FlowField {
413
468
  wasm.flowfield_set(this.__wbg_ptr, x, y, value);
414
469
  }
415
470
  /**
416
- *
417
- * * Get the list of valid directions for a given coordinate.
418
- *
471
+ * Get the list of valid directions for a given coordinate.
419
472
  * @param {number} x
420
473
  * @param {number} y
421
474
  * @returns {any[]}
@@ -434,9 +487,7 @@ class FlowField {
434
487
  }
435
488
  }
436
489
  /**
437
- *
438
- * * Set the list of valid directions for a given coordinate.
439
- *
490
+ * Set the list of valid directions for a given coordinate.
440
491
  * @param {number} x
441
492
  * @param {number} y
442
493
  * @param {any[]} directions
@@ -447,6 +498,7 @@ class FlowField {
447
498
  wasm.flowfield_setDirections(this.__wbg_ptr, x, y, ptr0, len0);
448
499
  }
449
500
  /**
501
+ * Add a direction to the list of valid directions for a given coordinate.
450
502
  * @param {number} x
451
503
  * @param {number} y
452
504
  * @param {Direction} direction
@@ -460,12 +512,10 @@ const MonoFlowFieldFinalization = (typeof FinalizationRegistry === 'undefined')
460
512
  ? { register: () => {}, unregister: () => {} }
461
513
  : new FinalizationRegistry(ptr => wasm.__wbg_monoflowfield_free(ptr >>> 0, 1));
462
514
  /**
463
- *
464
- * * A flow field is a 50x50 grid (representing a room), representing viable directions
465
- * * to travel to reach a particular target (or targets). A mono flow field only stores
466
- * * a single direction for each tile, so we represent this as 4 bits of an unsigned
467
- * * integer (0 for no direction, 1 for TOP, etc.).
468
- *
515
+ * A flow field is a 50x50 grid (representing a room), representing viable directions
516
+ * to travel to reach a particular target (or targets). A mono flow field only stores
517
+ * a single direction for each tile, so we represent this as 4 bits of an unsigned
518
+ * integer (0 for no direction, 1 for TOP, etc.).
469
519
  */
470
520
  class MonoFlowField {
471
521
 
@@ -489,9 +539,7 @@ class MonoFlowField {
489
539
  wasm.__wbg_monoflowfield_free(ptr, 0);
490
540
  }
491
541
  /**
492
- *
493
- * * Get the direction for a given coordinate.
494
- *
542
+ * Get the direction for a given coordinate.
495
543
  * @param {number} x
496
544
  * @param {number} y
497
545
  * @returns {Direction | undefined}
@@ -501,9 +549,7 @@ class MonoFlowField {
501
549
  return ret === 0 ? undefined : ret;
502
550
  }
503
551
  /**
504
- *
505
- * * Set the direction for a given coordinate.
506
- *
552
+ * Set the direction for a given coordinate.
507
553
  * @param {number} x
508
554
  * @param {number} y
509
555
  * @param {Direction | undefined} [value]
@@ -591,23 +637,145 @@ function initSync(module) {
591
637
  return __wbg_finalize_init(instance);
592
638
  }
593
639
 
640
+ /**
641
+ * Generate a [distance map](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html) for a set of positions
642
+ * using a breadth-first search algorithm.
643
+ *
644
+ * The BFS algorithm doesn't include variable costs, and only considers
645
+ * values of 255 (impassible) in the provided cost matrix. Any other
646
+ * values are ignored.
647
+ *
648
+ * This might be useful for creeps with only MOVE parts and/or empty
649
+ * CARRY parts, which don't generate fatigue.
650
+ *
651
+ * Note that the `roomName` on start positions is ignored - all positions
652
+ * are assumed to be in the same room as the cost matrix.
653
+ *
654
+ * @param start - The starting positions.
655
+ * @param costMatrix - The cost matrix to use for the flow field.
656
+ * @returns The flow field.
657
+ */
594
658
  function bfsDistanceMap(start, costMatrix) {
595
659
  const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
596
660
  const result = js_bfs_distance_map(startPacked, costMatrix);
597
661
  return result;
598
662
  }
599
663
 
664
+ /**
665
+ * Generate a [flow field](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html) for a set of positions
666
+ * using a breadth-first search algorithm.
667
+ *
668
+ * The BFS algorithm doesn't include variable costs, and only considers
669
+ * values of 255 (impassible) in the provided cost matrix. Any other
670
+ * values are ignored.
671
+ *
672
+ * This might be useful for creeps with only MOVE parts and/or empty
673
+ * CARRY parts, which don't generate fatigue.
674
+ *
675
+ * @param start - The starting positions.
676
+ * @param costMatrix - The cost matrix to use for the flow field.
677
+ * @returns The flow field.
678
+ */
600
679
  function bfsFlowField(start, costMatrix) {
601
680
  const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
602
681
  const result = js_bfs_flow_field(startPacked, costMatrix);
603
682
  return result;
604
683
  }
684
+ /**
685
+ * Generate a [mono-directional flow field](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html)
686
+ * for a set of positions using a breadth-first search algorithm.
687
+ *
688
+ * The BFS algorithm doesn't include variable costs, and only considers
689
+ * values of 255 (impassible) in the provided cost matrix. Any other
690
+ * values are ignored.
691
+ *
692
+ * This might be useful for creeps with only MOVE parts and/or empty
693
+ * CARRY parts, which don't generate fatigue.
694
+ *
695
+ * Note that the `roomName` on start positions is ignored - all positions
696
+ * are assumed to be in the same room as the cost matrix.
697
+ *
698
+ * @param start - The starting positions.
699
+ * @param costMatrix - The cost matrix to use for the flow field.
700
+ * @returns The flow field.
701
+ */
605
702
  function bfsMonoFlowField(start, costMatrix) {
606
703
  const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
607
704
  const result = js_bfs_mono_flow_field(startPacked, costMatrix);
608
705
  return result;
609
706
  }
610
707
 
708
+ /**
709
+ * Generate a [distance map](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html) for a set of positions
710
+ * using Dijkstra's algorithm.
711
+ *
712
+ * Dijkstra's algorithm includes variable costs to account for terrain or other cost functions.
713
+ *
714
+ * Note that values of 0 in the cost matrix may have unexpected behavior. You probably want
715
+ * a cost matrix with a default value of at least 1.
716
+ *
717
+ * Note that the `roomName` on start positions is ignored - all positions
718
+ * are assumed to be in the same room as the cost matrix.
719
+ *
720
+ * @param start - The starting positions.
721
+ * @param costMatrix - The cost matrix to use for the flow field.
722
+ * @returns The flow field.
723
+ */
724
+ function dijkstraDistanceMap(start, costMatrix) {
725
+ const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
726
+ const result = js_dijkstra_distance_map(startPacked, costMatrix);
727
+ return result;
728
+ }
729
+
730
+ /**
731
+ * Generate a [flow field](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html) for a set of positions
732
+ * using Dijkstra's algorithm.
733
+ *
734
+ * Dijkstra's algorithm includes variable costs to account for terrain or other cost functions.
735
+ *
736
+ * Note that values of 0 in the cost matrix may have unexpected behavior. You probably want
737
+ * a cost matrix with a default value of at least 1.
738
+ *
739
+ * @param start - The starting positions.
740
+ * @param costMatrix - The cost matrix to use for the flow field.
741
+ * @returns The flow field.
742
+ */
743
+ function dijkstraFlowField(start, costMatrix) {
744
+ const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
745
+ const result = js_dijkstra_flow_field(startPacked, costMatrix);
746
+ return result;
747
+ }
748
+ /**
749
+ * Generate a [mono-directional flow field](https://glitchassassin.github.io/screeps-clockwork/primitives/flowfield.html)
750
+ * for a set of positions using Dijkstra's algorithm.
751
+ *
752
+ * Dijkstra's algorithm includes variable costs to account for terrain or other cost functions.
753
+ *
754
+ * Note that values of 0 in the cost matrix may have unexpected behavior. You probably want
755
+ * a cost matrix with a default value of at least 1.
756
+ *
757
+ * Note that the `roomName` on start positions is ignored - all positions
758
+ * are assumed to be in the same room as the cost matrix.
759
+ *
760
+ * @param start - The starting positions.
761
+ * @param costMatrix - The cost matrix to use for the flow field.
762
+ * @returns The flow field.
763
+ */
764
+ function dijkstraMonoFlowField(start, costMatrix) {
765
+ const startPacked = new Uint32Array(start.map(pos => pos.__packedPos));
766
+ const result = js_dijkstra_mono_flow_field(startPacked, costMatrix);
767
+ return result;
768
+ }
769
+
770
+ /**
771
+ * Get the global range between two positions. This is different
772
+ * from the `getRange` method on `RoomPosition`, which gets the
773
+ * range only within the same room.
774
+ *
775
+ * @param pos1 - The first position.
776
+ * @param pos2 - The second position.
777
+ * @returns The range between the two positions.
778
+ */
611
779
  function getRange(pos1, pos2) {
612
780
  return get_range(pos1.__packedPos, pos2.__packedPos);
613
781
  }
@@ -616,6 +784,14 @@ let wasm_bytes;
616
784
  let wasm_module;
617
785
  let wasm_instance;
618
786
  let initialized = false;
787
+ /**
788
+ * The `initialize` function should be called in your main loop before
789
+ * using any other screeps-clockwork functions. Depending on available
790
+ * CPU, it may not load the WASM module completely in the first tick,
791
+ * but it will pick back up where it left off if the script times out.
792
+ *
793
+ * @param verbose - If true, will log the state of the WASM module as it loads.
794
+ */
619
795
  function initialize(verbose = false) {
620
796
  if (!wasm_bytes)
621
797
  wasm_bytes = require('screeps_clockwork.wasm');
@@ -641,6 +817,9 @@ exports.MonoFlowField = MonoFlowField;
641
817
  exports.bfsDistanceMap = bfsDistanceMap;
642
818
  exports.bfsFlowField = bfsFlowField;
643
819
  exports.bfsMonoFlowField = bfsMonoFlowField;
820
+ exports.dijkstraDistanceMap = dijkstraDistanceMap;
821
+ exports.dijkstraFlowField = dijkstraFlowField;
822
+ exports.dijkstraMonoFlowField = dijkstraMonoFlowField;
644
823
  exports.getRange = getRange;
645
824
  exports.initialize = initialize;
646
825
  //# sourceMappingURL=index.js.map