@where-stars-drift/core 1.0.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 (160) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +143 -0
  3. package/dist/src/base/bounded-body.d.ts +8 -0
  4. package/dist/src/base/bounded-body.js +10 -0
  5. package/dist/src/base/celestial-body.d.ts +12 -0
  6. package/dist/src/base/celestial-body.js +11 -0
  7. package/dist/src/base/hoverable.d.ts +10 -0
  8. package/dist/src/base/hoverable.js +4 -0
  9. package/dist/src/base/massive-body.d.ts +8 -0
  10. package/dist/src/base/massive-body.js +10 -0
  11. package/dist/src/config/effects.d.ts +14 -0
  12. package/dist/src/config/effects.js +14 -0
  13. package/dist/src/config/grid.d.ts +10 -0
  14. package/dist/src/config/grid.js +10 -0
  15. package/dist/src/config/panel.d.ts +26 -0
  16. package/dist/src/config/panel.js +26 -0
  17. package/dist/src/config/simulation.d.ts +21 -0
  18. package/dist/src/config/simulation.js +23 -0
  19. package/dist/src/controllers/clan-controller.d.ts +7 -0
  20. package/dist/src/controllers/clan-controller.js +12 -0
  21. package/dist/src/controllers/debug-controller.d.ts +45 -0
  22. package/dist/src/controllers/debug-controller.js +82 -0
  23. package/dist/src/controllers/effects-controller.d.ts +17 -0
  24. package/dist/src/controllers/effects-controller.js +71 -0
  25. package/dist/src/controllers/hover-controller.d.ts +11 -0
  26. package/dist/src/controllers/hover-controller.js +107 -0
  27. package/dist/src/controllers/layer-controller.d.ts +16 -0
  28. package/dist/src/controllers/layer-controller.js +64 -0
  29. package/dist/src/controllers/physics-controller.d.ts +14 -0
  30. package/dist/src/controllers/physics-controller.js +152 -0
  31. package/dist/src/controllers/star-controller.d.ts +12 -0
  32. package/dist/src/controllers/star-controller.js +38 -0
  33. package/dist/src/controllers/starship-controller.d.ts +17 -0
  34. package/dist/src/controllers/starship-controller.js +58 -0
  35. package/dist/src/draw-debug-line.d.ts +9 -0
  36. package/dist/src/draw-debug-line.js +29 -0
  37. package/dist/src/entities/black-hole-factory.d.ts +15 -0
  38. package/dist/src/entities/black-hole-factory.js +23 -0
  39. package/dist/src/entities/black-hole-shapes.d.ts +9 -0
  40. package/dist/src/entities/black-hole-shapes.js +224 -0
  41. package/dist/src/entities/black-hole.d.ts +69 -0
  42. package/dist/src/entities/black-hole.js +210 -0
  43. package/dist/src/entities/clan-manager.d.ts +12 -0
  44. package/dist/src/entities/clan-manager.js +22 -0
  45. package/dist/src/entities/clans.d.ts +15 -0
  46. package/dist/src/entities/clans.js +76 -0
  47. package/dist/src/entities/comet.d.ts +27 -0
  48. package/dist/src/entities/comet.js +81 -0
  49. package/dist/src/entities/docking-point.d.ts +20 -0
  50. package/dist/src/entities/docking-point.js +22 -0
  51. package/dist/src/entities/fleet.d.ts +45 -0
  52. package/dist/src/entities/fleet.js +374 -0
  53. package/dist/src/entities/formations.d.ts +51 -0
  54. package/dist/src/entities/formations.js +340 -0
  55. package/dist/src/entities/meteor.d.ts +26 -0
  56. package/dist/src/entities/meteor.js +48 -0
  57. package/dist/src/entities/nebula.d.ts +18 -0
  58. package/dist/src/entities/nebula.js +43 -0
  59. package/dist/src/entities/orbit.d.ts +23 -0
  60. package/dist/src/entities/orbit.js +43 -0
  61. package/dist/src/entities/pulsar.d.ts +18 -0
  62. package/dist/src/entities/pulsar.js +41 -0
  63. package/dist/src/entities/ring.d.ts +13 -0
  64. package/dist/src/entities/ring.js +26 -0
  65. package/dist/src/entities/ringed-planet.d.ts +21 -0
  66. package/dist/src/entities/ringed-planet.js +68 -0
  67. package/dist/src/entities/sector-grid.d.ts +16 -0
  68. package/dist/src/entities/sector-grid.js +70 -0
  69. package/dist/src/entities/star-factory.d.ts +29 -0
  70. package/dist/src/entities/star-factory.js +47 -0
  71. package/dist/src/entities/star.d.ts +48 -0
  72. package/dist/src/entities/star.js +167 -0
  73. package/dist/src/entities/starship-classes.d.ts +0 -0
  74. package/dist/src/entities/starship-classes.js +2 -0
  75. package/dist/src/entities/starship.d.ts +91 -0
  76. package/dist/src/entities/starship.js +760 -0
  77. package/dist/src/entities/supernova.d.ts +26 -0
  78. package/dist/src/entities/supernova.js +54 -0
  79. package/dist/src/index.d.ts +20 -0
  80. package/dist/src/index.js +19 -0
  81. package/dist/src/lib/energy-stream.d.ts +5 -0
  82. package/dist/src/lib/energy-stream.js +98 -0
  83. package/dist/src/lib/quadtree.d.ts +31 -0
  84. package/dist/src/lib/quadtree.js +124 -0
  85. package/dist/src/lib/simplified-stream.d.ts +6 -0
  86. package/dist/src/lib/simplified-stream.js +19 -0
  87. package/dist/src/types.d.ts +14 -0
  88. package/dist/src/types.js +1 -0
  89. package/dist/src/ui/black-holes-panel.d.ts +2 -0
  90. package/dist/src/ui/black-holes-panel.js +76 -0
  91. package/dist/src/ui/clans-panel.d.ts +2 -0
  92. package/dist/src/ui/clans-panel.js +20 -0
  93. package/dist/src/ui/debug-panel-controller.d.ts +41 -0
  94. package/dist/src/ui/debug-panel-controller.js +285 -0
  95. package/dist/src/ui/fleets-panel.d.ts +2 -0
  96. package/dist/src/ui/fleets-panel.js +127 -0
  97. package/dist/src/ui/formations-panel.d.ts +3 -0
  98. package/dist/src/ui/formations-panel.js +129 -0
  99. package/dist/src/ui/panel-config.d.ts +26 -0
  100. package/dist/src/ui/panel-config.js +26 -0
  101. package/dist/src/ui/ships-panel.d.ts +12 -0
  102. package/dist/src/ui/ships-panel.js +61 -0
  103. package/dist/src/ui/stars-panel.d.ts +2 -0
  104. package/dist/src/ui/stars-panel.js +120 -0
  105. package/dist/src/where-stars-drift.d.ts +71 -0
  106. package/dist/src/where-stars-drift.js +440 -0
  107. package/dist/tsconfig.tsbuildinfo +1 -0
  108. package/package.json +35 -0
  109. package/src/base/bounded-body.ts +14 -0
  110. package/src/base/celestial-body.ts +20 -0
  111. package/src/base/hoverable.ts +11 -0
  112. package/src/base/massive-body.ts +14 -0
  113. package/src/config/effects.ts +15 -0
  114. package/src/config/grid.ts +11 -0
  115. package/src/config/panel.ts +26 -0
  116. package/src/config/simulation.ts +25 -0
  117. package/src/controllers/clan-controller.ts +19 -0
  118. package/src/controllers/debug-controller.ts +112 -0
  119. package/src/controllers/effects-controller.ts +86 -0
  120. package/src/controllers/hover-controller.ts +128 -0
  121. package/src/controllers/layer-controller.ts +78 -0
  122. package/src/controllers/physics-controller.ts +173 -0
  123. package/src/controllers/star-controller.ts +51 -0
  124. package/src/controllers/starship-controller.ts +76 -0
  125. package/src/draw-debug-line.ts +37 -0
  126. package/src/entities/black-hole-factory.ts +28 -0
  127. package/src/entities/black-hole-shapes.ts +276 -0
  128. package/src/entities/black-hole.ts +246 -0
  129. package/src/entities/clan-manager.ts +33 -0
  130. package/src/entities/clans.ts +98 -0
  131. package/src/entities/comet.ts +102 -0
  132. package/src/entities/docking-point.ts +34 -0
  133. package/src/entities/fleet.ts +446 -0
  134. package/src/entities/formations.ts +423 -0
  135. package/src/entities/meteor.ts +59 -0
  136. package/src/entities/nebula.ts +50 -0
  137. package/src/entities/orbit.ts +53 -0
  138. package/src/entities/pulsar.ts +64 -0
  139. package/src/entities/ring.ts +42 -0
  140. package/src/entities/ringed-planet.ts +85 -0
  141. package/src/entities/sector-grid.ts +81 -0
  142. package/src/entities/star-factory.ts +59 -0
  143. package/src/entities/star.ts +222 -0
  144. package/src/entities/starship-classes.ts +1 -0
  145. package/src/entities/starship.ts +906 -0
  146. package/src/entities/supernova.ts +75 -0
  147. package/src/index.ts +24 -0
  148. package/src/lib/energy-stream.ts +127 -0
  149. package/src/lib/quadtree.ts +159 -0
  150. package/src/lib/simplified-stream.ts +28 -0
  151. package/src/types.ts +16 -0
  152. package/src/ui/black-holes-panel.ts +91 -0
  153. package/src/ui/clans-panel.ts +27 -0
  154. package/src/ui/debug-panel-controller.ts +339 -0
  155. package/src/ui/fleets-panel.ts +153 -0
  156. package/src/ui/formations-panel.ts +155 -0
  157. package/src/ui/panel-config.ts +26 -0
  158. package/src/ui/ships-panel.ts +85 -0
  159. package/src/ui/stars-panel.ts +146 -0
  160. package/src/where-stars-drift.ts +542 -0
