warcraft-3-w3ts-utils 0.1.3 → 0.1.4

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 (46) hide show
  1. package/dist/utils/abilities.d.ts +35 -0
  2. package/dist/utils/abilities.js +125 -0
  3. package/dist/utils/camera.d.ts +1 -0
  4. package/dist/utils/camera.js +37 -0
  5. package/dist/utils/chat-command.d.ts +12 -0
  6. package/dist/utils/chat-command.js +22 -0
  7. package/{src/utils/color.ts → dist/utils/color.d.ts} +109 -139
  8. package/dist/utils/color.js +141 -0
  9. package/dist/utils/item.d.ts +9 -0
  10. package/dist/utils/item.js +124 -0
  11. package/dist/utils/math.d.ts +13 -0
  12. package/dist/utils/math.js +17 -0
  13. package/dist/utils/minimapIcons.d.ts +13 -0
  14. package/dist/utils/minimapIcons.js +27 -0
  15. package/dist/utils/misc.d.ts +56 -0
  16. package/dist/utils/misc.js +175 -0
  17. package/dist/utils/physics.d.ts +52 -0
  18. package/dist/utils/physics.js +194 -0
  19. package/dist/utils/players.d.ts +50 -0
  20. package/dist/utils/players.js +189 -0
  21. package/dist/utils/point.d.ts +15 -0
  22. package/dist/utils/point.js +74 -0
  23. package/dist/utils/quests.d.ts +2 -0
  24. package/dist/utils/quests.js +30 -0
  25. package/dist/utils/textTag.d.ts +29 -0
  26. package/dist/utils/textTag.js +72 -0
  27. package/dist/utils/timer.d.ts +5 -0
  28. package/dist/utils/timer.js +16 -0
  29. package/dist/utils/units.d.ts +26 -0
  30. package/dist/utils/units.js +81 -0
  31. package/package.json +5 -1
  32. package/src/utils/abilities.ts +0 -161
  33. package/src/utils/camera.ts +0 -63
  34. package/src/utils/chat-command.ts +0 -22
  35. package/src/utils/item.ts +0 -155
  36. package/src/utils/math.ts +0 -14
  37. package/src/utils/minimapIcons.ts +0 -34
  38. package/src/utils/misc.ts +0 -179
  39. package/src/utils/physics.ts +0 -295
  40. package/src/utils/players.ts +0 -214
  41. package/src/utils/point.ts +0 -81
  42. package/src/utils/quests.ts +0 -38
  43. package/src/utils/textTag.ts +0 -80
  44. package/src/utils/timer.ts +0 -14
  45. package/src/utils/units.ts +0 -109
  46. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyForce = applyForce;