@@ -0,0 +1,440 @@
1
+ import { SIMULATION_CONFIG, DEBUG_CONFIG } from './config/simulation';
2
+ import { Star } from './entities/star';
3
+ import { Comet, COMET_CONFIG } from './entities/comet';
4
+ import { Starship } from './entities/starship';
5
+ import { Fleet } from './entities/fleet';
6
+ import { HoverController } from './controllers/hover-controller';
7
+ import { BlackHle } from './entities/black-hole';
8
+ import { LayerController } from './controllers/layer-controller';
9
+ import { StarshipController } from './controllers/starship-controller';
10
+ import { StarController } from './controllers/star-controller';
11
+ import { PhysicsController } from './controllers/physics-controller';
12
+ import { EffectsController } from './controllers/effects-controller';
13
+ import { DebugController } from './controllers/debug-controller';
14
+ import { Nebula, NEBULA_CONFIG } from './entities/nebula';
15
+ import { Quadtree } from './lib/quadtree';
16
+ import { DebugPanelController } from './ui/debug-panel-controller';
17
+ import { formationRegistry } from './entities/formations';
18
+ import { SectorGrid } from './entities/sector-grid';
19
+ export class WhereStarsDrift {
20
+ constructor(canvas, config = {}) {
21
+ var _a, _b, _c, _d, _e, _f;
22
+ this.mouse = {
23
+ x: 0,
24
+ y: 0,
25
+ lastX: 0,
26
+ lastY: 0,
27
+ dx: 0,
28
+ dy: 0,
29
+ };
30
+ this.isMouseInside = false;
31
+ this.animationFrameId = 0;
32
+ this.lastTime = 0;
33
+ this.pulseTime = 0;
34
+ // GitHub link interaction
35
+ this.githubLinkBounds = null;
36
+ this.isMouseOverGithubLink = false;
37
+ // Stats
38
+ this.frameCount = 0;
39
+ this.fps = 0;
40
+ this.fpsFrameCount = 0;
41
+ this.lastFpsUpdateTime = 0;
42
+ this.fpsHistory = [];
43
+ this.avgFps = 0;
44
+ this.avgFpsWindow = 60;
45
+ this.canvas = canvas;
46
+ const context = canvas.getContext('2d');
47
+ if (!context) {
48
+ throw new Error('Could not get 2D rendering context from canvas.');
49
+ }
50
+ this.ctx = context;
51
+ this.config = {
52
+ starsCount: (_a = config.starsCount) !== null && _a !== void 0 ? _a : SIMULATION_CONFIG.STARS_COUNT,
53
+ interactive: (_b = config.interactive) !== null && _b !== void 0 ? _b : true,
54
+ debug: (_c = config.debug) !== null && _c !== void 0 ? _c : false,
55
+ showCatalog: (_d = config.showCatalog) !== null && _d !== void 0 ? _d : false,
56
+ showGrid: (_e = config.showGrid) !== null && _e !== void 0 ? _e : true,
57
+ showGithubLink: (_f = config.showGithubLink) !== null && _f !== void 0 ? _f : true,
58
+ };
59
+ // Override DEBUG_CONFIG based on instance config
60
+ DEBUG_CONFIG.SHOW_DEBUG_INFO = this.config.debug;
61
+ DEBUG_CONFIG.SHOW_CATALOG_PANEL = this.config.showCatalog;
62
+ this.width = canvas.width;
63
+ this.height = canvas.height;
64
+ this.mouse.x = this.width / 2;
65
+ this.mouse.y = this.height / 2;
66
+ this.mouse.lastX = this.width / 2;
67
+ this.mouse.lastY = this.height / 2;
68
+ this._initializeControllers();
69
+ // Bind methods to the instance to maintain `this` context
70
+ this.animate = this.animate.bind(this);
71
+ this._handleMouseMove = this._handleMouseMove.bind(this);
72
+ this._handleMouseEnter = this._handleMouseEnter.bind(this);
73
+ this._handleMouseLeave = this._handleMouseLeave.bind(this);
74
+ this._handleMouseDown = this._handleMouseDown.bind(this);
75
+ this._handleMouseUp = this._handleMouseUp.bind(this);
76
+ this._handleWheel = this._handleWheel.bind(this);
77
+ this._handleResize = this._handleResize.bind(this);
78
+ }
79
+ _initializeControllers() {
80
+ this.layerController = new LayerController();
81
+ this.debugController = new DebugController();
82
+ this.starController = new StarController(this.layerController, this.config.starsCount, this.width, this.height);
83
+ this.starshipController = new StarshipController(this.layerController, this.width, this.height, this.debugController);
84
+ this.physicsController = new PhysicsController(this.debugController);
85
+ this.effectsController = new EffectsController(this.width, this.height);
86
+ this.quadtree = new Quadtree({ x: 0, y: 0, width: this.width, height: this.height });
87
+ for (let i = 0; i < NEBULA_CONFIG.COUNT; i++) {
88
+ this.layerController.addBody('backgroundNebulas', new Nebula(Math.random() * this.width, Math.random() * this.height, this.width));
89
+ }
90
+ for (let i = 0; i < COMET_CONFIG.COUNT; i++) {
91
+ this.layerController.addBody('dynamicObjects', new Comet(this.width, this.height));
92
+ }
93
+ this.layerController.addBody('sectorGrid', new SectorGrid(this.width, this.height));
94
+ this.allLayers = Object.values(this.layerController.getLayers());
95
+ this.allBodies = this.allLayers.flatMap(l => l.bodies);
96
+ this.hoverController = new HoverController(this.allBodies);
97
+ this.debugPanelController = new DebugPanelController(this.ctx, formationRegistry.getAllFormations());
98
+ }
99
+ start() {
100
+ if (this.animationFrameId !== 0)
101
+ return; // Already running
102
+ this._setupEventListeners();
103
+ this.lastTime = performance.now();
104
+ this.animationFrameId = requestAnimationFrame(this.animate);
105
+ }
106
+ stop() {
107
+ if (this.animationFrameId) {
108
+ cancelAnimationFrame(this.animationFrameId);
109
+ this.animationFrameId = 0;
110
+ }
111
+ }
112
+ destroy() {
113
+ this.stop();
114
+ this._removeEventListeners();
115
+ }
116
+ getStats() {
117
+ return {
118
+ fps: this.fps,
119
+ avgFps: this.avgFps,
120
+ starCount: this.starController.getAllStars().length,
121
+ starshipCount: this.starshipController.getAllStarships().length,
122
+ frameCount: this.frameCount,
123
+ };
124
+ }
125
+ setInteractive(enabled) {
126
+ if (this.config.interactive === enabled)
127
+ return;
128
+ this.config.interactive = enabled;
129
+ if (this.animationFrameId !== 0) {
130
+ this._removeEventListeners();
131
+ this._setupEventListeners();
132
+ }
133
+ }
134
+ setDebug(enabled) {
135
+ this.config.debug = enabled;
136
+ DEBUG_CONFIG.SHOW_DEBUG_INFO = enabled;
137
+ }
138
+ setShowCatalog(visible) {
139
+ this.config.showCatalog = visible;
140
+ DEBUG_CONFIG.SHOW_CATALOG_PANEL = visible;
141
+ }
142
+ setShowGrid(visible) {
143
+ this.config.showGrid = visible;
144
+ }
145
+ setShowGithubLink(visible) {
146
+ this.config.showGithubLink = visible;
147
+ if (!visible) {
148
+ this.isMouseOverGithubLink = false;
149
+ this.canvas.style.cursor = 'default';
150
+ }
151
+ }
152
+ _setupEventListeners() {
153
+ this.canvas.addEventListener('mousemove', this._handleMouseMove);
154
+ this.canvas.addEventListener('mouseenter', this._handleMouseEnter);
155
+ this.canvas.addEventListener('mouseleave', this._handleMouseLeave);
156
+ this.canvas.addEventListener('mousedown', this._handleMouseDown);
157
+ window.addEventListener('mouseup', this._handleMouseUp);
158
+ this.canvas.addEventListener('wheel', this._handleWheel);
159
+ window.addEventListener('resize', this._handleResize);
160
+ }
161
+ _removeEventListeners() {
162
+ this.canvas.removeEventListener('mousemove', this._handleMouseMove);
163
+ this.canvas.removeEventListener('mouseenter', this._handleMouseEnter);
164
+ this.canvas.removeEventListener('mouseleave', this._handleMouseLeave);
165
+ this.canvas.removeEventListener('mousedown', this._handleMouseDown);
166
+ window.removeEventListener('mouseup', this._handleMouseUp);
167
+ this.canvas.removeEventListener('wheel', this._handleWheel);
168
+ window.removeEventListener('resize', this._handleResize);
169
+ }
170
+ _handleMouseMove(event) {
171
+ const rect = this.canvas.getBoundingClientRect();
172
+ const mouseX = event.clientX - rect.left;
173
+ const mouseY = event.clientY - rect.top;
174
+ if (this.debugPanelController && this.debugPanelController.isDragging()) {
175
+ this.debugPanelController.handleMouseMove(mouseX, mouseY);
176
+ return;
177
+ }
178
+ let isOverLink = false;
179
+ if (this.config.showGithubLink && this.githubLinkBounds) {
180
+ const bounds = this.githubLinkBounds;
181
+ if (mouseX >= bounds.x && mouseX <= bounds.x + bounds.width &&
182
+ mouseY >= bounds.y && mouseY <= bounds.y + bounds.height) {
183
+ isOverLink = true;
184
+ }
185
+ }
186
+ this.isMouseOverGithubLink = isOverLink;
187
+ if (this.isMouseOverGithubLink) {
188
+ this.canvas.style.cursor = 'pointer';
189
+ }
190
+ else {
191
+ this.canvas.style.cursor = 'default';
192
+ }
193
+ if (this.isMouseInside) {
194
+ this.mouse.x = mouseX;
195
+ this.mouse.y = mouseY;
196
+ }
197
+ }
198
+ _handleMouseEnter(event) {
199
+ this.isMouseInside = true;
200
+ this.mouse.x = event.clientX - this.canvas.getBoundingClientRect().left;
201
+ this.mouse.y = event.clientY - this.canvas.getBoundingClientRect().top;
202
+ this.mouse.lastX = this.mouse.x;
203
+ this.mouse.lastY = this.mouse.y;
204
+ }
205
+ _handleMouseLeave() {
206
+ this.isMouseInside = false;
207
+ this.mouse.lastX = -1;
208
+ this.mouse.lastY = -1;
209
+ this.mouse.dx = 0;
210
+ this.mouse.dy = 0;
211
+ this.isMouseOverGithubLink = false;
212
+ this.canvas.style.cursor = 'default';
213
+ }
214
+ _handleMouseDown(event) {
215
+ if (this.isMouseOverGithubLink) {
216
+ window.open('https://github.com/where-stars-drift', '_blank');
217
+ event.preventDefault();
218
+ return;
219
+ }
220
+ if (this.config.showCatalog) {
221
+ const rect = this.canvas.getBoundingClientRect();
222
+ const x = event.clientX - rect.left;
223
+ const y = event.clientY - rect.top;
224
+ if (this.debugPanelController.isMouseOver(x, y)) {
225
+ this.debugPanelController.handleMouseDown(x, y);
226
+ }
227
+ }
228
+ }
229
+ _handleMouseUp() {
230
+ if (this.config.showCatalog) {
231
+ this.debugPanelController.handleMouseUp();
232
+ }
233
+ }
234
+ _handleWheel(event) {
235
+ if (this.config.showCatalog) {
236
+ const rect = this.canvas.getBoundingClientRect();
237
+ const x = event.clientX - rect.left;
238
+ const y = event.clientY - rect.top;
239
+ if (this.debugPanelController.isMouseOver(x, y)) {
240
+ event.preventDefault();
241
+ this.debugPanelController.handleScroll(event.deltaY);
242
+ }
243
+ }
244
+ }
245
+ _handleResize() {
246
+ if (!this.canvas)
247
+ return;
248
+ this.width = this.canvas.offsetWidth;
249
+ this.height = this.canvas.offsetHeight;
250
+ this.canvas.width = this.width;
251
+ this.canvas.height = this.height;
252
+ if (this.quadtree) {
253
+ this.quadtree = new Quadtree({ x: 0, y: 0, width: this.width, height: this.height });
254
+ }
255
+ const sectorGrid = this.layerController.getBodies('sectorGrid')[0];
256
+ if (sectorGrid) {
257
+ sectorGrid.resize(this.width, this.height);
258
+ }
259
+ if (this.debugPanelController) {
260
+ this.debugPanelController.handleResize();
261
+ }
262
+ }
263
+ _drawGithubIcon(x, y, size) {
264
+ this.ctx.save();
265
+ this.ctx.translate(x, y);
266
+ // Scale to fit size, default path is for 24x24 box
267
+ this.ctx.scale(size / 24, size / 24);
268
+ const path = new Path2D('M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22');
269
+ const isHovered = this.isMouseOverGithubLink;
270
+ this.ctx.strokeStyle = isHovered ? 'rgba(255, 255, 255, 1.0)' : 'rgba(255, 255, 255, 0.8)';
271
+ this.ctx.lineWidth = 2;
272
+ this.ctx.stroke(path);
273
+ this.ctx.restore();
274
+ }
275
+ _drawGithubLink() {
276
+ if (!this.config.showGithubLink) {
277
+ this.githubLinkBounds = null;
278
+ return;
279
+ }
280
+ const x = 16; // Corresponds to top-4, left-4
281
+ const y = 16;
282
+ const iconSize = 12;
283
+ const gap = 4;
284
+ const text = 'Where Stars Drift v1.0.0';
285
+ const isHovered = this.isMouseOverGithubLink;
286
+ this.ctx.fillStyle = isHovered ? 'rgba(255, 255, 255, 1.0)' : 'rgba(255, 255, 255, 0.8)';
287
+ this.ctx.font = '12px "Roboto Mono", monospace';
288
+ this.ctx.textBaseline = 'middle';
289
+ this._drawGithubIcon(x, y, iconSize);
290
+ const textX = x + iconSize + gap;
291
+ const textY = y + iconSize / 2;
292
+ this.ctx.fillText(text, textX, textY);
293
+ const textMetrics = this.ctx.measureText(text);
294
+ this.githubLinkBounds = {
295
+ x: x,
296
+ y: y,
297
+ width: iconSize + gap + textMetrics.width,
298
+ height: iconSize
299
+ };
300
+ }
301
+ _checkMouseInteraction() {
302
+ if (!this.isMouseInside)
303
+ return;
304
+ const starships = this.layerController.getBodies('dynamicObjects').filter(b => b instanceof Starship);
305
+ starships.forEach(ship => {
306
+ if (ship.state === 'FLEEING' || ship.state === 'IN_FORMATION')
307
+ return;
308
+ const dx = ship.x - this.mouse.x;
309
+ const dy = ship.y - this.mouse.y;
310
+ const dist = Math.sqrt(dx * dx + dy * dy);
311
+ if (dist < 50) {
312
+ ship.state = 'FLEEING';
313
+ ship.stateTimer = 180;
314
+ }
315
+ });
316
+ }
317
+ animate(currentTime) {
318
+ const deltaTime = (currentTime - this.lastTime) / 16.67; // Normalize to 60 FPS
319
+ this.lastTime = currentTime;
320
+ this.frameCount++;
321
+ // FPS Calculation
322
+ this.fpsFrameCount++;
323
+ if (currentTime - this.lastFpsUpdateTime > 1000) {
324
+ this.fps = this.fpsFrameCount / ((currentTime - this.lastFpsUpdateTime) / 1000);
325
+ this.lastFpsUpdateTime = currentTime;
326
+ this.fpsFrameCount = 0;
327
+ this.fpsHistory.push(this.fps);
328
+ if (this.fpsHistory.length > this.avgFpsWindow) {
329
+ this.fpsHistory.shift();
330
+ }
331
+ this.avgFps = this.fpsHistory.reduce((a, b) => a + b, 0) / this.fpsHistory.length;
332
+ }
333
+ this.ctx.clearRect(0, 0, this.width, this.height);
334
+ this.debugController.clear();
335
+ this.pulseTime += 0.02;
336
+ if (this.config.interactive && this.isMouseInside) {
337
+ this.mouse.dx = this.mouse.x - this.mouse.lastX;
338
+ this.mouse.dy = this.mouse.y - this.mouse.lastY;
339
+ }
340
+ else {
341
+ this.mouse.dx = 0;
342
+ this.mouse.dy = 0;
343
+ }
344
+ this.mouse.lastX = this.mouse.x;
345
+ this.mouse.lastY = this.mouse.y;
346
+ const allStars = this.starController.getAllStars();
347
+ const allStarships = this.starshipController.getAllStarships();
348
+ const blackHoles = this.layerController.getBodies('blackHoles');
349
+ const allFleets = this.layerController.getBodies('dynamicObjects').filter(b => b instanceof Fleet);
350
+ const allClans = this.starshipController.getAllClans();
351
+ const allFormations = formationRegistry.getAllFormations();
352
+ this.quadtree.clear();
353
+ for (const body of this.allBodies) {
354
+ this.quadtree.insert(body);
355
+ }
356
+ if (this.config.debug && DEBUG_CONFIG.SHOW_QUADTREE) {
357
+ this.quadtree.draw(this.ctx);
358
+ }
359
+ if (this.config.interactive) {
360
+ const newSupernovas = this.physicsController.update(blackHoles, allStars, this.quadtree, this.width, this.height);
361
+ this.effectsController.addSupernovas(newSupernovas);
362
+ }
363
+ this.allLayers.forEach(layer => {
364
+ layer.bodies.forEach(body => {
365
+ if (body instanceof Star) {
366
+ body.update(this.ctx, this.width, this.height, this.mouse, layer.isInteractive, this.isMouseInside, this.pulseTime);
367
+ }
368
+ else if (body instanceof BlackHle) {
369
+ body.update(this.ctx, this.width, this.height, this.frameCount);
370
+ }
371
+ else if (body instanceof Starship) {
372
+ if (body.state !== 'IN_FORMATION') {
373
+ body.update(this.ctx, this.width, this.height, this.mouse, deltaTime);
374
+ }
375
+ }
376
+ else if (body instanceof Fleet) {
377
+ body.update(this.ctx, this.width, this.height);
378
+ }
379
+ else if (body instanceof Comet) {
380
+ body.update(this.ctx, this.width, this.height);
381
+ }
382
+ else {
383
+ body.update(this.ctx, this.width, this.height);
384
+ }
385
+ });
386
+ });
387
+ if (this.config.interactive) {
388
+ this.hoverController.update(this.mouse, this.isMouseInside, this.config.debug);
389
+ }
390
+ this.layerController.getBodies('backgroundNebulas').forEach(body => body.draw(this.ctx));
391
+ if (this.config.showGrid) {
392
+ this.layerController.getBodies('sectorGrid').forEach(body => body.draw(this.ctx));
393
+ }
394
+ this.layerController.getBodies('staticStars').forEach(body => body.draw(this.ctx, this.pulseTime));
395
+ this.layerController.getBodies('interactiveStars').forEach(body => body.draw(this.ctx, this.pulseTime));
396
+ this.effectsController.updateAndDrawSupernovas(this.ctx);
397
+ this.effectsController.drawStarToHoleStreams(this.ctx, allStars, blackHoles);
398
+ this.layerController.getBodies('blackHoles').forEach(body => body.draw(this.ctx, this.pulseTime, this.frameCount));
399
+ this.layerController.getBodies('dynamicObjects').forEach(body => {
400
+ if (body instanceof Starship) {
401
+ const isInFleet = this.layerController.getBodies('dynamicObjects').filter(b => b instanceof Fleet).some(f => f.members.includes(body));
402
+ if (!isInFleet) {
403
+ body.draw(this.ctx);
404
+ }
405
+ }
406
+ else {
407
+ body.draw(this.ctx);
408
+ }
409
+ });
410
+ this.effectsController.updateAndDrawMeteors(this.ctx);
411
+ if (this.config.interactive) {
412
+ this.starshipController.manageStarshipTargets(allStars);
413
+ this.starshipController.manageFleets(this.width, this.height);
414
+ this._checkMouseInteraction();
415
+ }
416
+ // Isolate all UI drawing to prevent transform leaks
417
+ this.ctx.save();
418
+ this._drawGithubLink();
419
+ if (this.config.debug) {
420
+ this.debugController.draw(this.ctx);
421
+ if (DEBUG_CONFIG.SHOW_CATALOG_PANEL) {
422
+ this.debugPanelController.draw({
423
+ starships: allStarships,
424
+ formations: allFormations,
425
+ clans: allClans,
426
+ fleets: allFleets,
427
+ stars: allStars,
428
+ blackHoles: blackHoles,
429
+ }, this.pulseTime, this.frameCount);
430
+ }
431
+ this.ctx.fillStyle = 'rgba(255, 255, 255, 0.7)';
432
+ this.ctx.font = '12px "Roboto Mono", monospace';
433
+ this.ctx.textAlign = 'right';
434
+ const stats = this.getStats();
435
+ this.ctx.fillText(`FPS: ${stats.fps.toFixed(0)} (Avg: ${stats.avgFps.toFixed(0)})`, this.width - 10, this.height - 10);
436
+ }
437
+ this.ctx.restore();
438
+ this.animationFrameId = requestAnimationFrame(this.animate);
439
+ }
440
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@types/react/jsx-runtime.d.ts","../src/draw-debug-line.ts","../src/config/simulation.ts","../src/base/celestial-body.ts","../src/base/bounded-body.ts","../src/base/massive-body.ts","../src/entities/docking-point.ts","../src/entities/orbit.ts","../src/base/hoverable.ts","../src/entities/black-hole-shapes.ts","../src/lib/energy-stream.ts","../src/config/effects.ts","../src/entities/black-hole.ts","../src/entities/star.ts","../src/entities/comet.ts","../src/entities/clans.ts","../src/entities/formations.ts","../src/entities/fleet.ts","../src/controllers/debug-controller.ts","../src/entities/starship.ts","../src/controllers/hover-controller.ts","../src/controllers/layer-controller.ts","../src/entities/clan-manager.ts","../src/controllers/clan-controller.ts","../src/controllers/starship-controller.ts","../src/entities/pulsar.ts","../src/entities/ring.ts","../src/entities/ringed-planet.ts","../src/entities/star-factory.ts","../src/entities/black-hole-factory.ts","../src/controllers/star-controller.ts","../src/entities/supernova.ts","../src/lib/quadtree.ts","../src/controllers/physics-controller.ts","../src/entities/meteor.ts","../src/lib/simplified-stream.ts","../src/controllers/effects-controller.ts","../src/entities/nebula.ts","../src/ui/panel-config.ts","../src/ui/ships-panel.ts","../src/ui/formations-panel.ts","../src/ui/clans-panel.ts","../src/ui/fleets-panel.ts","../src/ui/stars-panel.ts","../src/ui/black-holes-panel.ts","../src/types.ts","../src/ui/debug-panel-controller.ts","../src/config/grid.ts","../src/entities/sector-grid.ts","../src/where-stars-drift.ts","../src/index.ts","../src/config/panel.ts","../src/entities/starship-classes.ts","../../../node_modules/@types/d3-array/index.d.ts","../../../node_modules/@types/d3-color/index.d.ts","../../../node_modules/@types/d3-ease/index.d.ts","../../../node_modules/@types/d3-interpolate/index.d.ts","../../../node_modules/@types/d3-path/index.d.ts","../../../node_modules/@types/d3-time/index.d.ts","../../../node_modules/@types/d3-scale/index.d.ts","../../../node_modules/@types/d3-shape/index.d.ts","../../../node_modules/@types/d3-timer/index.d.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[148,190],[135,148,190],[139,148,190],[138,148,190],[148,187,190],[148,189,190],[190],[148,190,195,224],[148,190,191,196,202,203,210,221,232],[148,190,191,192,202,210],[143,144,145,148,190],[148,190,193,233],[148,190,194,195,203,211],[148,190,195,221,229],[148,190,196,198,202,210],[148,189,190,197],[148,190,198,199],[148,190,202],[148,190,200,202],[148,189,190,202],[148,190,202,203,204,221,232],[148,190,202,203,204,217,221,224],[148,185,190,237],[148,190,198,202,205,210,221,232],[148,190,202,203,205,206,210,221,229,232],[148,190,205,207,221,229,232],[146,147,148,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238],[148,190,202,208],[148,190,209,232,237],[148,190,198,202,210,221],[148,190,211],[148,190,212],[148,189,190,213],[148,187,188,189,190,191,192,193,194,195,196,197,198,199,200,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238],[148,190,215],[148,190,216],[148,190,202,217,218],[148,190,217,219,233,235],[148,190,202,221,222,223,224],[148,190,221,223],[148,190,221,222],[148,190,224],[148,190,225],[148,187,190,221],[148,190,202,227,228],[148,190,227,228],[148,190,195,210,221,229],[148,190,230],[148,190,210,231],[148,190,205,216,232],[148,190,195,233],[148,190,221,234],[148,190,209,235],[148,190,236],[148,190,195,202,204,213,221,232,235,237],[148,190,221,238],[80,148,190],[78,79,148,190],[148,157,161,190,232],[148,157,190,221,232],[148,152,190],[148,154,157,190,229,232],[148,190,210,229],[148,190,239],[148,152,190,239],[148,154,157,190,210,232],[148,149,150,153,156,190,202,221,232],[148,157,164,190],[148,149,155,190],[148,157,178,179,190],[148,153,157,190,224,232,239],[148,178,190,239],[148,151,152,190,239],[148,157,190],[148,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,190],[148,157,172,190],[148,157,164,165,190],[148,155,157,165,166,190],[148,156,190],[148,149,152,157,190],[148,157,161,165,166,190],[148,161,190],[148,155,157,160,190,232],[148,149,154,157,164,190],[148,190,221],[148,152,157,178,190,237,239],[81,84,148,190],[81,148,190],[81,85,148,190],[81,96,103,148,190],[81,92,93,94,112,115,116,148,190],[81,84,89,93,94,98,100,148,190],[81,83,85,93,94,99,112,113,148,190],[81,94,102,109,110,148,190],[81,94,96,98,99,100,102,104,148,190],[81,93,148,190],[81,83,86,89,90,91,92,94,148,190],[81,96,148,190],[81,98,100,148,190],[81,85,94,148,190],[81,84,94,148,190],[81,83,85,89,96,97,100,148,190],[81,100,148,190],[81,87,94,148,190],[81,94,148,190],[81,87,94,107,148,190],[81,84,128,148,190],[81,94,106,108,148,190],[81,83,86,87,88,89,93,148,190],[81,83,85,87,88,89,94,98,99,148,190],[81,83,93,94,95,96,97,98,100,102,105,106,108,111,112,114,117,118,128,129,130,148,190],[81,93,94,148,190],[81,93,94,96,97,98,100,148,190],[81,93,119,148,190],[81,96,119,148,190],[81,83,93,94,96,97,98,100,109,110,119,120,121,122,123,124,125,126,148,190],[81,98,119,148,190],[81,97,98,100,119,148,190],[81,100,119,148,190],[81,94,106,108,119,148,190],[81,83,93,94,95,97,98,99,100,101,102,105,111,113,114,117,118,127,129,148,190]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"5e76305d58bcdc924ff2bf14f6a9dc2aa5441ed06464b7e7bd039e611d66a89b","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"b6ffaaf5539568969f443bedecd753d07f39c23f1d4ce8bda57396e998245ef7","signature":"f19b11e71ddee15d4a8d19d1987a5b1876799b45fabcdd81dbd386a939d13c5e"},{"version":"5dc52a61c9172ea5eeb42666b3b7ab80cd6074d096bc9c5a5ffe183eeda03b18","signature":"4f5988bd48d35c682d3cffbcb6b9b1c377ec4d0fcf9322488e88ff033f0cf0be"},{"version":"2282db023b22e34eb1a9ff825eace01438a349ba36c172874dec30f502c0dcf3","signature":"890d6bfa0cdc2a0417cd9619e768c658edfe6b00c8d897c070c44b8fa9464886"},{"version":"a3f40d359700f0472fb3a66af84b41fda8774e6d4ed3ee0715c2eaeee11057e3","signature":"cbf54d67021c6690a13b212576c73a4cd56e82f2507e66b547f5541045f48981"},{"version":"4ee3fee43dfd248303afc2df4ee8a01d33c7bc3bbdecf26c03f34f9d75d6e306","signature":"6305fd9ba53b210fbf87f278ab4fb1cbd54e094d4393e2a411cf6e560909bcbb"},{"version":"9285a5efd49e12df644f5058f14109fb65e5709e4e880e0076475111b03ffe03","signature":"b825733ffd8666f010cde4e8cc6bd7602cb70ca66dda4025102d7260984b6869"},{"version":"6aad138ffa88f3c5371f0ed1756b2ca61dc67e04a774bfd2d9d649f058098d75","signature":"d8bd2a35cf62bba1f83e897d4f39c3817dd69629d22fd5bad60b5ac1c4981b21"},{"version":"e569fe701b10ff843ef5305cb16303b7cd3904785fac752f094591d056f003f0","signature":"caa99caf365486492b9327f2a6a88a793b082028a9f50034964265ddb2d4fada"},{"version":"1038a38b4b11afabcf6e9e7e871f5ca6c8e93dc423f5dd7ac03d548f926adfa3","signature":"47b858706b8d46c2d76b0a23b37c0eab234b0c1df3872e55157670bcccf42741"},{"version":"943ee79bd9942b3912f919f9222c569ee63c1d1a10325f6a812cf0a818366334","signature":"f6d802948419e3c908ecdfbc4484a08e3b861f631e0171b14607d6ce8161e973"},{"version":"0b17aea86a41b13e8089cf7dfd9770bb147199be40d0e3ae91f97f2e1b6bee74","signature":"4b08adc5d404a1b1fb0c4bd70b321ff383494fa64aff3b693731facc9cf649e7"},{"version":"61af78f64a88115bac5815c2f5f4b0fa9ed5e0586bbf7365842ad385aa887e26","signature":"34375eaf10741b1d57cb4cbd97686fd6d6fd1af6eca52f84e01ad76e98cf25ab"},{"version":"1de1c1a7e919887d4d236d7480c2ed5c5455172e7ea82f6eff0ebfc6056bf7ff","signature":"678cd15a201d454ca8adadcea2ebac8302db03b68767a5682659a68e28d6f277"},{"version":"bd1f1142e95b62320cafb31d8556ff8ce0e0297b4cbb9a8ccf088454d9c2dea5","signature":"c49d452b2cf5b8de6ecf8547cd9908e4ca08eeb2fa79e6cabc92137a06562397"},{"version":"9b173a460928caf3ae9b1933be78bb460c6e001386fe859b252a351f0718f064","signature":"744c397ead269f68ec5822d8c5fb1548bad01eff454342a4cd2837f78a9efa5c"},{"version":"52774685eaf8103c54a04b216356a514f851cba49f3b168e00e6caf7d86c50ce","signature":"acb6f769af05cf8918d72eee4967ebad8b8d661a4d897d67a052ca20bc2d7555"},{"version":"86618184eb8ca14f8b9cbd87d0d94f505a11a0f7cc10c0330348043ee9865800","signature":"84cd47e2c80a00ff7de2e0bf29572b70c88a151d106dfb169ebc1e7b6ecf7caa"},{"version":"c862b50b6fee206427cce85a92d5d7401c5e906eb1e75317b7e329f59c61c743","signature":"c69099fc77b871ab78a31210c2f3249bdd802d1eb433ed5c49c25229c9d432db"},{"version":"c0a617954263f11a059251090d1c8a2ef769eb8de2bfa7fc348a0918eb6b4e77","signature":"d4dc70a4f2d0b99aadfe147f28711f17968417dbb213ef5b9193f171d9a3326e"},{"version":"d3c767175449893bd501c8dcbbd4458f025dd922db4c859bfb77ec20d9f4ceef","signature":"22a1ac03a654a5e01324211d423bdc7c9248ed950ece5291bdea8e8d895e303f"},{"version":"88986ee451349815dcd61cd78b04000771a8bb2b3b3896f6a2f4009bb12931dc","signature":"ee2f667955a7e0361d8d95c4e28ed5911fe515299157cbf9fea4c1d2487b611f"},{"version":"007dee7cc5ea21b565da0268bdf3fec8f1a0aa4c38395695b64b3946e486661c","signature":"0535284bec2129ac0c94a914762f6ab16bbd217b447c3ba3f40cce1ac8029ef4"},{"version":"de1dfa4da53ec8786de89741bed19d6409304291cdff463f4fbf865070bc568b","signature":"e866b90d9ed753d06b388b18313fb3f5e81a7f3adbd106a88fd050deef4b0371"},{"version":"645b8f3f444a5748f4f766e18d7520af4b81465dcb781b0763bc05bbb060aa64","signature":"52aec499d3fadff1ee4689194b826850da9f1d5d34f2b96c0f4bd710597315a8"},{"version":"f081de67c72308cf717d300f536c8b48cf0ed5e0f12d189d542e47cdc791befb","signature":"2eae0147250a3f35f0003131b850bb6d15697bc8436e5e59b20feb595a3ea3dd"},{"version":"551e7817646b95de2012298ac6bc00ebecc8ea29fe69819299ac520b530d2d8c","signature":"13fd53ba1064b8266f05aad9b6b2ec5655e5a6be0c086ab35262c7cc14de7328"},{"version":"6c0937ef93579d888ec601f537681897ad2303823b77d389454b187241cb62f7","signature":"832c919db077e45468d4fad8d35098bc1d2603681b12ba68d7812203215c2851"},{"version":"e6d1cad70486ca521882a34d6eefcea8d1d4e5472cfaba65e4ecb5178a7e033d","signature":"4221fc7334a6100f70726feb3ffe3e1dffdb4434dc71952e7c3d665fa09592de"},{"version":"a0548d70100cf4fc4934c7c84018497e81bc461fc60707fb0374c8337166f15c","signature":"3de3ad6f748e03d53c2e4b57e563bc90bb20e2501681e6ae73d58253c24be0f0"},{"version":"615b48871a7e4ac3ed7b54118042a8e94c3dec35b2e3c17fed6237e3fb9e0193","signature":"e9dde0dd2570e239720a7ddf5bbed7fb8f838fa15fc1234fc41fbac049efed52"},{"version":"84d2f72268be849af8aa7ad1a8c04473f706c6083d8d69ebabac45d76360470a","signature":"e75385b6c12a3644cd3546d4cd9a097764ccc220723800c6647fae87075396b0"},{"version":"eac685c0082d80756e6f7844a3c27327fa8388c99266d7906641b119405ce98a","signature":"db718c1b06c991d6527de02a9b430b60fcaf591dc791585a7b4a66ff89c0831d"},{"version":"fa8cfa015fad7efe469656e3e7e17235cf6157c3d3b320fe1dfb25dc2d1197ad","signature":"fb8f493f1f2bcc1fa2c25c191d6184f752d773c67a93251e0b4ba201e9bd3d6a"},{"version":"13e8f90f10738b486d71247123b4ebb44e47446d1457e03fdf12cde5bbd9bcf0","signature":"0d4e664ed4d6af011ffbde114867dea320a33e8ebf46aa34526e241f3a6f7333"},{"version":"edf22b24dff5219d08cb0778afc7e6f40fc320ef467c9451ba1dd0bf0d53af9f","signature":"7e75b69d5f7a0f6b519b943c788f36f730c32e4dd91b996935c96e3b706cee97"},{"version":"f6611c4ece89410f329288610e945e78ca5c52d873e798cad3088ea8657fe2db","signature":"e7af3aebf98af2121a5c441cc130bc28f45969a73ec1dfc2015e443788e97519"},{"version":"a2ff49016696a145cb2c601e5ba20dd485e9c42cc261ad92916c05367633ab71","signature":"c600976de14285b1dcdbc69ce02847e1d5aed9abe3614a25070ada9d12cc5853"},{"version":"74c6dbca649a5619ddfbf5f8f89b983ef69bdbbbca08104ee0011222398dcee2","signature":"dd5407a5acd6bacf440d07637aa4b0ee26ea58a53ac0c1c57064368ef0e1e2aa"},{"version":"5be144eca26babc809a776660dc17a66510ea6426be5936c11bebde89041e4e9","signature":"5bdb38b63aad835f17de2f4571d05485af86a6e5fb7eddef6c2b7f687f81e888"},{"version":"401296bac9ca8ed69099734b6f141b96251ad875a3f36a04a5f9c610283d8070","signature":"a870aab8d96c7cbfe81a97a65bf40cffd9167c4dbab993f6034bb8091352afbf"},{"version":"b0ed6bd991faa1d6a262f6d981d0d068c8e3632abc8902b0d56ae9c58f255ced","signature":"7457f5ee8366bcd411254c0c2788b291c83a72c376b4a7e04c5a238b6acd5bfc"},{"version":"0151c36e23a6f6dbfe49483810753b762ea35fc7f5ea7df7db3c6a23b19fe853","signature":"d948fc3fd69611e429282b49fa335a98740d89529dfe91680dbacfe1f4d9eaef"},{"version":"93b619990e5dc8a7595d3f002549551542f2a54510c637dd7f33392255b57ff4","signature":"16ccec4f181070e9a6a03f3db99a25143f86f1412affea3bbf99919008522f96"},{"version":"8932cdc76b1e693aaaacadce0838360fdecafa2610c5d3ea0d01eb9d2a012456","signature":"99b6357d2b1a58a5188c965ca9ccc9434ebd09dd9b8a99cfd6237747c3daaea8"},{"version":"b81d216770c43d0a859d4250517b052b1efb91caa95b16ebecf2d115718aefbf","signature":"9721a32e1b355f4a35adf3c1b356be0b0e6f9bf56e89e67c17993e257cc2dd86"},{"version":"d327818df93a98fc6563793a967d4b35c4cbc6dc1d1c31573260331ec33fd113","signature":"4700e5b9a9dc6546321f002e2e6978a2b61ec9f04d956d69b94ebc502e1739ec"},{"version":"863dac61bb91a68c20221c9ef139f8e7c3a2df4f2691699e591ac7327f557d26","signature":"7d97bda24b2ae828501808a37396458353ea9208dba80335f39d3336660350de"},{"version":"15506040d178ce6f16b44576c0a512c7cb5e954561206030c005b9a1ddf35918","signature":"96c51cbbe628f06d7ccd60134725a660d25dd45d59f5f1215b8e9b3393246e6c"},{"version":"6af1888a4cd58bb6c44e3c03f3f29db87fda7b3965b103139594a8d018ffa317","signature":"59034f70ab1fd70127db7cd24415637bd7aa908eeec16af8077e0aaa8db64a70"},{"version":"fb5df56d3bd029a03950ec213453f5cce0ea1bedf83f17dff7368f02519ffbed","signature":"f9e31761fc2d07fc0218f0db7f8728e1c799aaa9947363dadcfe6a2355f02391"},{"version":"74c6dbca649a5619ddfbf5f8f89b983ef69bdbbbca08104ee0011222398dcee2","signature":"dd5407a5acd6bacf440d07637aa4b0ee26ea58a53ac0c1c57064368ef0e1e2aa"},{"version":"176be3924d2aea89f5b310d51afaad4ae93a4f121a66f303c1f161163933da07","signature":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"version":"e0c868a08451c879984ccf4d4e3c1240b3be15af8988d230214977a3a3dad4ce","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"08faa97886e71757779428dd4c69a545c32c85fd629d1116d42710b32c6378bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"c4a806152acbef81593f96cae6f2b04784d776457d97adbe2694478b243fcf03","impliedFormat":1},{"version":"71adf5dbc59568663d252a46179e71e4d544c053978bfc526d11543a3f716f42","impliedFormat":1},{"version":"c60db41f7bee80fb80c0b12819f5e465c8c8b465578da43e36d04f4a4646f57d","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"e184c4b8918ef56c8c9e68bd79f3f3780e2d0d75bf2b8a41da1509a40c2deb46","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b19db3600a17af69d4f33d08cc7076a7d19fb65bb36e442cac58929ec7c9482","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"27d8987fd22d92efe6560cf0ce11767bf089903ffe26047727debfd1f3bf438b","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[82,133]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"jsx":4,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[134,1],[135,1],[136,1],[137,2],[138,1],[140,3],[141,4],[139,1],[142,1],[187,5],[188,5],[189,6],[148,7],[190,8],[191,9],[192,10],[143,1],[146,11],[144,1],[145,1],[193,12],[194,13],[195,14],[196,15],[197,16],[198,17],[199,17],[201,18],[200,19],[202,20],[203,21],[204,22],[186,23],[147,1],[205,24],[206,25],[207,26],[239,27],[208,28],[209,29],[210,30],[211,31],[212,32],[213,33],[214,34],[215,35],[216,36],[217,37],[218,37],[219,38],[220,1],[221,39],[223,40],[222,41],[224,42],[225,43],[226,44],[227,45],[228,46],[229,47],[230,48],[231,49],[232,50],[233,51],[234,52],[235,53],[236,54],[237,55],[238,56],[240,57],[78,1],[80,58],[81,57],[79,1],[76,1],[77,1],[13,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[24,1],[25,1],[4,1],[26,1],[30,1],[27,1],[28,1],[29,1],[31,1],[32,1],[33,1],[5,1],[34,1],[35,1],[36,1],[37,1],[6,1],[41,1],[38,1],[39,1],[40,1],[42,1],[7,1],[43,1],[48,1],[49,1],[44,1],[45,1],[46,1],[47,1],[8,1],[53,1],[50,1],[51,1],[52,1],[54,1],[9,1],[55,1],[56,1],[57,1],[59,1],[58,1],[60,1],[61,1],[10,1],[62,1],[63,1],[64,1],[11,1],[65,1],[66,1],[67,1],[68,1],[69,1],[1,1],[70,1],[71,1],[12,1],[74,1],[73,1],[72,1],[75,1],[164,59],[174,60],[163,59],[184,61],[155,62],[154,63],[183,64],[177,65],[182,66],[157,67],[171,68],[156,69],[180,70],[152,71],[151,64],[181,72],[153,73],[158,74],[159,1],[162,74],[149,1],[185,75],[175,76],[166,77],[167,78],[169,79],[165,80],[168,81],[178,64],[160,82],[161,83],[170,84],[150,85],[173,76],[172,74],[176,1],[179,86],[85,87],[84,88],[89,88],[86,89],[92,88],[128,88],[132,88],[83,88],[104,90],[99,88],[117,91],[101,92],[102,87],[114,93],[111,94],[105,95],[82,88],[110,96],[90,96],[93,97],[103,98],[96,99],[95,100],[87,101],[98,102],[97,103],[115,89],[118,89],[88,104],[106,105],[107,87],[108,106],[129,107],[109,108],[94,109],[133,1],[100,110],[112,96],[131,111],[91,112],[113,89],[116,112],[126,113],[125,114],[122,115],[127,116],[123,117],[121,118],[119,88],[120,119],[124,120],[130,121]],"latestChangedDtsFile":"./src/entities/starship-classes.d.ts","version":"5.7.3"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@where-stars-drift/core",
3
+ "version": "1.0.0",
4
+ "private": false,
5
+ "description": "A TypeScript canvas library for creating interactive space simulations with realistic physics, celestial bodies, and dynamic fleet behaviors.",
6
+ "author": "Volodymyr Lavrynovych",
7
+ "license": "Proprietary",
8
+ "keywords": [
9
+ "typescript",
10
+ "canvas",
11
+ "simulation",
12
+ "space",
13
+ "stars",
14
+ "interactive",
15
+ "physics",
16
+ "starships",
17
+ "fleets"
18
+ ],
19
+ "main": "./dist/index.js",
20
+ "module": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "files": [
23
+ "dist",
24
+ "src",
25
+ "LICENSE",
26
+ "README.md"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.json",
33
+ "prepublishOnly": "npm run build"
34
+ }
35
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Defines the abstract base class for all celestial bodies with physical boundaries.
3
+ */
4
+
5
+ import { CelestialBody } from './celestial-body';
6
+
7
+ export abstract class BoundedBody extends CelestialBody {
8
+ boundingRadius: number;
9
+
10
+ constructor(x: number, y: number, boundingRadius: number) {
11
+ super(x, y);
12
+ this.boundingRadius = boundingRadius;
13
+ }
14
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileoverview Defines the abstract base class for all celestial bodies.
3
+ */
4
+
5
+ export abstract class CelestialBody {
6
+ x: number;
7
+ y: number;
8
+ vx: number;
9
+ vy: number;
10
+
11
+ constructor(x: number, y: number) {
12
+ this.x = x;
13
+ this.y = y;
14
+ this.vx = 0;
15
+ this.vy = 0;
16
+ }
17
+
18
+ abstract update(context: CanvasRenderingContext2D, ...args: any[]): void;
19
+ abstract draw(context: CanvasRenderingContext2D, ...args: any[]): void;
20
+ }