4
+ exports.applyForceForEffect = applyForceForEffect;
5
+ // import { WTS_Units } from "src/enums/WTS_Enums";
6
+ // import { PlayerIndex } from "src/player/player-data";
7
+ const w3ts_1 = require("w3ts");
8
+ const globals_1 = require("w3ts/globals");
9
+ /**
10
+ * @param angle degrees
11
+ * @param unit
12
+ * @param initialSpeed meters per second
13
+ * @param affectHeight determines whether or not to change unit height whilst force is applied
14
+ */
15
+ function applyForce(angle, unit, initialSpeed, config) {
16
+ const timer = w3ts_1.Timer.create();
17
+ const refreshInterval = 0.01;
18
+ const updatesPerSecond = 1 / refreshInterval;
19
+ const frictionConstant = 4800; //meters per second friction decay
20
+ let currentSpeed = initialSpeed;
21
+ let timeElapsed = 0;
22
+ const clickMoveOrder = 851971;
23
+ const moveOrders = [
24
+ 851986 /* OrderId.Move */,
25
+ 851984 /* OrderId.Attackground */,
26
+ 851990 /* OrderId.Patrol */,
27
+ 851983 /* OrderId.Attack */,
28
+ clickMoveOrder,
29
+ ];
30
+ let forceDummyUnit = undefined;
31
+ const defaultX = 11800;
32
+ const defaultY = -5700;
33
+ //Cancel unit commands - if a unit already has a move command and are applied a force, they will bug out sometimes and walk in the opposite direction
34
+ // unit.issueImmediateOrder(OrderId.Stop);
35
+ /**
36
+ * Prematurely end the force effect
37
+ */
38
+ function destroyForceEffect(runOnEnd = false) {
39
+ if (runOnEnd && config?.onEnd) {
40
+ config.onEnd();
41
+ }
42
+ ResetUnitAnimation(unit.handle);
43
+ forceDummyUnit?.destroy();
44
+ timer.destroy();
45
+ }
46
+ /**
47
+ * These are the positions the unit would be if there were no minor disturbances
48
+ */
49
+ let theoreticalX = unit.x;
50
+ let theoreticalY = unit.y;
51
+ /**
52
+ * The distance the true unit position can be from the theoretical position. Helps stop sliding against walls, etc.
53
+ */
54
+ // const BREAK_DISTANCE = 100;
55
+ if (!forceDummyUnit) {
56
+ forceDummyUnit = w3ts_1.Unit.create(globals_1.Players[config.dummyUnitPlayerIndex], config.dummyUnitPlayerIndex, defaultX, defaultY);
57
+ }
58
+ // unit.issueImmediateOrder(OrderId.Stop);
59
+ if (config?.animationIndexNumber) {
60
+ ResetUnitAnimation(unit.handle);
61
+ SetUnitAnimationByIndex(unit.handle, config.animationIndexNumber);
62
+ }
63
+ timer.start(refreshInterval, true, () => {
64
+ //If for whatever reason the unit no longer exists.
65
+ if (!unit) {
66
+ destroyForceEffect();
67
+ return destroyForceEffect;
68
+ }
69
+ // if (distanceBetweenPoints(unit.x, unit.y, theoreticalX, theoreticalY) > BREAK_DISTANCE) {
70
+ // print("unit was to far away from theoretical distance");
71
+ // const e = Effect.create("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe", theoreticalX, theoreticalY);
72
+ // e?.setScaleMatrix(2, 2, 2);
73
+ // unit.issueImmediateOrder(OrderId.Stop);
74
+ // destroyForceEffect(true);
75
+ // return;
76
+ // }
77
+ //if the unit's move speed vector is greater than the remaining applied force vector then we may stop the applied force function; should only run while the unit has the move order
78
+ // if (config?.obeyPathing && !config.strictPathing && currentSpeed > unit.moveSpeed) {
79
+ // unit.issueImmediateOrder(OrderId.Stop);
80
+ // }
81
+ //should probably only do strict pathing so nothing else interfers with the unit moving
82
+ if (forceDummyUnit && config?.strictPathing) {
83
+ const isWindWalked = UnitHasBuffBJ(forceDummyUnit.handle, FourCC("BOwk"));
84
+ if (!isWindWalked) {
85
+ forceDummyUnit.issueImmediateOrder(852129 /* OrderId.Windwalk */);
86
+ }
87
+ // forceDummyUnit.issueImmediateOrder(OrderId.Stop);
88
+ //Move dummy to the position we want the unit to be in
89
+ forceDummyUnit.x = unit.x;
90
+ forceDummyUnit.y = unit.y;
91
+ forceDummyUnit.issueImmediateOrder(851972 /* OrderId.Stop */);
92
+ //flooring values since it can be off sometimes by a thousandth
93
+ if (Math.floor(forceDummyUnit.x) !== Math.floor(unit.x) ||
94
+ Math.floor(forceDummyUnit.y) !== Math.floor(unit.y)) {
95
+ // print(`Collision detected! Dummy x: ${forceDummyUnit.x} y: ${forceDummyUnit.y} Unit x: ${unit.x} y: ${unit.y}`);
96
+ const e = w3ts_1.Effect.create("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe", forceDummyUnit.x, forceDummyUnit.y);
97
+ e?.setScaleMatrix(2, 2, 2);
98
+ destroyForceEffect(true);
99
+ return;
100
+ }
101
+ }
102
+ const xVelocity = (currentSpeed / updatesPerSecond) * Math.cos(Deg2Rad(angle));
103
+ const yVelocity = (currentSpeed / updatesPerSecond) * Math.sin(Deg2Rad(angle));
104
+ //Complete execution when current speed of the initial force has decayed
105
+ if (currentSpeed <= 0) {
106
+ destroyForceEffect(true);
107
+ return;
108
+ }
109
+ //Runs when the force is first applied
110
+ if (config?.onStart && currentSpeed === initialSpeed) {
111
+ config.onStart(currentSpeed, timeElapsed);
112
+ }
113
+ //Runs at any point while the function is executing
114
+ if (config?.whileActive) {
115
+ config.whileActive(currentSpeed, timeElapsed);
116
+ }
117
+ theoreticalX += xVelocity;
118
+ theoreticalY += yVelocity;
119
+ //basically the same thing now since we are no longer issuing the stop command on the unit.
120
+ //also the moment another force is applied to the unit the previous force will stop being applied.
121
+ if (config?.strictPathing) {
122
+ unit.x = theoreticalX;
123
+ unit.y = theoreticalY;
124
+ }
125
+ else {
126
+ unit.x += xVelocity;
127
+ unit.y += yVelocity;
128
+ }
129
+ timeElapsed += refreshInterval;
130
+ if (config?.sustainedForceDuration &&
131
+ timeElapsed <= config.sustainedForceDuration) {
132
+ return;
133
+ }
134
+ currentSpeed -= frictionConstant / updatesPerSecond;
135
+ });
136
+ return { destroyForceEffect };
137
+ }
138
+ /**
139
+ * @param angle degrees
140
+ * @param effect
141
+ * @param initialSpeed meters per second
142
+ * @param affectHeight determines whether or not to change unit height whilst force is applied
143
+ */
144
+ function applyForceForEffect(angle, effect, initialSpeed, config) {
145
+ const timer = w3ts_1.Timer.create();
146
+ const refreshInterval = 0.01;
147
+ const updatesPerSecond = 1 / refreshInterval;
148
+ const frictionConstant = 1200; //meters per second friction decay
149
+ let currentSpeed = initialSpeed;
150
+ let timeElapsed = 0;
151
+ //Cancel unit commands - if a unit already has a move command and are applied a force, they will bug out sometimes and walk in the opposite direction
152
+ timer.start(refreshInterval, true, () => {
153
+ //if the unit's move speed vector is greater than the remaining applied force vector then we may stop the applied force function; should only run while the unit has the move order
154
+ const xVelocity = (currentSpeed / updatesPerSecond) * Math.cos(Deg2Rad(angle));
155
+ const yVelocity = (currentSpeed / updatesPerSecond) * Math.sin(Deg2Rad(angle));
156
+ //On end hook runs before the timer is destroyed and the function ends
157
+ if (config?.onEnd && currentSpeed <= 0) {
158
+ config.onEnd(currentSpeed, timeElapsed);
159
+ }
160
+ //Complete execution when current speed of the initial force has decayed
161
+ if (currentSpeed <= 0) {
162
+ timer.destroy();
163
+ return;
164
+ }
165
+ //Runs when the force is first applied
166
+ if (config?.onStart && currentSpeed === initialSpeed) {
167
+ config.onStart(currentSpeed, timeElapsed);
168
+ }
169
+ //Runs at any point while the function is executing
170
+ if (config?.whileActive) {
171
+ config.whileActive(currentSpeed, timeElapsed);
172
+ }
173
+ effect.x += xVelocity;
174
+ effect.y += yVelocity;
175
+ timeElapsed += refreshInterval;
176
+ if (config?.sustainedForceDuration &&
177
+ timeElapsed <= config.sustainedForceDuration) {
178
+ return;
179
+ }
180
+ currentSpeed -= frictionConstant / updatesPerSecond;
181
+ });
182
+ function destroyForceEffect() {
183
+ timer.destroy();
184
+ }
185
+ return { destroyForceEffect };
186
+ }
187
+ // const unitIsMovingVector_x = (unit.moveSpeed / updatesPerSecond) * Math.cos(Deg2Rad(unit.facing));
188
+ // const unitIsMovingVector_y = (unit.moveSpeed / updatesPerSecond) * Math.sin(Deg2Rad(unit.facing));
189
+ // if ((moveOrders.includes(unit.currentOrder) && unitIsMovingVector_x > xVelocity) || unitIsMovingVector_y > yVelocity) {
190
+ // print("moving velocity exceeded applied force velocity");
191
+ // timer.destroy();
192
+ // return;
193
+ // }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9waHlzaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLGdDQTBLQztBQVFELGtEQStEQztBQTdSRCxtREFBbUQ7QUFDbkQsd0RBQXdEO0FBQ3hELCtCQUEyQztBQUMzQywwQ0FBZ0Q7QUFtQ2hEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixLQUFhLEVBQ2IsSUFBVSxFQUNWLFlBQW9CLEVBQ3BCLE1BQXdCO0lBRXhCLE1BQU0sS0FBSyxHQUFHLFlBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDO0lBQzdDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUMsa0NBQWtDO0lBQ2pFLElBQUksWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNoQyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFcEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQzlCLE1BQU0sVUFBVSxHQUFHOzs7OztRQUtqQixjQUFjO0tBQ2YsQ0FBQztJQUVGLElBQUksY0FBYyxHQUFxQixTQUFTLENBQUM7SUFDakQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDO0lBRXZCLHFKQUFxSjtJQUNySiwwQ0FBMEM7SUFFMUM7O09BRUc7SUFDSCxTQUFTLGtCQUFrQixDQUFDLFdBQW9CLEtBQUs7UUFDbkQsSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBRUQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTFCOztPQUVHO0lBQ0gsOEJBQThCO0lBRTlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixjQUFjLEdBQUcsV0FBSSxDQUFDLE1BQU0sQ0FDMUIsaUJBQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsRUFDcEMsTUFBTSxDQUFDLG9CQUFvQixFQUMzQixRQUFRLEVBQ1IsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDO0lBRUQsMENBQTBDO0lBRTFDLElBQUksTUFBTSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDakMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDdEMsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLGtCQUFrQixFQUFFLENBQUM7WUFDckIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixDQUFDO1FBRUQsNEZBQTRGO1FBQzVGLCtEQUErRDtRQUMvRCwyR0FBMkc7UUFDM0csa0NBQWtDO1FBQ2xDLDhDQUE4QztRQUU5QyxnQ0FBZ0M7UUFDaEMsY0FBYztRQUNkLElBQUk7UUFFSixtTEFBbUw7UUFDbkwsdUZBQXVGO1FBQ3ZGLDhDQUE4QztRQUM5QyxJQUFJO1FBRUosdUZBQXVGO1FBQ3ZGLElBQUksY0FBYyxJQUFJLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUUxRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLGNBQWMsQ0FBQyxtQkFBbUIsK0JBQWtCLENBQUM7WUFDdkQsQ0FBQztZQUNELG9EQUFvRDtZQUVwRCxzREFBc0Q7WUFDdEQsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFCLGNBQWMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUUxQixjQUFjLENBQUMsbUJBQW1CLDJCQUFjLENBQUM7WUFFakQsK0RBQStEO1lBQy9ELElBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbkQsQ0FBQztnQkFDRCxtSEFBbUg7Z0JBQ25ILE1BQU0sQ0FBQyxHQUFHLGFBQU0sQ0FBQyxNQUFNLENBQ3JCLDhDQUE4QyxFQUM5QyxjQUFjLENBQUMsQ0FBQyxFQUNoQixjQUFjLENBQUMsQ0FBQyxDQUNqQixDQUFDO2dCQUNGLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUNiLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FDYixDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0Qsd0VBQXdFO1FBQ3hFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLElBQUksTUFBTSxFQUFFLE9BQU8sSUFBSSxZQUFZLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUMxQixZQUFZLElBQUksU0FBUyxDQUFDO1FBRTFCLDJGQUEyRjtRQUMzRixrR0FBa0c7UUFDbEcsSUFBSSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUM7WUFDdEIsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUNwQixJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUN0QixDQUFDO1FBRUQsV0FBVyxJQUFJLGVBQWUsQ0FBQztRQUUvQixJQUNFLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsV0FBVyxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFDNUMsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBRUQsWUFBWSxJQUFJLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQ3RELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLEtBQWEsRUFDYixNQUFjLEVBQ2QsWUFBb0IsRUFDcEIsTUFBeUI7SUFFekIsTUFBTSxLQUFLLEdBQUcsWUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzdCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztJQUM3QixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7SUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7SUFDakUsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ2hDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUVwQixxSkFBcUo7SUFFckosS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUN0QyxtTEFBbUw7UUFDbkwsTUFBTSxTQUFTLEdBQ2IsQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sU0FBUyxHQUNiLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUUvRCxzRUFBc0U7UUFDdEUsSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1QsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksWUFBWSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE1BQU0sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1FBRXRCLFdBQVcsSUFBSSxlQUFlLENBQUM7UUFFL0IsSUFDRSxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsSUFBSSxNQUFNLENBQUMsc0JBQXNCLEVBQzVDLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELFlBQVksSUFBSSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsa0JBQWtCO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVELHFHQUFxRztBQUNyRyxxR0FBcUc7QUFDckcsMEhBQTBIO0FBQzFILGdFQUFnRTtBQUNoRSx1QkFBdUI7QUFFdkIsY0FBYztBQUNkLElBQUkifQ==
@@ -0,0 +1,50 @@
1
+ import { MapPlayer, Rectangle, Unit } from "w3ts";
2
+ /**
3
+ * Does a callback for every unit of the player that has the ability
4
+ * @param player
5
+ * @param abilityId
6
+ * @param cb
7
+ */
8
+ export declare function forEachUnitOfPlayerWithAbility(player: MapPlayer, abilityId: number, cb: (unit: Unit) => void): void;
9
+ /**
10
+ * Calls a function for each player playing and is an ally of red.
11
+ * @warning specific to map
12
+ */
13
+ export declare function forEachAlliedPlayer(cb: (player: MapPlayer, index: number) => void): void;
14
+ export declare function forEachPlayer(cb: (player: MapPlayer, index: number) => void): void;
15
+ /**
16
+ * Executes the callback function for each unit matching the unit type for the player
17
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
18
+ */
19
+ export declare function forEachUnitTypeOfPlayer(unitType: number | string, player: MapPlayer, cb: (unit: Unit) => void): void;
20
+ /**
21
+ * Doesn;'t appear to actually work?
22
+ * @broken
23
+ * @param unitName
24
+ * @param unitType
25
+ * @param fn
26
+ */
27
+ export declare function forEachUnitOfType(unitName: string, unitType: number | string, fn: (unit: Unit) => void): void;
28
+ /**
29
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
30
+ */
31
+ export declare function forEachUnitOfPlayer(player: MapPlayer, cb: (unit: Unit) => void): void;
32
+ /**
33
+ * Executes the callback function for each unit matching the unit type for the player
34
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
35
+ */
36
+ export declare function forEachUnitInRectangle(rectangle: Rectangle, cb: (unit: Unit) => void): void;
37
+ export declare function isPlaying(player: MapPlayer | player): boolean;
38
+ export declare function isUser(player: MapPlayer | player): boolean;
39
+ export declare function isComputer(player: MapPlayer): boolean;
40
+ export declare function isPlayingUser(player: MapPlayer | player): boolean;
41
+ export declare function adjustPlayerState(player: MapPlayer, whichState: playerstate, amount: number): void;
42
+ export declare function adjustGold(player: MapPlayer, amount: number): void;
43
+ export declare function adjustLumber(player: MapPlayer, amount: number): void;
44
+ export declare function adjustFoodCap(player: MapPlayer, amount: number): void;
45
+ export declare function adjustFoodUsed(player: MapPlayer, amount: number): void;
46
+ export declare function playerHasResources(player: MapPlayer, data: {
47
+ gold?: number;
48
+ lumber?: number;
49
+ }): boolean;
50
+ export declare function setPlayerName(): void;
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forEachUnitOfPlayerWithAbility = forEachUnitOfPlayerWithAbility;
4
+ exports.forEachAlliedPlayer = forEachAlliedPlayer;
5
+ exports.forEachPlayer = forEachPlayer;
6
+ exports.forEachUnitTypeOfPlayer = forEachUnitTypeOfPlayer;
7
+ exports.forEachUnitOfType = forEachUnitOfType;
8
+ exports.forEachUnitOfPlayer = forEachUnitOfPlayer;
9
+ exports.forEachUnitInRectangle = forEachUnitInRectangle;
10
+ exports.isPlaying = isPlaying;
11
+ exports.isUser = isUser;
12
+ exports.isComputer = isComputer;
13
+ exports.isPlayingUser = isPlayingUser;
14
+ exports.adjustPlayerState = adjustPlayerState;
15
+ exports.adjustGold = adjustGold;
16
+ exports.adjustLumber = adjustLumber;
17
+ exports.adjustFoodCap = adjustFoodCap;
18
+ exports.adjustFoodUsed = adjustFoodUsed;
19
+ exports.playerHasResources = playerHasResources;
20
+ exports.setPlayerName = setPlayerName;
21
+ const w3ts_1 = require("w3ts");
22
+ const globals_1 = require("w3ts/globals");
23
+ /**
24
+ * Does a callback for every unit of the player that has the ability
25
+ * @param player
26
+ * @param abilityId
27
+ * @param cb
28
+ */
29
+ function forEachUnitOfPlayerWithAbility(player, abilityId, cb) {
30
+ forEachUnitOfPlayer(player, (u) => {
31
+ for (let x = 0; x < 12; x++) {
32
+ const currentAbility = u.getAbilityByIndex(x);
33
+ if (currentAbility && currentAbility === u.getAbility(abilityId) && u.isAlive()) {
34
+ cb(u);
35
+ }
36
+ }
37
+ });
38
+ }
39
+ /**
40
+ * Calls a function for each player playing and is an ally of red.
41
+ * @warning specific to map
42
+ */
43
+ function forEachAlliedPlayer(cb) {
44
+ globals_1.Players.forEach((player, index) => {
45
+ //For testing purposes, include player[9] (the human ally) so their units can also be included when iterating the units OR i should make a separate function for all units.
46
+ if (player.slotState === PLAYER_SLOT_STATE_PLAYING && player.isPlayerAlly(globals_1.Players[0]) && player != globals_1.Players[25] && player != globals_1.Players[27]) {
47
+ cb(player, index);
48
+ }
49
+ });
50
+ }
51
+ function forEachPlayer(cb) {
52
+ globals_1.Players.forEach((p, index) => {
53
+ cb(p, index);
54
+ });
55
+ }
56
+ /**
57
+ * Executes the callback function for each unit matching the unit type for the player
58
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
59
+ */
60
+ function forEachUnitTypeOfPlayer(unitType, player, cb) {
61
+ if (typeof unitType === "string") {
62
+ unitType = FourCC(unitType);
63
+ }
64
+ const g = w3ts_1.Group.create();
65
+ g?.enumUnitsOfPlayer(player, () => {
66
+ const unit = w3ts_1.Group.getFilterUnit();
67
+ if (unit && unit?.typeId === unitType) {
68
+ cb(unit);
69
+ }
70
+ return true;
71
+ });
72
+ g?.destroy();
73
+ }
74
+ /**
75
+ * Doesn;'t appear to actually work?
76
+ * @broken
77
+ * @param unitName
78
+ * @param unitType
79
+ * @param fn
80
+ */
81
+ function forEachUnitOfType(unitName, unitType, fn) {
82
+ if (typeof unitType === "string") {
83
+ unitType = FourCC(unitType);
84
+ }
85
+ print(unitName);
86
+ const g = w3ts_1.Group.create();
87
+ g?.enumUnitsOfType(unitName, () => {
88
+ const unit = w3ts_1.Group.getFilterUnit();
89
+ if (unit && unit?.typeId === unitType) {
90
+ fn(unit);
91
+ }
92
+ return true;
93
+ });
94
+ print(`Total units of name ${unitName} found: ${g?.size}`);
95
+ g?.destroy();
96
+ }
97
+ /**
98
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
99
+ */
100
+ function forEachUnitOfPlayer(player, cb) {
101
+ const g = w3ts_1.Group.create();
102
+ g?.enumUnitsOfPlayer(player, () => {
103
+ const unit = w3ts_1.Group.getFilterUnit();
104
+ if (!unit) {
105
+ print("Enumerating over a unit that doesn't exist!");
106
+ }
107
+ if (unit) {
108
+ cb(unit);
109
+ }
110
+ return true;
111
+ });
112
+ g?.destroy();
113
+ }
114
+ /**
115
+ * Executes the callback function for each unit matching the unit type for the player
116
+ * @param unitType Unit Type Id or the Unit Type String "hcas", etc
117
+ */
118
+ function forEachUnitInRectangle(rectangle, cb) {
119
+ const g = w3ts_1.Group.create();
120
+ g?.enumUnitsInRect(rectangle, () => {
121
+ const unit = w3ts_1.Group.getFilterUnit();
122
+ if (unit) {
123
+ cb(unit);
124
+ }
125
+ return true;
126
+ });
127
+ g?.destroy();
128
+ }
129
+ function isPlaying(player) {
130
+ if (player instanceof w3ts_1.MapPlayer) {
131
+ return player.slotState === PLAYER_SLOT_STATE_PLAYING;
132
+ }
133
+ return GetPlayerSlotState(player) === PLAYER_SLOT_STATE_PLAYING;
134
+ }
135
+ function isUser(player) {
136
+ if (player instanceof w3ts_1.MapPlayer) {
137
+ return GetPlayerController(player.handle) === MAP_CONTROL_USER;
138
+ }
139
+ return GetPlayerController(player) === MAP_CONTROL_USER;
140
+ }
141
+ function isComputer(player) {
142
+ if (player instanceof w3ts_1.MapPlayer) {
143
+ return GetPlayerController(player.handle) === MAP_CONTROL_COMPUTER;
144
+ }
145
+ return GetPlayerController(player) === MAP_CONTROL_COMPUTER;
146
+ }
147
+ function isPlayingUser(player) {
148
+ return isUser(player) && isPlaying(player);
149
+ }
150
+ function adjustPlayerState(player, whichState, amount) {
151
+ player.setState(whichState, player.getState(whichState) + amount);
152
+ }
153
+ function adjustGold(player, amount) {
154
+ player.setState(PLAYER_STATE_RESOURCE_GOLD, player.getState(PLAYER_STATE_RESOURCE_GOLD) + amount);
155
+ }
156
+ function adjustLumber(player, amount) {
157
+ player.setState(PLAYER_STATE_RESOURCE_LUMBER, player.getState(PLAYER_STATE_RESOURCE_LUMBER) + amount);
158
+ }
159
+ function adjustFoodCap(player, amount) {
160
+ player.setState(PLAYER_STATE_RESOURCE_FOOD_CAP, player.getState(PLAYER_STATE_RESOURCE_FOOD_CAP) + amount);
161
+ }
162
+ function adjustFoodUsed(player, amount) {
163
+ player.setState(PLAYER_STATE_RESOURCE_FOOD_USED, player.getState(PLAYER_STATE_RESOURCE_FOOD_USED) + amount);
164
+ }
165
+ function playerHasResources(player, data) {
166
+ let hasGold = true;
167
+ let hasLumber = true;
168
+ if (data.gold && data.gold != 0) {
169
+ hasGold = player.getState(PLAYER_STATE_RESOURCE_GOLD) >= data.gold;
170
+ }
171
+ if (data.lumber && data.lumber != 0) {
172
+ hasLumber = player.getState(PLAYER_STATE_RESOURCE_LUMBER) >= data.lumber;
173
+ }
174
+ return hasGold && hasLumber;
175
+ }
176
+ function setPlayerName() {
177
+ const t = w3ts_1.Trigger.create();
178
+ forEachPlayer((p) => {
179
+ t.registerPlayerChatEvent(p, "-playername ", false);
180
+ t.addAction(() => {
181
+ const str = GetEventPlayerChatString();
182
+ const newName = str?.replace("-playername", "");
183
+ if (newName) {
184
+ SetPlayerName(p.handle, newName);
185
+ }
186
+ });
187
+ });
188
+ }
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wbGF5ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esd0VBVUM7QUFNRCxrREFPQztBQUVELHNDQUlDO0FBTUQsMERBa0JDO0FBU0QsOENBc0JDO0FBS0Qsa0RBaUJDO0FBTUQsd0RBY0M7QUFFRCw4QkFNQztBQUVELHdCQU1DO0FBRUQsZ0NBTUM7QUFFRCxzQ0FFQztBQUVELDhDQUVDO0FBRUQsZ0NBRUM7QUFFRCxvQ0FFQztBQUVELHNDQUVDO0FBRUQsd0NBRUM7QUFFRCxnREFhQztBQUVELHNDQWFDO0FBck5ELCtCQUFrRTtBQUNsRSwwQ0FBdUM7QUFFdkM7Ozs7O0dBS0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxNQUFpQixFQUFFLFNBQWlCLEVBQUUsRUFBd0I7SUFDekcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5QyxJQUFJLGNBQWMsSUFBSSxjQUFjLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDOUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1YsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxFQUE4QztJQUM5RSxpQkFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QiwyS0FBMks7UUFDM0ssSUFBSSxNQUFNLENBQUMs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
@@ -0,0 +1,15 @@
1
+ import { Point } from "w3ts";
2
+ export declare function createValidPoint(maxAttempts: number, validatorFn: (p: Point) => {}): Point | undefined;
3
+ export declare function getRandomCoordinatesInCircularArea(relativeX: number, relativeY: number, radius: number): {
4
+ x: number;
5
+ y: number;
6
+ };
7
+ export declare function getRandomCoordinatesOnCircle(relativeX: number, relativeY: number, radius: number): {
8
+ x: number;
9
+ y: number;
10
+ };
11
+ /**
12
+ * Returns degrees or radians?
13
+ */
14
+ export declare function getAngleBetweenPoints(x1: number, y1: number, x2: number, y2: number): number;
15
+ export declare function distanceBetweenPoints(x1: number, y1: number, x2: number, y2: number): number;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createValidPoint = createValidPoint;
4
+ exports.getRandomCoordinatesInCircularArea = getRandomCoordinatesInCircularArea;
5
+ exports.getRandomCoordinatesOnCircle = getRandomCoordinatesOnCircle;
6
+ exports.getAngleBetweenPoints = getAngleBetweenPoints;
7
+ exports.distanceBetweenPoints = distanceBetweenPoints;
8
+ const w3ts_1 = require("w3ts");
9
+ const MAP_EDGE_BUFFER_DIST = 300;
10
+ function createValidPoint(maxAttempts, validatorFn) {
11
+ const MAX_ATTEMPTS = 65000; // 100 was about 10 seconds; 1000 gets good coverage
12
+ let currentAttempts = 0;
13
+ const worldBounds = w3ts_1.Rectangle.fromHandle(GetWorldBounds());
14
+ if (!worldBounds)
15
+ return;
16
+ const [maxX, maxY] = [GetCameraBoundMaxX(), GetCameraBoundMaxY()];
17
+ while (currentAttempts <= MAX_ATTEMPTS) {
18
+ const dirX = Math.floor(Math.random() * 100) >= 50 ? 1 : -1;
19
+ const dirY = Math.floor(Math.random() * 100) >= 50 ? 1 : -1;
20
+ //multiply dir by the buffer distance from max bounds since we can get a negative number
21
+ const randX = dirX * Math.ceil(Math.random() * maxX) - dirX * MAP_EDGE_BUFFER_DIST;
22
+ const randY = dirY * Math.ceil(Math.random() * maxY) - dirY * MAP_EDGE_BUFFER_DIST;
23
+ const p = w3ts_1.Point.create(randX, randY);
24
+ const isValidPoint = validatorFn(p);
25
+ if (isValidPoint) {
26
+ // pointsChosen.push(p);
27
+ return p;
28
+ }
29
+ else {
30
+ //well add it here later, just testing for now
31
+ currentAttempts++;
32
+ }
33
+ }
34
+ }
35
+ function getRandomCoordinatesInCircularArea(relativeX, relativeY, radius) {
36
+ const randomTheta = Math.random() * 360;
37
+ const randomRadius = Math.random() * radius;
38
+ const randomX = relativeX + randomRadius * Cos(randomTheta);
39
+ const randomY = relativeY + randomRadius * Sin(randomTheta);
40
+ return {
41
+ x: randomX,
42
+ y: randomY,
43
+ };
44
+ }
45
+ function getRandomCoordinatesOnCircle(relativeX, relativeY, radius) {
46
+ const randomTheta = Math.random() * 360;
47
+ const randomX = relativeX + radius * Cos(randomTheta);
48
+ const randomY = relativeY + radius * Sin(randomTheta);
49
+ return {
50
+ x: randomX,
51
+ y: randomY,
52
+ };
53
+ }
54
+ /**
55
+ * Returns degrees or radians?
56
+ */
57
+ function getAngleBetweenPoints(x1, y1, x2, y2) {
58
+ const locA = Location(x1, y1);
59
+ const locB = Location(x2, y2);
60
+ const angle = AngleBetweenPoints(locA, locB);
61
+ //arc tan
62
+ RemoveLocation(locA);
63
+ RemoveLocation(locB);
64
+ return angle;
65
+ }
66
+ function distanceBetweenPoints(x1, y1, x2, y2) {
67
+ const deltaX = x1 - x2;
68
+ const deltaY = y1 - y2;
69
+ const squaredDist = deltaX * deltaX + deltaY * deltaY;
70
+ // const squaredDist = Math.pow(deltaX, 2) + Math.pow(deltaY, 2);
71
+ const dist = Math.sqrt(squaredDist);
72
+ return dist;
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSw0Q0EyQkM7QUFFRCxnRkFXQztBQUVELG9FQVVDO0FBS0Qsc0RBVUM7QUFFRCxzREFRQztBQWhGRCwrQkFBd0M7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFakMsU0FBZ0IsZ0JBQWdCLENBQUMsV0FBbUIsRUFBRSxXQUE2QjtJQUMvRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxvREFBb0Q7SUFDaEYsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sV0FBVyxHQUFHLGdCQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPO0lBQ3pCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUVsRSxPQUFPLGVBQWUsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVELHdGQUF3RjtRQUN4RixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdB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
@@ -0,0 +1,2 @@
1
+ export declare function setup_quests(): void;
2
+ export declare function addQuest(title: string, description: string, iconPath?: string, required?: boolean): void;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setup_quests = setup_quests;
4
+ exports.addQuest = addQuest;
5
+ const w3ts_1 = require("w3ts");
6
+ const misc_1 = require("./misc");
7
+ function setup_quests() {
8
+ w3ts_1.Timer.create().start(1, false, () => {
9
+ addQuest("Basic Game Info", `\nA roguelite base assault game. \nChoose from a wide variety of units that are trained in various schools of magic and skills.\n Outsmart and counter your opponent..
10
+ `, "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp");
11
+ // \n${tColor("-fixSpawns", "goldenrod")}: Player 1 can only use this. This will fix add all player's spawn units to their corresponding spawn pool.
12
+ addQuest("Commands", `
13
+ \n${(0, misc_1.tColor)("-cam ####", "goldenrod")}: Sets the camera distance.
14
+ \n-playername xxxx This will change your name.
15
+ `, "ReplaceableTextures\\WorldEditUI\\Doodad-Cinematic.blp", false);
16
+ addQuest("|cffffcc00Evolution Castle Assault v0.01|r", "Created by JediMindTrix/NihilismIsDeath", "ReplaceableTextures\\CommandButtons\\BTNClayFigurine.blp", false);
17
+ });
18
+ }
19
+ function addQuest(title, description, iconPath, required = true) {
20
+ const q = w3ts_1.Quest.create();
21
+ if (q) {
22
+ q.setTitle(title);
23
+ q.required = required;
24
+ q.setDescription(description);
25
+ if (iconPath) {
26
+ q.setIcon(iconPath);
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3F1ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLG9DQXNCQztBQUVELDRCQVVDO0FBckNELCtCQUFvQztBQUNwQyxpQ0FBZ0M7QUFFaEMsU0FBZ0IsWUFBWTtJQUN4QixZQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLFFBQVEsQ0FDSixpQkFBaUIsRUFDakI7U0FDSCxFQUNHLHFEQUFxRCxDQUN4RCxDQUFDO1FBRUYsb0pBQW9KO1FBQ3BKLFFBQVEsQ0FDSixVQUFVLEVBQ1Y7Z0JBQ0ksSUFBQSxhQUFNLEVBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQzs7U0FFdkMsRUFDRyx3REFBd0QsRUFDeEQsS0FBSyxDQUNSLENBQUM7UUFFRixRQUFRLENBQUMsNENBQTRDLEVBQUUseUNBQXlDLEVBQUUsMERBQTBELEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekssQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLEtBQWEsRUFBRSxXQUFtQixFQUFFLFFBQWlCLEVBQUUsV0FBb0IsSUFBSTtJQUNwRyxNQUFNLENBQUMsR0FBRyxZQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNKLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDdEIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMifQ==
@@ -0,0 +1,29 @@
1
+ import { Unit } from "w3ts";
2
+ /**
3
+ * https://www.hiveworkshop.com/threads/floating-text.149719/
4
+ *
5
+ * function CreateFloatingText takes string text, real x, real y, real heightOffset, real duration, real size returns nothing
6
+ local texttag tt = CreateTextTag()
7
+ call SetTextTagText(tt, text, size)
8
+ call SetTextTagPos(tt, x, y, heightOffset)
9
+ call SetTextTagColor(tt, 255, 255, 255, 255) // RGBA format
10
+ call SetTextTagVisibility(tt, true)
11
+ call SetTextTagLifespan(tt, duration)
12
+ call SetTextTagPermanent(tt, false)
13
+ endfunction
14
+
15
+ function ExampleUsage takes nothing returns nothing
16
+ call CreateFloatingText("Hello World", 0.0, 0.0, 25.0, 5.0, 10.0)
17
+ endfunction
18
+ * @param unit
19
+ * @param text
20
+ * @param duration
21
+ */
22
+ export declare function createFloatingTextTagOnUnit(unit: Unit, text: string, config?: {
23
+ duration?: number;
24
+ yVelocity?: number;
25
+ xVelocity?: number;
26
+ useFade?: boolean;
27
+ }): void;
28
+ export declare function createPermanentTextTagOnPoint(text: string, x: number, y: number): void;
29
+ export declare function setup_createTextForSpellCast(): void;