From ca82c3357d7685e753ce3df52584d856ac6f6f7c Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Sun, 28 Dec 2025 14:35:31 +0100 Subject: [PATCH] custom drawings and animations for video --- .videos/1/animations/1.excalidraw | 1419 +++++++++ .videos/1/animations/2.excalidraw | 2829 +++++++++++++++++ .videos/1/animations/3.excalidraw | 721 +++++ DcsTypes.lua | 79 +- _docs/js/components/header.js | 5 +- _docs/pages/about_us.html | 3 +- _docs/pages/advanced/CAP.html | 3 +- _docs/pages/advanced/custom-drawings.html | 65 + _docs/pages/advanced/missions.html | 3 +- _docs/pages/persistence.html | 1 - _docs/style/style.css | 4 +- classes/spearhead_db.lua | 30 +- classes/stageClasses/GlobalStageManager.lua | 128 +- .../stageClasses/drawings/CustomDrawing.lua | 52 + .../drawings/helper/DrawingHelper.lua | 228 ++ main.lua | 2 +- 16 files changed, 5500 insertions(+), 72 deletions(-) create mode 100644 .videos/1/animations/1.excalidraw create mode 100644 .videos/1/animations/2.excalidraw create mode 100644 .videos/1/animations/3.excalidraw create mode 100644 _docs/pages/advanced/custom-drawings.html create mode 100644 classes/stageClasses/drawings/CustomDrawing.lua create mode 100644 classes/stageClasses/drawings/helper/DrawingHelper.lua diff --git a/.videos/1/animations/1.excalidraw b/.videos/1/animations/1.excalidraw new file mode 100644 index 0000000..4b8ff80 --- /dev/null +++ b/.videos/1/animations/1.excalidraw @@ -0,0 +1,1419 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "C89ygEbHaSevX0UmFQa29", + "type": "rectangle", + "x": 1595.1758233422202, + "y": 982.8838329063535, + "width": 1578.7433546522943, + "height": 836.7851776620863, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1E", + "roundness": { + "type": 3 + }, + "seed": 1397971778, + "version": 165, + "versionNonce": 1976396482, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false + }, + { + "id": "zymyegNU9v9TWAaJNoUQ6", + "type": "rectangle", + "x": 2280.4835366799443, + "y": 1543.643017153118, + "width": 211.02211156486123, + "height": 96.5527520526872, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1F", + "roundness": { + "type": 3 + }, + "seed": 881500930, + "version": 302, + "versionNonce": 673520222, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false + }, + { + "id": "vKXC1aEVs5uqRsvSnnOoX", + "type": "rectangle", + "x": 2110.505541163566, + "y": 1329.93712486004, + "width": 257.3589150478706, + "height": 137.06711701441645, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1G", + "roundness": { + "type": 3 + }, + "seed": 1191375554, + "version": 539, + "versionNonce": 739689090, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false + }, + { + "id": "XaaXel4GyBx7ZE8jJFFU-", + "type": "text", + "x": 2311.8471093741773, + "y": 1562.8008746850626, + "width": 154.26666259765625, + "height": 55.62747030529269, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1H", + "roundness": null, + "seed": 1297828482, + "version": 141, + "versionNonce": 1468931742, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Mission", + "fontSize": 44.50197624423415, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Mission", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8Z0uVkd2T8gUqGRmKSyfY", + "type": "text", + "x": 2139.710048166189, + "y": 1352.2802946540085, + "width": 209.48391723632812, + "height": 90, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1I", + "roundness": null, + "seed": 1582475842, + "version": 273, + "versionNonce": 1189028418, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Dynamic\nEnvironment", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Dynamic\nEnvironment", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "JWiweSzhuikJTu4HZkMGZ", + "type": "text", + "x": 1754.3449062335774, + "y": 1276.5059189319265, + "width": 55.243988037109375, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1J", + "roundness": null, + "seed": 1623724546, + "version": 231, + "versionNonce": 1942788830, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "CAP", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CAP", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EVHvyolSNwxiN31NPp0cq", + "type": "text", + "x": 1810.2584664781727, + "y": 1171.9477385696666, + "width": 196.58787536621094, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1K", + "roundness": null, + "seed": 129663426, + "version": 337, + "versionNonce": 1896188418, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Randomization", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Randomization", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_zbZUzNZ6-m_H1r6Je1Ws", + "type": "text", + "x": 1963.417918814925, + "y": 1067.4541208260175, + "width": 230.4958953857422, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1L", + "roundness": null, + "seed": 1313405314, + "version": 506, + "versionNonce": 863080222, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Dynamic Missions", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Dynamic Missions", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wa4xKY1Ve812njK6Hu_Df", + "type": "arrow", + "x": 2106.1255243470746, + "y": 1388.8792554044524, + "width": 308.93333412890956, + "height": 74.20142997348557, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1M", + "roundness": { + "type": 2 + }, + "seed": 1941076290, + "version": 347, + "versionNonce": 562624962, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -230.31042834295977, + 7.29165803983858 + ], + [ + -308.93333412890956, + -66.909771933647 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "LS6J2OTpx6hMih3iQPcNm", + "type": "arrow", + "x": 2116.648091215842, + "y": 1337.918660627163, + "width": 183.58214713496818, + "height": 128.22965822939244, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1N", + "roundness": { + "type": 2 + }, + "seed": 2002125058, + "version": 385, + "versionNonce": 1391328094, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -96.69419063956752, + -44.240692509901066 + ], + [ + -183.58214713496818, + -128.22965822939244 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "2pKO2mHKvKoxXycD-Trak", + "type": "arrow", + "x": 2200.5171954951866, + "y": 1327.1271867566231, + "width": 117.70638264769002, + "height": 217.8782767017758, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1O", + "roundness": { + "type": 2 + }, + "seed": 347246786, + "version": 508, + "versionNonce": 394817922, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -75.89678042654475, + -77.80677762467928 + ], + [ + -117.70638264769002, + -217.8782767017758 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "kn2jmFt51PCgv9ZSVQtPB", + "type": "arrow", + "x": 2278.431131294278, + "y": 1590.850587725762, + "width": 53.05431408484253, + "height": 122.51345010231648, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1P", + "roundness": { + "type": 2 + }, + "seed": 1063725186, + "version": 465, + "versionNonce": 1486020510, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -36.04382428028316, + -40.97518520498488 + ], + [ + -53.05431408484253, + -122.51345010231648 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "GHK711xc_0cjPoHBYSfbv", + "type": "text", + "x": 1644.731548138247, + "y": 1415.4750740468114, + "width": 146.91595458984375, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Q", + "roundness": null, + "seed": 523421762, + "version": 274, + "versionNonce": 1447227714, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Intercepts", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Intercepts", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EIVk3PNzkqTtPdwmGuozM", + "type": "arrow", + "x": 2108.5571488546734, + "y": 1428.739880273081, + "width": 350.09058635791064, + "height": 66.55192331587875, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1R", + "roundness": { + "type": 2 + }, + "seed": 200568834, + "version": 253, + "versionNonce": 1485913054, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -278.8961526603057, + 66.55192331587875 + ], + [ + -350.09058635791064, + 33.43792917899509 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "hcsXIwpZ0wO4h70e_51LN", + "type": "rectangle", + "x": 2655.5017561592795, + "y": 1468.1261290741381, + "width": 241.41983158991846, + "height": 83.72991507036454, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1S", + "roundness": { + "type": 3 + }, + "seed": 162209730, + "version": 727, + "versionNonce": 555186434, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false + }, + { + "id": "3n4in__khyQeAqqaLWnvM", + "type": "arrow", + "x": 2492.8516622720417, + "y": 1591.8594320033028, + "width": 161.6044126988354, + "height": 49.931047908565915, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1T", + "roundness": { + "type": 2 + }, + "seed": 1148573570, + "version": 214, + "versionNonce": 955912222, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 82.64046560250495, + -4.690581156494773 + ], + [ + 161.6044126988354, + -49.931047908565915 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZRt7GH5E7FZd3q4Hlr2Wb", + "type": "rectangle", + "x": 2579.230246373966, + "y": 1306.9669606519642, + "width": 241.41983158991846, + "height": 83.72991507036454, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1U", + "roundness": { + "type": 3 + }, + "seed": 210999106, + "version": 897, + "versionNonce": 2005207234, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false + }, + { + "id": "vPN2QPcdwWvMQ-mZifFWO", + "type": "arrow", + "x": 2462.2947804605733, + "y": 1542.2877867955297, + "width": 155.45326010245628, + "height": 150.55220092483307, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1V", + "roundness": { + "type": 2 + }, + "seed": 1382244098, + "version": 347, + "versionNonce": 1975409758, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 89.01755949466553, + -55.60892268147143 + ], + [ + 155.45326010245628, + -150.55220092483307 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "eSh01gIQ8yyR2BiCNcUrb", + "type": "text", + "x": 2593.2180895445626, + "y": 1112.0447137456451, + "width": 216.1039276123047, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1W", + "roundness": null, + "seed": 576990914, + "version": 62, + "versionNonce": 288006274, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "search & rescue", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "search & rescue", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "XR8xKvJaOTtt03Yh9J3Sa", + "type": "text", + "x": 2799.860760278255, + "y": 1184.756242277849, + "width": 129.24795532226562, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1X", + "roundness": null, + "seed": 557123202, + "version": 220, + "versionNonce": 1689198750, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "resources", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "resources", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eD07BUP5boG6Xi4PzLWE5", + "type": "text", + "x": 2884.00086110148, + "y": 1259.1706095534707, + "width": 218.51190185546875, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Y", + "roundness": null, + "seed": 127198786, + "version": 196, + "versionNonce": 1506230338, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "troop transport", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "troop transport", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "64_IG7tB8xe9guybyLolg", + "type": "arrow", + "x": 2649.657696625549, + "y": 1306.6347710433065, + "width": 28.256251025410165, + "height": 151.34407282126563, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Z", + "roundness": { + "type": 2 + }, + "seed": 509791746, + "version": 112, + "versionNonce": 2038258910, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 28.256251025410165, + -72.40883764124419 + ], + [ + 20.51590827401901, + -151.34407282126563 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_ydHzRJPIF7RDMZtLa_0_", + "type": "arrow", + "x": 2729.794510760714, + "y": 1305.9045077134572, + "width": 63.979632843547506, + "height": 88.47959195466075, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1a", + "roundness": { + "type": 2 + }, + "seed": 983416258, + "version": 92, + "versionNonce": 1832511490, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.8165451052091157, + -40.943698335596196 + ], + [ + 63.16308773833839, + -88.47959195466075 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "u2YxBRiyb-q80-becundA", + "type": "arrow", + "x": 2779.331092045323, + "y": 1306.5338048938277, + "width": 101.2133108183566, + "height": 27.085355634320024, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1b", + "roundness": { + "type": 2 + }, + "seed": 962901378, + "version": 95, + "versionNonce": 163189022, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.2025290131457496, + -24.593338663309396 + ], + [ + 101.2133108183566, + -27.085355634320024 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "nQo4X4sD5508YdRbN6L2V", + "type": "text", + "x": 2626.7713951078263, + "y": 1327.6156102040861, + "width": 158.61448669433594, + "height": 45.80388202365124, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1c", + "roundness": null, + "seed": 2079765826, + "version": 181, + "versionNonce": 327260098, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Logistics", + "fontSize": 36.64310561892099, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Logistics", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nDM5YqB-uMJaQXm_hhPz6", + "type": "arrow", + "x": 2175.660455769157, + "y": 1467.3571367658053, + "width": 173.54014297993103, + "height": 141.663432547738, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1d", + "roundness": { + "type": 2 + }, + "seed": 1672658178, + "version": 322, + "versionNonce": 282475870, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -123.80435478180289, + 122.18352354412411 + ], + [ + -173.54014297993103, + 141.663432547738 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "KoWGPL4te_nZGB7RtDbNA", + "type": "text", + "x": 1731.6864197817795, + "y": 1601.4552001472132, + "width": 259.69989013671875, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1e", + "roundness": null, + "seed": 1310182594, + "version": 482, + "versionNonce": 1019039618, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Front line dynamics", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Front line dynamics", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "6-2ZfqjatkazUWkp5gRva", + "type": "text", + "x": 2240.8290098027364, + "y": 1138.914974643674, + "width": 153.69192504882812, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1f", + "roundness": null, + "seed": 281339010, + "version": 73, + "versionNonce": 1948443038, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "progression", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "progression", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jVhjdO6uRjpvu8Zo7nSGS", + "type": "arrow", + "x": 2266.15959377383, + "y": 1327.983475505304, + "width": 37.09715089166127, + "height": 142.04843769343142, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1g", + "roundness": { + "type": 2 + }, + "seed": 1970865218, + "version": 108, + "versionNonce": 2100039490, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -26.775736296397554, + -63.91159713230098 + ], + [ + 10.321414595263718, + -142.04843769343142 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "MlytaE0dWp2tfKHhOAto9", + "type": "arrow", + "x": 2596.5132212546523, + "y": 1306.953322625103, + "width": 76.2288673445837, + "height": 82.41916292472536, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1h", + "roundness": { + "type": 2 + }, + "seed": 907226114, + "version": 232, + "versionNonce": 1188101598, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -76.2288673445837, + -23.759502278248988 + ], + [ + -72.78559318187752, + -82.41916292472536 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JhKoOvbUE4uNqMi4I3Qhi", + "type": "text", + "x": 2501.1016541350414, + "y": 1181.726840184583, + "width": 107.1839599609375, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1i", + "roundness": null, + "seed": 2022857666, + "version": 150, + "versionNonce": 153933570, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "convoys", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "convoys", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ztZZIZZ_qBNW_4kWdz2Fi", + "type": "arrow", + "x": 2396.1874688609987, + "y": 1640.0013354931941, + "width": 202.0124120928847, + "height": 82.8810205003274, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1j", + "roundness": { + "type": 2 + }, + "seed": 1259705218, + "version": 281, + "versionNonce": 233935390, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -10.277189431840156, + 62.10612730731145 + ], + [ + 191.73522266104453, + 82.8810205003274 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "F9W7pRQ7W4kXvmBa881_r", + "type": "text", + "x": 2605.146401500665, + "y": 1669.2132132342715, + "width": 313.0916784375118, + "height": 77.07669898789328, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1k", + "roundness": null, + "seed": 534500162, + "version": 318, + "versionNonce": 826189506, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "The Story", + "fontSize": 61.66135919031466, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "The Story", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HP7cvatU7B02lDuolKi-j", + "type": "text", + "x": 2681.145416645998, + "y": 1487.3370645335638, + "width": 187.76373087459876, + "height": 41.881647225841355, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1l", + "roundness": null, + "seed": 1229200130, + "version": 138, + "versionNonce": 74817118, + "isDeleted": false, + "boundElements": [], + "updated": 1766842694815, + "link": null, + "locked": false, + "text": "Persistence", + "fontSize": 33.505317780673074, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Persistence", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#1b1d27" + }, + "files": {} +} \ No newline at end of file diff --git a/.videos/1/animations/2.excalidraw b/.videos/1/animations/2.excalidraw new file mode 100644 index 0000000..73432f1 --- /dev/null +++ b/.videos/1/animations/2.excalidraw @@ -0,0 +1,2829 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "TkmYPuA-gv0_UwIlIvUks", + "type": "rectangle", + "x": 587.6701419860844, + "y": 326.930520978411, + "width": 1578.7433546522943, + "height": 836.7851776620863, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7r", + "roundness": { + "type": 3 + }, + "seed": 236498771, + "version": 392, + "versionNonce": 1599045171, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "3aTXQGLGN9zXVMmN2tq7t", + "type": "text", + "x": 883.7016057712028, + "y": 340.16469192742414, + "width": 185.5073309495647, + "height": 56.70928542470905, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7s", + "roundness": null, + "seed": 1284328691, + "version": 438, + "versionNonce": 801587155, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "What if?", + "fontSize": 45.36742833976728, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "What if?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1knzWeJorG8y3HvCLncV1", + "type": "text", + "x": 936.1120196234406, + "y": 397.0639339157842, + "width": 764.116943359375, + "height": 70.92530107466699, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7t", + "roundness": null, + "seed": 970798739, + "version": 562, + "versionNonce": 2117920659, + "isDeleted": false, + "boundElements": [], + "updated": 1766926959872, + "link": null, + "locked": false, + "text": "you could only think about what to make, \n not about how to make it work?", + "fontSize": 28.370120429866798, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "you could only think about what to make, \n not about how to make it work?", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "l2eRxUDHSX5TBIwPC3bgm", + "type": "rectangle", + "x": 621.7852981557176, + "y": 512.2577379418976, + "width": 748.5964330545568, + "height": 611.2062252729833, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7u", + "roundness": { + "type": 3 + }, + "seed": 1958669363, + "version": 652, + "versionNonce": 1149347603, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "QXsfOg8wC1qDs4O94DH5Y", + "type": "text", + "x": 1160.3935163549238, + "y": 529.0713808440466, + "width": 195.63587951660156, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7v", + "roundness": null, + "seed": 18410963, + "version": 443, + "versionNonce": 42028211, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "Mission Editor", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Mission Editor", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TZ23U60Lz84MHHxh-CpIt", + "type": "rectangle", + "x": 1390.5089986688547, + "y": 515.4772965219338, + "width": 748.5964330545568, + "height": 611.2062252729833, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7w", + "roundness": { + "type": 3 + }, + "seed": 570538867, + "version": 778, + "versionNonce": 1488666195, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "_j5lLDaYL7GKwVu-JzOnX", + "type": "text", + "x": 1416.7848813374105, + "y": 533.6019440545078, + "width": 87.9759521484375, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7x", + "roundness": null, + "seed": 1941951763, + "version": 495, + "versionNonce": 1644559347, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "Result", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Result", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "24sk1TnRyheU_qDB6J5Yc", + "type": "rectangle", + "x": 701.7866753035726, + "y": 850.7719555895353, + "width": 320.9076668828474, + "height": 161.35983833551992, + "angle": 0.8540908114910017, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7y", + "roundness": { + "type": 3 + }, + "seed": 1170848435, + "version": 741, + "versionNonce": 443024787, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "ch5F6Obf-VzPHBs_UO7Gb", + "type": "rectangle", + "x": 917.653181990104, + "y": 819.735904230279, + "width": 320.9076668828474, + "height": 161.35983833551992, + "angle": 0.8540908114910017, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b7z", + "roundness": { + "type": 3 + }, + "seed": 885386323, + "version": 812, + "versionNonce": 957864755, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "-waVClSnsHK3PiaDITVtk", + "type": "rectangle", + "x": 972.6195301890348, + "y": 611.7171059886023, + "width": 320.9076668828474, + "height": 161.35983833551992, + "angle": 0.8540908114910017, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b80", + "roundness": { + "type": 3 + }, + "seed": 76212723, + "version": 855, + "versionNonce": 1249639635, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "3SZLMWhT7Jt2wZAZjuLwb", + "type": "text", + "x": 807.3223145398006, + "y": 774.4644178604894, + "width": 11.95599365234375, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b81", + "roundness": null, + "seed": 975123347, + "version": 331, + "versionNonce": 170584691, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "1", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4ZysJnqb84Iq1luukKMeU", + "type": "text", + "x": 1018.564353061721, + "y": 742.6965875901219, + "width": 19.599990844726562, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b82", + "roundness": null, + "seed": 1975077171, + "version": 334, + "versionNonce": 2095784979, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "2", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mRtP3rW1Ev3NyaZVUD-3M", + "type": "text", + "x": 1077.7859026777692, + "y": 534.5946051741339, + "width": 17.02398681640625, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b83", + "roundness": null, + "seed": 213887699, + "version": 310, + "versionNonce": 1253255603, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false, + "text": "3", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UBuIXa1b0qeKuQ-riAVIu", + "type": "ellipse", + "x": 759.2675360884357, + "y": 852.2183281672253, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b84", + "roundness": { + "type": 2 + }, + "seed": 1674106995, + "version": 367, + "versionNonce": 1487502163, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "DoU8rxRvpUq5MLUrTYL3c", + "type": "ellipse", + "x": 891.0460937975554, + "y": 962.1994463295424, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b85", + "roundness": { + "type": 2 + }, + "seed": 144396819, + "version": 428, + "versionNonce": 589601011, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "yY_JXLWIk_K5tqXTfa2uK", + "type": "ellipse", + "x": 1093.4017190918723, + "y": 950.9721708834724, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b86", + "roundness": { + "type": 2 + }, + "seed": 204314547, + "version": 496, + "versionNonce": 1470825107, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "CdVHNikN5wZuN_G1_Jm-I", + "type": "ellipse", + "x": 1042.4528024394021, + "y": 608.1000475051412, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b87", + "roundness": { + "type": 2 + }, + "seed": 480651603, + "version": 434, + "versionNonce": 787691571, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "UPH61QDq-ZjDd-h8jlNSU", + "type": "ellipse", + "x": 1172.9627034862467, + "y": 729.2194009080924, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b88", + "roundness": { + "type": 2 + }, + "seed": 1599833843, + "version": 390, + "versionNonce": 115587539, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "dZ0aEZY6HaODKo61ucR78", + "type": "rectangle", + "x": 810.830605243839, + "y": 868.7838431084679, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b89", + "roundness": { + "type": 3 + }, + "seed": 181678227, + "version": 332, + "versionNonce": 1016268659, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "9Oam_fy_5_qaA-aBlbwSV", + "type": "rectangle", + "x": 806.2255242592548, + "y": 863.1895894992579, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8A", + "roundness": { + "type": 3 + }, + "seed": 1086760499, + "version": 344, + "versionNonce": 1179099411, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "vmQaw83KVGpYyNRbPtki6", + "type": "rectangle", + "x": 818.1935919876223, + "y": 876.6451169321033, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8B", + "roundness": { + "type": 3 + }, + "seed": 672753619, + "version": 406, + "versionNonce": 225969843, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "yt5zH5LwABAjtltXK-Df5", + "type": "rectangle", + "x": 782.592570410053, + "y": 895.9961486874515, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8C", + "roundness": { + "type": 3 + }, + "seed": 1189279091, + "version": 420, + "versionNonce": 147503187, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "IyzzBOFsKCNJXoKAGrwsb", + "type": "rectangle", + "x": 776.9020259396061, + "y": 890.6925718428477, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8D", + "roundness": { + "type": 3 + }, + "seed": 476696339, + "version": 374, + "versionNonce": 370554355, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "TRx5f7ejGGApFI7t5HYzb", + "type": "rectangle", + "x": 813.2783080004572, + "y": 894.2057608021289, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8E", + "roundness": { + "type": 3 + }, + "seed": 2065986739, + "version": 336, + "versionNonce": 341901203, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "YHOYFe_YQCL-S2iwtn5dK", + "type": "rectangle", + "x": 929.5938851246096, + "y": 994.4869237609175, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8F", + "roundness": { + "type": 3 + }, + "seed": 582575699, + "version": 396, + "versionNonce": 1038193971, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "HZPTgXjzq7Ty_EyuRXcYe", + "type": "rectangle", + "x": 940.2766758240202, + "y": 975.0042430324053, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8G", + "roundness": { + "type": 3 + }, + "seed": 436151283, + "version": 365, + "versionNonce": 1107195603, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "fGbgSxtKP6_G38S1FLZMz", + "type": "rectangle", + "x": 952.244743552388, + "y": 988.4597704652508, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8H", + "roundness": { + "type": 3 + }, + "seed": 1224486291, + "version": 427, + "versionNonce": 525214835, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "Goc7QqKKnS3wliNzJpzrf", + "type": "rectangle", + "x": 916.6437219748184, + "y": 1007.810802220599, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8I", + "roundness": { + "type": 3 + }, + "seed": 1390871347, + "version": 441, + "versionNonce": 1033313811, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "TUFby3xlQDCcsjcDf67Go", + "type": "rectangle", + "x": 910.9531775043713, + "y": 1002.5072253759952, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8J", + "roundness": { + "type": 3 + }, + "seed": 807806163, + "version": 395, + "versionNonce": 1204806579, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "b762viWDRis73vviuF64q", + "type": "rectangle", + "x": 947.3294595652226, + "y": 1006.0204143352764, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8K", + "roundness": { + "type": 3 + }, + "seed": 139465331, + "version": 357, + "versionNonce": 1176434003, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "YiJTdyoEo90WZAuPKCOJd", + "type": "rectangle", + "x": 1132.7638157766175, + "y": 984.0427735579389, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8L", + "roundness": { + "type": 3 + }, + "seed": 1277905939, + "version": 470, + "versionNonce": 2010829555, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "db2Lpa-8FK9mUmnGBHXJM", + "type": "rectangle", + "x": 1127.0732713061711, + "y": 978.739196713335, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8M", + "roundness": { + "type": 3 + }, + "seed": 263082419, + "version": 424, + "versionNonce": 1837759635, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "td3vm827hcxxNztreX7Gg", + "type": "rectangle", + "x": 1238.6723491824562, + "y": 755.5913997613773, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8N", + "roundness": { + "type": 3 + }, + "seed": 603956051, + "version": 440, + "versionNonce": 1659040307, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839359, + "link": null, + "locked": false + }, + { + "id": "FEJBINKFQHQnqOVqlNYHx", + "type": "rectangle", + "x": 1203.071327604887, + "y": 774.9424315167255, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8O", + "roundness": { + "type": 3 + }, + "seed": 1903542515, + "version": 454, + "versionNonce": 1489777619, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "yuHEk8qSEcl_N5Lzw5KsH", + "type": "rectangle", + "x": 1197.3807831344404, + "y": 769.6388546721216, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8P", + "roundness": { + "type": 3 + }, + "seed": 295119507, + "version": 408, + "versionNonce": 1868317043, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "HsXEO0avLAkvq-L1tGCem", + "type": "rectangle", + "x": 1233.7570651952913, + "y": 773.1520436314029, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8Q", + "roundness": { + "type": 3 + }, + "seed": 689594419, + "version": 370, + "versionNonce": 2144967443, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "qNesuF3NbwBOtxirxtdvi", + "type": "rectangle", + "x": 1100.548760925171, + "y": 623.1742587536826, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8R", + "roundness": { + "type": 3 + }, + "seed": 31842771, + "version": 373, + "versionNonce": 1991950515, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "wtm5g1qyeRefkiHoIBNpP", + "type": "rectangle", + "x": 1095.943679940587, + "y": 617.5800051444728, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8S", + "roundness": { + "type": 3 + }, + "seed": 1695559539, + "version": 385, + "versionNonce": 1839608403, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "IvpCO85Lo0wEUAcAKnWox", + "type": "rectangle", + "x": 1107.9117476689546, + "y": 631.0355325773182, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8T", + "roundness": { + "type": 3 + }, + "seed": 887081235, + "version": 447, + "versionNonce": 91385843, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "KC7wMOUgKlzlX0w7Q-LMA", + "type": "rectangle", + "x": 1102.950080575952, + "y": 648.5961764473439, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8U", + "roundness": { + "type": 3 + }, + "seed": 1187720883, + "version": 378, + "versionNonce": 2488723, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "4mqN35uuRXaEeNlaqTH3N", + "type": "rectangle", + "x": 1089.5387368309769, + "y": 631.6926219260015, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8V", + "roundness": { + "type": 3 + }, + "seed": 2105073747, + "version": 392, + "versionNonce": 452415283, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "jabc7Md5sDxJnaiwVTf-R", + "type": "ellipse", + "x": 1528.4967532985086, + "y": 823.5130476967427, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8W", + "roundness": { + "type": 2 + }, + "seed": 582966771, + "version": 455, + "versionNonce": 676131027, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "SZI3WE7wATC01wNCUjzXL", + "type": "ellipse", + "x": 1660.2753110076285, + "y": 933.4941658590598, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8X", + "roundness": { + "type": 2 + }, + "seed": 27600787, + "version": 516, + "versionNonce": 1774018163, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "qDIIf3sr9GTWruKT-Rzcf", + "type": "ellipse", + "x": 1862.6309363019457, + "y": 922.2668904129897, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8Y", + "roundness": { + "type": 2 + }, + "seed": 1080081715, + "version": 578, + "versionNonce": 705632275, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "Tzu5_pxGjV0xnsQA8lWWi", + "type": "ellipse", + "x": 1812.1106732570668, + "y": 579.3947670346586, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8Z", + "roundness": { + "type": 2 + }, + "seed": 2052628179, + "version": 515, + "versionNonce": 389586355, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "Nrf3X_foSa1wu-BDRpyf3", + "type": "ellipse", + "x": 1942.1919206963196, + "y": 700.5141204376098, + "width": 90.74748361774482, + "height": 58.01946787355587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8a", + "roundness": { + "type": 2 + }, + "seed": 438520947, + "version": 478, + "versionNonce": 1549823827, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "PwRc8NA4p20DyU-QOf_K0", + "type": "rectangle", + "x": 1580.059822453912, + "y": 840.0785626379854, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8b", + "roundness": { + "type": 3 + }, + "seed": 1938245139, + "version": 420, + "versionNonce": 2078084339, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "9u6MEDMiTcEwwU3_OlvSv", + "type": "rectangle", + "x": 1575.4547414693282, + "y": 834.4843090287752, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8c", + "roundness": { + "type": 3 + }, + "seed": 494603187, + "version": 432, + "versionNonce": 1765078675, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "jj-YrLNRqanvJuGhAhO8d", + "type": "rectangle", + "x": 1587.4228091976954, + "y": 847.9398364616206, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8d", + "roundness": { + "type": 3 + }, + "seed": 203758931, + "version": 494, + "versionNonce": 1662954547, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "ZLffjg1fFP1YAuw3Rshm6", + "type": "rectangle", + "x": 1551.8217876201263, + "y": 867.2908682169689, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8e", + "roundness": { + "type": 3 + }, + "seed": 1792801523, + "version": 508, + "versionNonce": 226536915, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "BQbx8a7Hl8XXr0y9h3-dD", + "type": "rectangle", + "x": 1546.1312431496792, + "y": 861.987291372365, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8f", + "roundness": { + "type": 3 + }, + "seed": 908469395, + "version": 462, + "versionNonce": 1265728371, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "hNuoBjuMmXkm2feGsYxro", + "type": "rectangle", + "x": 1582.50752521053, + "y": 865.5004803316463, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8g", + "roundness": { + "type": 3 + }, + "seed": 364517939, + "version": 424, + "versionNonce": 1496814867, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "RxRAyqbkXLbedPcSqGVcD", + "type": "rectangle", + "x": 1698.8231023346827, + "y": 965.781643290435, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8h", + "roundness": { + "type": 3 + }, + "seed": 1987992531, + "version": 484, + "versionNonce": 642349747, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "raQp6nDDhWYOSjXT4RGNR", + "type": "rectangle", + "x": 1709.505893034093, + "y": 946.2989625619226, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8i", + "roundness": { + "type": 3 + }, + "seed": 1686727027, + "version": 453, + "versionNonce": 1867361363, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "_cX9Gf-70SFz_jIFk3haL", + "type": "rectangle", + "x": 1721.4739607624608, + "y": 959.754489994768, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8j", + "roundness": { + "type": 3 + }, + "seed": 622969619, + "version": 515, + "versionNonce": 404400627, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "jKAUwKWnxciIW6BX7jyTG", + "type": "rectangle", + "x": 1685.8729391848913, + "y": 979.1055217501165, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8k", + "roundness": { + "type": 3 + }, + "seed": 280881331, + "version": 529, + "versionNonce": 1169617811, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "-K4sPU6oUSW9xv8cdWkdV", + "type": "rectangle", + "x": 1680.1823947144442, + "y": 973.8019449055126, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8l", + "roundness": { + "type": 3 + }, + "seed": 755259987, + "version": 483, + "versionNonce": 945359155, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "V2PmdGz8LznJx21AlUzuo", + "type": "rectangle", + "x": 1716.558676775296, + "y": 977.3151338647939, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8m", + "roundness": { + "type": 3 + }, + "seed": 114006003, + "version": 445, + "versionNonce": 1701276371, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "KYFPF13V7ieA-1BGTxVSz", + "type": "rectangle", + "x": 1901.9930329866909, + "y": 955.3374930874562, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8n", + "roundness": { + "type": 3 + }, + "seed": 1276780947, + "version": 558, + "versionNonce": 1366857843, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "t3YRN5lrwfChGAzCLjAvr", + "type": "rectangle", + "x": 1896.3024885162442, + "y": 950.0339162428523, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8o", + "roundness": { + "type": 3 + }, + "seed": 640055091, + "version": 512, + "versionNonce": 710087187, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "rbuigerO1z1rV_Pj64qx9", + "type": "rectangle", + "x": 2007.9015663925295, + "y": 726.8861192908946, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8p", + "roundness": { + "type": 3 + }, + "seed": 1398216915, + "version": 528, + "versionNonce": 552425395, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "Rrcb0EVB0_fP1JJnVvfw0", + "type": "rectangle", + "x": 1972.30054481496, + "y": 746.2371510462428, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8q", + "roundness": { + "type": 3 + }, + "seed": 21137011, + "version": 542, + "versionNonce": 57534803, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "ATPGpNeoeiDiUNdl1yhE-", + "type": "rectangle", + "x": 1966.6100003445138, + "y": 740.933574201639, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8r", + "roundness": { + "type": 3 + }, + "seed": 1722761235, + "version": 496, + "versionNonce": 388712179, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "RBZv8zHWCbEgKGcsghqML", + "type": "rectangle", + "x": 2002.9862824053646, + "y": 744.4467631609202, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8s", + "roundness": { + "type": 3 + }, + "seed": 496223667, + "version": 458, + "versionNonce": 850129043, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "oMyw3MlTCWYaXfoynb4g4", + "type": "rectangle", + "x": 1869.777978135244, + "y": 594.4689782831999, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8t", + "roundness": { + "type": 3 + }, + "seed": 1024890707, + "version": 461, + "versionNonce": 396781107, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "_NyAxf6enZgTte0UTNbR4", + "type": "rectangle", + "x": 1865.1728971506602, + "y": 588.8747246739902, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8u", + "roundness": { + "type": 3 + }, + "seed": 864957683, + "version": 473, + "versionNonce": 218179539, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "BEM4Z1skupWybLEkHgd0y", + "type": "rectangle", + "x": 1877.140964879028, + "y": 602.3302521068356, + "width": 4.907332597593041, + "height": 1.7532814006523263, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8v", + "roundness": { + "type": 3 + }, + "seed": 1619074707, + "version": 535, + "versionNonce": 953333107, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "bORniB0YqgBM3RMCtbsf8", + "type": "rectangle", + "x": 1872.1792977860252, + "y": 619.8908959768612, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8w", + "roundness": { + "type": 3 + }, + "seed": 1856361523, + "version": 466, + "versionNonce": 979472147, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "dwlSJO1-Lr7Igyghv8JLz", + "type": "rectangle", + "x": 1858.7679540410502, + "y": 602.9873414555188, + "width": 4.907332597593041, + "height": 1.7519561690570522, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8x", + "roundness": { + "type": 3 + }, + "seed": 1843582419, + "version": 480, + "versionNonce": 69481651, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false + }, + { + "id": "xnjkmVX7zBZVw9C0qHD21", + "type": "arrow", + "x": 1392.135609585854, + "y": 1049.955975206649, + "width": 154.85241376508543, + "height": 293.11223798872857, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8y", + "roundness": { + "type": 2 + }, + "seed": 760128371, + "version": 815, + "versionNonce": 1975592531, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 111.05220927949313, + -67.64874577655996 + ], + [ + 154.85241376508543, + -175.53584366105952 + ], + [ + 40.89077061275725, + -293.11223798872857 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "b5SET5jHtKd-m_kKo8r9-", + "type": "arrow", + "x": 1506.1148856707448, + "y": 1121.8542577308046, + "width": 341.02973222769674, + "height": 133.9397557457969, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b8z", + "roundness": { + "type": 2 + }, + "seed": 1429191955, + "version": 872, + "versionNonce": 906945523, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 154.77306556855365, + -133.9397557457969 + ], + [ + 306.07244342226727, + -51.435264285214544 + ], + [ + 341.02973222769674, + -2.662572816958118 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "38XPTgRZ6PTEKI50YrTqV", + "type": "arrow", + "x": 1397.409380681872, + "y": 602.9703965827928, + "width": 696.6242667521326, + "height": 515.534049333842, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b90", + "roundness": { + "type": 2 + }, + "seed": 1090298547, + "version": 687, + "versionNonce": 1293151635, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 258.34009497520674, + 66.22929470526765 + ], + [ + 485.32001938776216, + 317.9217741043599 + ], + [ + 696.6242667521326, + 515.534049333842 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "cxLCitgr-qlfizQ-SYHTO", + "type": "arrow", + "x": 1419.0258317438763, + "y": 1123.4764875265678, + "width": 701.8259818581105, + "height": 367.6113780658734, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b91", + "roundness": { + "type": 2 + }, + "seed": 425448531, + "version": 555, + "versionNonce": 2114372403, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 436.5208785206619, + -367.6113780658734 + ], + [ + 701.8259818581105, + -340.35086432403523 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "h8_v75GZGWd4ix3u6hRVW", + "type": "arrow", + "x": 1711.714117221207, + "y": 1119.3239319080665, + "width": 177.59889677088813, + "height": 589.2749733107933, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b92", + "roundness": { + "type": 2 + }, + "seed": 774099443, + "version": 545, + "versionNonce": 1632494803, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 98.7885046821782, + -147.65817727952913 + ], + [ + 144.07869196931347, + -473.0298653916034 + ], + [ + -33.520204801574664, + -589.2749733107933 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "amOkHN2BNeOxr1dSYy666", + "type": "line", + "x": 1607.2309374511917, + "y": 804.0118318229775, + "width": 76.13018633918864, + "height": 96.59320457812987, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b93", + "roundness": null, + "seed": 274406291, + "version": 240, + "versionNonce": 1048564339, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -76.13018633918864, + 96.59320457812987 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "bYCJhpny-jdexsG96oX8B", + "type": "line", + "x": 1517.1002026572685, + "y": 808.2790015031358, + "width": 92.44064895962879, + "height": 89.32843636232315, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b94", + "roundness": null, + "seed": 1815621939, + "version": 259, + "versionNonce": 644025363, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 92.44064895962879, + 89.32843636232315 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "jeHlYb8Z4jRpn5KkBYK8T", + "type": "line", + "x": 1736.3717917984652, + "y": 922.0731317961182, + "width": 61.69195309784608, + "height": 80.75001467059974, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b95", + "roundness": null, + "seed": 589402835, + "version": 402, + "versionNonce": 1290670515, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -61.69195309784608, + 80.75001467059974 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "IOMC3UwMT9JhWsNIBgrrE", + "type": "line", + "x": 1663.3345206323645, + "y": 925.6404015205222, + "width": 74.90910575922612, + "height": 74.6768116687219, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b96", + "roundness": null, + "seed": 632143987, + "version": 421, + "versionNonce": 591881043, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 74.90910575922612, + 74.6768116687219 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "qoBk0ZsNExU-QiCE-iWJd", + "type": "line", + "x": 1944.354435491349, + "y": 905.6216057151779, + "width": 61.69195309784608, + "height": 80.75001467059974, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b97", + "roundness": null, + "seed": 228801043, + "version": 459, + "versionNonce": 835027187, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -61.69195309784608, + 80.75001467059974 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Za1FGjSU3hx-j8TgtJKXX", + "type": "line", + "x": 1871.3171643252474, + "y": 909.1888754395819, + "width": 74.90910575922612, + "height": 74.6768116687219, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b98", + "roundness": null, + "seed": 2012774323, + "version": 478, + "versionNonce": 837741203, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 74.90910575922612, + 74.6768116687219 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Uknu8r0enr5iPg2RVXkWY", + "type": "line", + "x": 2022.6843301677266, + "y": 686.096003543478, + "width": 61.69195309784608, + "height": 80.75001467059974, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b99", + "roundness": null, + "seed": 517214547, + "version": 424, + "versionNonce": 1752834099, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -61.69195309784608, + 80.75001467059974 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "IEQ0cH3_mkuMu1S38Jy-A", + "type": "line", + "x": 1949.6470590016254, + "y": 689.663273267882, + "width": 74.90910575922612, + "height": 74.6768116687219, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b9A", + "roundness": null, + "seed": 864841459, + "version": 443, + "versionNonce": 1062052307, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 74.90910575922612, + 74.6768116687219 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "maByFZXlzPdZuDQcRcHOL", + "type": "line", + "x": 1890.9442827591186, + "y": 566.4036573082926, + "width": 61.69195309784608, + "height": 80.75001467059974, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b9B", + "roundness": null, + "seed": 2024282259, + "version": 455, + "versionNonce": 528478067, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -61.69195309784608, + 80.75001467059974 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "XLtwJNXVDH5VubCsORElQ", + "type": "line", + "x": 1817.9070115930178, + "y": 569.9709270326966, + "width": 74.90910575922612, + "height": 74.6768116687219, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b9C", + "roundness": null, + "seed": 467504691, + "version": 474, + "versionNonce": 190286099, + "isDeleted": false, + "boundElements": [], + "updated": 1766926839360, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 74.90910575922612, + 74.6768116687219 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#1b1d27" + }, + "files": {} +} \ No newline at end of file diff --git a/.videos/1/animations/3.excalidraw b/.videos/1/animations/3.excalidraw new file mode 100644 index 0000000..16c44a7 --- /dev/null +++ b/.videos/1/animations/3.excalidraw @@ -0,0 +1,721 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "HiVK1huIbL16ZCy3rz5t8", + "type": "rectangle", + "x": 1622.7441591132324, + "y": 984.6777917946865, + "width": 1578.7433546522943, + "height": 836.7851776620863, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2L", + "roundness": { + "type": 3 + }, + "seed": 645107296, + "version": 227, + "versionNonce": 1642809248, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false + }, + { + "id": "lTQAmT-q3EhB8l4OFoV4r", + "type": "rectangle", + "x": 2308.0518724509566, + "y": 1544.7916707023237, + "width": 211.02211156486123, + "height": 96.5527520526872, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2M", + "roundness": { + "type": 3 + }, + "seed": 28492384, + "version": 449, + "versionNonce": 702648928, + "isDeleted": false, + "boundElements": [ + { + "id": "23RNiECmee0GZfyG42WJU", + "type": "arrow" + }, + { + "id": "AS-wLfqmrJICLegtTjwKA", + "type": "arrow" + } + ], + "updated": 1766927996013, + "link": null, + "locked": false + }, + { + "id": "9aRWFt8Ol6hDDEvOstOxf", + "type": "text", + "x": 2340.7060558234443, + "y": 1563.9495282342684, + "width": 154.26666259765625, + "height": 55.62747030529269, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2N", + "roundness": null, + "seed": 384530016, + "version": 204, + "versionNonce": 2083905440, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "Mission", + "fontSize": 44.50197624423415, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Mission", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "23RNiECmee0GZfyG42WJU", + "type": "arrow", + "x": 2519.9815623115946, + "y": 1608.9632387014556, + "width": 185.6851361459012, + "height": 84.58953522783993, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2O", + "roundness": { + "type": 2 + }, + "seed": 1793960544, + "version": 1436, + "versionNonce": 1331590752, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 132.75987383519941, + -15.5442452755197 + ], + [ + 185.6851361459012, + -84.58953522783993 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lTQAmT-q3EhB8l4OFoV4r", + "focus": 0.46767568934546344, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "K6jAODe27_os5DPh8967u", + "type": "text", + "x": 2689.444812908036, + "y": 1465.552661128815, + "width": 222.53535431824844, + "height": 54.779302679674046, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2P", + "roundness": null, + "seed": 1753833056, + "version": 808, + "versionNonce": 1186625440, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "The Story", + "fontSize": 43.823442143739236, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "The Story", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AS-wLfqmrJICLegtTjwKA", + "type": "arrow", + "x": 2384.330334167984, + "y": 1544.3197414150743, + "width": 49.364397989861686, + "height": 80.37199821269722, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Q", + "roundness": { + "type": 2 + }, + "seed": 546214496, + "version": 1667, + "versionNonce": 1614569056, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -38.3710655807796, + -28.81586470940509 + ], + [ + -49.364397989861686, + -80.37199821269722 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lTQAmT-q3EhB8l4OFoV4r", + "focus": 0.21013738563944281, + "gap": 1 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "m8Er51Ess3j92_Q_brntE", + "type": "rectangle", + "x": 2159.6497125177334, + "y": 1335.721614644765, + "width": 363.99766551946664, + "height": 127.50624664551411, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "cNSAgbnsi3PlOKVDl2tCl" + ], + "frameId": null, + "index": "b2R", + "roundness": { + "type": 3 + }, + "seed": 164447840, + "version": 969, + "versionNonce": 2063142816, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false + }, + { + "id": "XCGW5ooPSVuaaam9AVDz-", + "type": "text", + "x": 2173.9396997857207, + "y": 1357.9865705806305, + "width": 333.6248911062344, + "height": 83.92658771184712, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "cNSAgbnsi3PlOKVDl2tCl" + ], + "frameId": null, + "index": "b2S", + "roundness": null, + "seed": 1091926624, + "version": 1089, + "versionNonce": 1148591008, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "Spearhead", + "fontSize": 67.14127016947768, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Spearhead", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "moW1_uGfHzYIjzGogGQGK", + "type": "text", + "x": 2104.0596241560615, + "y": 1034.5614167492809, + "width": 646.7199096679688, + "height": 64.22500341608406, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2T", + "roundness": null, + "seed": 1228353120, + "version": 349, + "versionNonce": 1920051104, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "Mission making, made easy", + "fontSize": 51.380002732867254, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Mission making, made easy", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "o2jZSQLCW3jrv6pCqie6_", + "type": "arrow", + "x": 2159.733022744733, + "y": 1387.9176228888964, + "width": 160.53319080851742, + "height": 70.53888252157658, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2U", + "roundness": { + "type": 2 + }, + "seed": 1258447456, + "version": 260, + "versionNonce": 1897640864, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -92.03884598362902, + -5.663893806853778 + ], + [ + -160.53319080851742, + -70.53888252157658 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "W9vcoug4Anqo3kphgtT9I", + "type": "text", + "x": 1878.031940531582, + "y": 1271.37874036732, + "width": 241.1999053955078, + "height": 45, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2V", + "roundness": null, + "seed": 1430722144, + "version": 123, + "versionNonce": 648298400, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "quick creation", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "quick creation", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vKiHSOYVz3WA8hsPa4Gz_", + "type": "text", + "x": 2048.097445465383, + "y": 1156.4671681391064, + "width": 291.2398681640625, + "height": 45, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2W", + "roundness": null, + "seed": 483740256, + "version": 118, + "versionNonce": 859524000, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "multiplayer ready", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "multiplayer ready", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "slm2yLO4dbFEB4unTSEBM", + "type": "arrow", + "x": 2272.711713817616, + "y": 1335.0347744783633, + "width": 66.5822620861594, + "height": 126.32077628211141, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2X", + "roundness": { + "type": 2 + }, + "seed": 1014824544, + "version": 263, + "versionNonce": 823187360, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -54.89666258783586, + -52.65193572538732 + ], + [ + -66.5822620861594, + -126.32077628211141 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "AzL0eyJGalMEJhcGJm2_F", + "type": "arrow", + "x": 2416.5200398307725, + "y": 1335.3880374127152, + "width": 114.58165799006088, + "height": 125.00113779000418, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Y", + "roundness": { + "type": 2 + }, + "seed": 1963864672, + "version": 298, + "versionNonce": 1951720352, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 81.1107899245286, + -56.913107137971394 + ], + [ + 114.58165799006088, + -125.00113779000418 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9XYksy7fqu89wA1b8KHk4", + "type": "text", + "x": 2479.4611352261527, + "y": 1164.386899622711, + "width": 122.79595947265625, + "height": 45, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2Z", + "roundness": null, + "seed": 1834542688, + "version": 150, + "versionNonce": 1261924256, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "flexible", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "flexible", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "O8kJBNxfzL8ncxdD2kZRM", + "type": "arrow", + "x": 2527.9914421715134, + "y": 1376.2823093418706, + "width": 161.921133337549, + "height": 61.23797674760587, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2a", + "roundness": { + "type": 2 + }, + "seed": 1915558496, + "version": 341, + "versionNonce": 1038646176, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 110.30502983196084, + -8.630813890686284 + ], + [ + 161.921133337549, + -61.23797674760587 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1SS8AR95vxynNN_GgSOm-", + "type": "text", + "x": 2670.559620709462, + "y": 1266.635895233043, + "width": 207.61192321777344, + "height": 45, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2b", + "roundness": null, + "seed": 911920736, + "version": 322, + "versionNonce": 1318586272, + "isDeleted": false, + "boundElements": [], + "updated": 1766927996013, + "link": null, + "locked": false, + "text": "easy to use", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "easy to use", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#1b1d27" + }, + "files": {} +} \ No newline at end of file diff --git a/DcsTypes.lua b/DcsTypes.lua index e9912dc..38de46f 100644 --- a/DcsTypes.lua +++ b/DcsTypes.lua @@ -53,6 +53,83 @@ do -- env env = env end +do -- Mission table + + ---@class Mission + ---@field drawings Array + + ---@alias PrimitiveType + ---| "Polygon" + ---| "Line" + ---| "TextBox" + + ---@alias PolygonMode + ---| "circle" + ---| "free" + ---| "oval" + ---| "rect" + ---| "arrow" + + ---@alias LineMode + ---| "segment" + ---| "segments" + ---| "free" + + ---@class DrawingObject + ---@field primitiveType PrimitiveType + ---@field name string + ---@field visible boolean + ---@field layerName string? + ---@field mapX number + ---@field mapY number + ---@field colorString string Hex ARGB color + ---@field style string + ---@field thickness number + + ---@class Polygon : DrawingObject + ---@field polygonMode PolygonMode + ---@field fillColorString string? + + ---@class Circle : Polygon + ---@field radius number + + ---@class Free : Polygon + ---@field points Array + + ---@class Oval : Polygon + ---@field r1 number + ---@field r2 number + ---@field angle number? + + ---@class Rect : Polygon + ---@field width number + ---@field height number + ---@field angle number? + + ---@class Arrow : Polygon + ---@field length number + ---@field angle number? + + ---@class Line : DrawingObject + ---@field primitiveType PrimitiveType # PrimitiveType.Line + ---@field lineMode LineMode + ---@field closed boolean + ---@field points Array + + ---@class Segment : Line + + ---@class Segments : Line + + ---@class FreeLine : Line + + ---@class TextBox : DrawingObject + ---@field fontSize number + ---@field text string + ---@field fillColorString string + ---@field borderThickness number + +end + do -- timer ---@class timer ---@field getTime fun() : number returns the time in the mission (in seconds. 3 decimals) @@ -358,7 +435,7 @@ do -- trigger ---@field circleToAll fun(coalition: DrawCoalition, id: number, center: Vec3 , radius: number, color: table , fillColor: table , lineType: LineType , readOnly: boolean?, message: string?) Creates a circle on the map with a given radius, color, fill color, and outline. ---@field rectToAll fun(coalition:DrawCoalition, id:number, startPoint: Vec3, endPoint:Vec3, color: table, fillColor: table, lineType: LineType , readOnly: boolean?, message: string?) Creates a rectangle on the map from the startpoint in one corner to the endPoint in the opposite corner. ---@field quadToAll fun(coalition:DrawCoalition, id:number, point1: Vec3, point2:Vec3, point3:Vec3, point4:Vec3,color: table, fillColor: table, lineType: LineType , readOnly: boolean?, message: string?) Creates a shape defined by the 4 points on the F10 map. - ---@field textToAll fun(coalition:DrawCoalition, id: number, point:Vec3, color: table, fillColor: table, fontSize:table, readOnly:boolean, text:string) Creates a text imposed on the map at a given point. Text scales with the map. + ---@field textToAll fun(coalition:DrawCoalition, id: number, point:Vec3, color: table, fillColor: table, fontSize:number, readOnly:boolean, text:string) Creates a text imposed on the map at a given point. Text scales with the map. ---@field arrowToAll fun(coalition:DrawCoalition, id: number, startPoint:Vec3, endPoint:Vec3, color:table, fillColor:table, lineType:LineType, readonly:boolean?, message: string?) Creates an arrow from the startPoint to the endPoint on the F10 map. The arrow will be "pointing at" the startPoint ---@field setMarkupRadius fun(id:number, radius:number) Updates the radius of the specified mark to be the new value. ---@field setMarkupText fun(id:number, text: string) Updates the text value of the passed mark to the passed text value. diff --git a/_docs/js/components/header.js b/_docs/js/components/header.js index 8dadac3..ed88d76 100644 --- a/_docs/js/components/header.js +++ b/_docs/js/components/header.js @@ -18,8 +18,9 @@ class Header extends HTMLElement { Tutorials diff --git a/_docs/pages/about_us.html b/_docs/pages/about_us.html index 0e66e7c..298cd7b 100644 --- a/_docs/pages/about_us.html +++ b/_docs/pages/about_us.html @@ -63,5 +63,4 @@ - -``` \ No newline at end of file + \ No newline at end of file diff --git a/_docs/pages/advanced/CAP.html b/_docs/pages/advanced/CAP.html index 50c2462..1b44f31 100644 --- a/_docs/pages/advanced/CAP.html +++ b/_docs/pages/advanced/CAP.html @@ -220,5 +220,4 @@ - -``` \ No newline at end of file + \ No newline at end of file diff --git a/_docs/pages/advanced/custom-drawings.html b/_docs/pages/advanced/custom-drawings.html new file mode 100644 index 0000000..cbe1752 --- /dev/null +++ b/_docs/pages/advanced/custom-drawings.html @@ -0,0 +1,65 @@ + + + + + + + Spearhead Missions + + + + + + + +
+ +
+
+
+ + +
+

Advanced Tutorial: Custom Drawings

+ +

+ Drawings can be very powerful in DCS missions.
+ They can guide players towards the right objectives or warn them of dangers ahead.
+ In Spearhead, we provide an easy way to manage and update these drawings dynamically as the mission progresses.
+

+ +

How to

+

+ Adding a custom drawing is easy.
+ Simply create the drawing and then name it according to the following convention:
+ DRAWING_[a]:[b]_[FreeForm]
+ Where: +

    +
  • [a] is the stage number at which the drawing should appear.
  • +
  • [b] is the stage number at which the drawing should be removed again.
  • +
  • [FreeForm] is any name you want to make it unique or findables.
  • +
+

+ + + The custom drawings need to be in the "Author" layer of the mission editor to be managed by Spearhead. + This is due to other layers being visible by default and cannot be as easily removed when not needed. + The author layer is not visible by default in multiplayer, making it perfect for this use case. + + + +
+
+ +
+
+

© 2025 Spearhead Project

+
+ + + \ No newline at end of file diff --git a/_docs/pages/advanced/missions.html b/_docs/pages/advanced/missions.html index 6539b74..49c07bb 100644 --- a/_docs/pages/advanced/missions.html +++ b/_docs/pages/advanced/missions.html @@ -68,5 +68,4 @@ - -``` \ No newline at end of file + \ No newline at end of file diff --git a/_docs/pages/persistence.html b/_docs/pages/persistence.html index ec9e95a..fca45ac 100644 --- a/_docs/pages/persistence.html +++ b/_docs/pages/persistence.html @@ -123,4 +123,3 @@ -``` \ No newline at end of file diff --git a/_docs/style/style.css b/_docs/style/style.css index d5f589f..6df6800 100644 --- a/_docs/style/style.css +++ b/_docs/style/style.css @@ -270,11 +270,11 @@ header nav a:hover::after { border-radius: 8px; max-height: 0px; - transition: all 1.5s ease; + transition: all 1s ease; } .dropdown:hover .dropdown-content { - max-height: 200px; + max-height: 100vh; } header.collapsible { diff --git a/classes/spearhead_db.lua b/classes/spearhead_db.lua index e603f97..d29b4a6 100644 --- a/classes/spearhead_db.lua +++ b/classes/spearhead_db.lua @@ -20,7 +20,7 @@ ---@field MissionZoneData table ---@field FarpZoneData table ---@field missionCodes table - +---@field CustomDrawings Array ---@class CapRoute ---@field zones Array @@ -99,7 +99,8 @@ function Database.New(Logger) MissionZoneData = {}, FarpZoneData = {}, missionCodes = {}, - SupplyHubZones = {} + SupplyHubZones = {}, + CustomDrawings = {} } Database.__index = Database @@ -215,6 +216,23 @@ function Database.New(Logger) end end + ---@type table + do -- custom drawings + if env.mission.drawings and env.mission.drawings.layers then + for i, layer in pairs(env.mission.drawings.layers) do + if string.lower(layer.name) == "author" then + for key, layer_object in pairs(layer.objects) do + if Spearhead.Util.startswith(layer_object.name, "drawing_", true) then + local object = layer_object --[[@as DrawingObject]] + local customDrawing = Spearhead.classes.stageClasses.drawings.CustomDrawing.New(object) + table.insert(self._tables.CustomDrawings, customDrawing) + end + end + end + end + end + end + ---@type table local availableSupplyHubs = {} for _, supplyHubZoneName in pairs(self._tables.SupplyHubZones) do @@ -593,6 +611,14 @@ function Database:loadBlueSamUnits() end end +---@return Array +function Database:getCustomDrawings() + if self._tables.CustomDrawings == nil then + return {} + end + return self._tables.CustomDrawings +end + ---Loads all units, data and briefings ---@private function Database:LoadZoneData(missionZoneName) diff --git a/classes/stageClasses/GlobalStageManager.lua b/classes/stageClasses/GlobalStageManager.lua index a627b95..54f9c80 100644 --- a/classes/stageClasses/GlobalStageManager.lua +++ b/classes/stageClasses/GlobalStageManager.lua @@ -13,8 +13,12 @@ local WaitingStagesByIndex = {} local currentStage = -99 - -GlobalStageManager = {} +---@class GlobalStageManager : StageCompleteListener +---@field private database Database +---@field private logger Logger +---@field private stageConfig StageConfig +local GlobalStageManager = {} +GlobalStageManager.__index = GlobalStageManager ---comment ---@param database Database @@ -22,13 +26,14 @@ GlobalStageManager = {} ---@param logLevel LogLevel ---@param spawnManager SpawnManager ---@return nil -function GlobalStageManager:NewAndStart(database, stageConfig, logLevel, spawnManager) +function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnManager) local logger = Spearhead.LoggerTemplate.new("StageManager", logLevel) logger:info("Using Stage Log Level: " .. logLevel) - local o = {} - setmetatable(o, { __index = self }) + local self = setmetatable({}, GlobalStageManager) + self.database = database + self.stageConfig = stageConfig - o.logger = logger + self.logger = logger if stageConfig.isAutoStages ~= true then logger:warn("Spearhead will not automatically progress stages due to the given settings. If you manually have implemented this, please ignore this message") end @@ -42,53 +47,6 @@ function GlobalStageManager:NewAndStart(database, stageConfig, logLevel, spawnMa Spearhead.Events.AddStageNumberChangedListener(OnStageNumberChangedListener) - ---@type StageCompleteListener - local OnStageCompleteListener = { - OnStageComplete = function(self, stage) - logger:debug("Receiving stage complete event from: " .. stage.zoneName) - - local anyIncomplete = false - logger:debug("Checking stages for index: " .. tostring(currentStage)) - for index, stage in pairs(StagesByIndex[tostring(currentStage)]) do - if stage:IsComplete() == false then - anyIncomplete = true - logger:debug("Need to wait for Stage " .. stage.zoneName .. " to be completed") - else - logger:debug("Stage verified to be completed: " .. stage.zoneName) - end - end - - if anyIncomplete == false and stageConfig.isAutoStages == true then - - -- CHECK WAITING STAGES - local nextStage = currentStage + 1 - - if WaitingStagesByIndex[tostring(nextStage)] then - for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do - if waitingStage:IsActive() == false then - waitingStage:ActivateStage() - end - end - end - - local anyWaiting = false - if WaitingStagesByIndex[tostring(nextStage)] then - for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do - if waitingStage:IsComplete() == false then - anyWaiting = true - end - end - end - - if anyWaiting == false then - logger:debug("Setting next stage to: " .. tostring(currentStage + 1)) - Spearhead.Events.PublishStageNumberChanged(currentStage + 1) - end - end - end - } - - for _, stageName in pairs(database:getStagezoneNames()) do logger:debug("Found stage zone with name: " .. stageName) @@ -136,13 +94,13 @@ function GlobalStageManager:NewAndStart(database, stageConfig, logLevel, spawnMa if isSideStage == true then local stage = Spearhead.classes.stageClasses.Stages.ExtraStage.New(database, stageConfig, stagelogger, initData, spawnManager) - stage:AddStageCompleteListener(OnStageCompleteListener) + stage:AddStageCompleteListener(self) if SideStageByIndex[tostring(orderNumber)] == nil then SideStageByIndex[tostring(orderNumber)] = {} end table.insert(SideStageByIndex[tostring(orderNumber)], stage) else local stage = Spearhead.classes.stageClasses.Stages.PrimaryStage.New(database, stageConfig, stagelogger, initData, spawnManager) - stage:AddStageCompleteListener(OnStageCompleteListener) + stage:AddStageCompleteListener(self) if StagesByIndex[tostring(orderNumber)] == nil then StagesByIndex[tostring(orderNumber)] = {} end table.insert(StagesByIndex[tostring(orderNumber)], stage) @@ -193,15 +151,71 @@ function GlobalStageManager:NewAndStart(database, stageConfig, logLevel, spawnMa end table.insert(WaitingStagesByIndex[tostring(stageIndex)], waitingStage) - waitingStage:AddStageCompleteListener(OnStageCompleteListener) + waitingStage:AddStageCompleteListener(self) end end end end + return self +end +function GlobalStageManager:OnStageComplete(stage) + self.logger:debug("Receiving stage complete event from: " .. stage.zoneName) - return o + local anyIncomplete = false + self.logger:debug("Checking stages for index: " .. tostring(currentStage)) + for index, stage in pairs(StagesByIndex[tostring(currentStage)]) do + if stage:IsComplete() == false then + anyIncomplete = true + self.logger:debug("Need to wait for Stage " .. stage.zoneName .. " to be completed") + else + self.logger:debug("Stage verified to be completed: " .. stage.zoneName) + end + end + + if anyIncomplete == false and self.stageConfig.isAutoStages == true then + + -- CHECK WAITING STAGES + local nextStage = currentStage + 1 + + if WaitingStagesByIndex[tostring(nextStage)] then + for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do + if waitingStage:IsActive() == false then + waitingStage:ActivateStage() + end + end + end + + local anyWaiting = false + if WaitingStagesByIndex[tostring(nextStage)] then + for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do + if waitingStage:IsComplete() == false then + anyWaiting = true + end + end + end + + if anyWaiting == false then + local newStageNumber = currentStage + 1 + self:UpdateDrawings(newStageNumber) + self.logger:debug("Setting next stage to: " .. tostring(newStageNumber)) + Spearhead.Events.PublishStageNumberChanged(newStageNumber) + end + end +end + +---@private +function GlobalStageManager:UpdateDrawings(stageNumber) + local drawings = self.database:getCustomDrawings() + for _, drawing in pairs(drawings) do + local startStage, stopStage = drawing:GetStartAndStop() + if stageNumber >= startStage and stageNumber < stopStage then + drawing:Draw() + else + drawing:Remove() + end + end end diff --git a/classes/stageClasses/drawings/CustomDrawing.lua b/classes/stageClasses/drawings/CustomDrawing.lua new file mode 100644 index 0000000..4b97dda --- /dev/null +++ b/classes/stageClasses/drawings/CustomDrawing.lua @@ -0,0 +1,52 @@ + + +---@class CustomDrawing +---@field private _id integer? +---@field private _drawingObject DrawingObject +---@field private _helper DrawingHelper +---@field private _startingStage number +---@field private _removeAtStage number +local CustomDrawing = {} +CustomDrawing.__index = CustomDrawing + + +---@param drawingObject DrawingObject +---@param id integer? +---@return CustomDrawing +function CustomDrawing.New(drawingObject, id) + local self = setmetatable({}, CustomDrawing) + self._drawingObject = drawingObject + self._id = id + self._helper = Spearhead.classes.stageClasses.drawings.helper.DrawingHelper + + local name = drawingObject.name + local split = Spearhead.Util.split_string(name or "", "_") + local secondPart = split[2] or "1" + local splitPart = Spearhead.Util.split_string(secondPart, ":") + self._startingStage = tonumber(splitPart[1]) or 1 + self._removeAtStage = tonumber(splitPart[2]) or math.huge + return self +end + +---@return number start +---@return number stop +function CustomDrawing:GetStartAndStop() + return self._startingStage, self._removeAtStage +end + +function CustomDrawing:Draw() + self._id = self._helper.Draw(self._drawingObject) +end + +function CustomDrawing:Remove() + if self._id ~= nil then + self._helper.Remove(self._id) + self._id = nil + end +end + +if not Spearhead then Spearhead = {} end +if not Spearhead.classes then Spearhead.classes = {} end +if not Spearhead.classes.stageClasses then Spearhead.classes.stageClasses = {} end +if not Spearhead.classes.stageClasses.drawings then Spearhead.classes.stageClasses.drawings = {} end +Spearhead.classes.stageClasses.drawings.CustomDrawing = CustomDrawing \ No newline at end of file diff --git a/classes/stageClasses/drawings/helper/DrawingHelper.lua b/classes/stageClasses/drawings/helper/DrawingHelper.lua new file mode 100644 index 0000000..c05262d --- /dev/null +++ b/classes/stageClasses/drawings/helper/DrawingHelper.lua @@ -0,0 +1,228 @@ + + +---@class DrawingHelper +local DrawingHelper = {} +DrawingHelper.__index = DrawingHelper + +local customDrawingIdIncrementer = 4210 + +---@param object DrawingObject +---@return integer? id +function DrawingHelper.Draw(object) + if object == nil then + return nil + end + + local id = DrawingHelper.GetAndAddId() + if(object.primitiveType == "Polygon") then + DrawingHelper.DrawPolygon(object--[[@as Polygon]], id) + elseif(object.primitiveType == "Line") then + DrawingHelper.DrawLine(object--[[@as Line]], id) + elseif(object.primitiveType == "TextBox") then + DrawingHelper.DrawTextBox(object--[[@as TextBox]], id) + end + + return id +end + +function DrawingHelper.GetAndAddId() + customDrawingIdIncrementer = customDrawingIdIncrementer + 1 + return customDrawingIdIncrementer +end + +---@private +---@param shapeID ShapeId +---@param drawID integer +---@param points Array +---@param fillColor table +---@param lineColor table +local function MarkupToAll(shapeID, drawID, points, fillColor, lineColor, lineStyle) + + local functionString = "trigger.action.markupToAll(" .. shapeID .. ", -1, " .. drawID .. "," + for _, point in ipairs(points) do + functionString = functionString .. " { x=" .. point.x .. ", y=0,z=" .. point.z .. "}," + end + functionString = functionString .. + "{ " .. lineColor[1] .. "," .. lineColor[2] .. "," .. lineColor[3] .. "," .. lineColor[4] .. "}, " .. + "{ " .. fillColor[1] .. "," .. fillColor[2] .. "," .. fillColor[3] .. "," .. fillColor[4] .. "}, " .. + lineStyle .. ")" + + ---@diagnostic disable-next-line: deprecated + local f, err = loadstring(functionString) + if f then + f() + else + env.error("Something failed when drawing complex drawing" .. err) + end + +end + +---@private +---@param object Polygon +---@param id integer +function DrawingHelper.DrawPolygon(object, id) + if object == nil then + return + end + + ---@param circle Circle + local function DrawCircle(circle) + local vec3 = { x = circle.mapX, y = 0, z = circle.mapY } + local fillColor = DrawingHelper.ColorToColorTable(circle.fillColorString) + local colorString = DrawingHelper.ColorToColorTable(circle.colorString) + local style = DrawingHelper.ToLineStyleInteger(circle.style) + trigger.action.circleToAll(-1, id, vec3, circle.radius, colorString, fillColor, style, true) + end + + ---@param oval Oval + local function DrawOval(oval) + ---@type Array + local points = {} + local pointsNo = 30 + local angleStep = (2 * math.pi) / points + + local fillColor = DrawingHelper.ColorToColorTable(oval.fillColorString) + local color = DrawingHelper.ColorToColorTable(oval.colorString) + local lineStyle = DrawingHelper.ToLineStyleInteger(oval.style) + + for i = 1, pointsNo do + local angle = i * angleStep + local x = oval.mapX + (oval.r1 * math.cos(angle)) + local y = oval.mapY + (oval.r2 * math.sin(angle)) + table.insert(points, { x = x, y = 0, z = y } ) + end + MarkupToAll(7, id, points, fillColor, color, lineStyle) + end + + ---@param free Free + local function DrawFree(free) + local fillColor = DrawingHelper.ColorToColorTable(free.fillColorString) + local color = DrawingHelper.ColorToColorTable(free.colorString) + local lineStyle = DrawingHelper.ToLineStyleInteger(free.style) + + local points = {} + for _, point in ipairs(free.points) do + table.insert(points, { x = point.x, y = 0, z = point.y } ) + end + MarkupToAll(7, id, points, fillColor, color, lineStyle) + end + + ---@param rect Rect + local function DrawRect(rect) + local fillColor = DrawingHelper.ColorToColorTable(rect.fillColorString) + local color = DrawingHelper.ColorToColorTable(rect.colorString) + local lineStyle = DrawingHelper.ToLineStyleInteger(rect.style) + + local pointA = { x = rect.mapX, y = 0, z = rect.mapY } + local pointB = { x = rect.mapX + rect.width, y = 0, z = rect.mapY + rect.height } + trigger.action.rectToAll(-1, id, pointA, pointB, color, fillColor, lineStyle, true) + end + + ---@param arrow Arrow + local function DrawArrow(arrow) + local fillColor = DrawingHelper.ColorToColorTable(arrow.fillColorString) + local color = DrawingHelper.ColorToColorTable(arrow.colorString) + local lineStyle = DrawingHelper.ToLineStyleInteger(arrow.style) + + local startPoint = { x = arrow.mapX, y = 0, z = arrow.mapY } + local rad = math.rad(arrow.angle or 0) + local length = arrow.length or 100 + local endPoint = { x = arrow.mapX + length * math.cos(rad), y = 0, z = arrow.mapY + length * math.sin(rad) } + trigger.action.arrowToAll(-1, id, startPoint, endPoint, color, fillColor, lineStyle, true) + end + + if object.polygonMode == "circle" then + DrawCircle(object--[[@as Circle]]) + elseif object.polygonMode == "oval" then + DrawOval(object--[[@as Oval]]) + elseif object.polygonMode == "free" then + DrawFree(object--[[@as Free]]) + elseif object.polygonMode == "rect" then + DrawRect(object--[[@as Rect]]) + elseif object.polygonMode == "arrow" then + DrawArrow(object--[[@as Arrow]]) + end +end + +---@private +---@param object Line +---@param id integer +function DrawingHelper.DrawLine(object, id) + + ---@type Array + local points = {} + + for _, point in ipairs(object.points) do + table.insert(points, { x = point.x, y = 0, z = point.y } ) + end + + local color = DrawingHelper.ColorToColorTable(object.colorString) + local lineStyle = DrawingHelper.ToLineStyleInteger(object.style) + MarkupToAll(1, id, points, color, color, lineStyle) +end + +---@private +---@param object TextBox +---@param id integer +function DrawingHelper.DrawTextBox(object, id) + trigger.action.textToAll(-1, id, { x= object.mapX, y = 0, z = object.mapY }, + DrawingHelper.ColorToColorTable(object.colorString), + DrawingHelper.ColorToColorTable(object.fillColorString), + object.fontSize or 12, + true, + object.text or "") +end + +function DrawingHelper.Remove(id) + trigger.action.removeMark(id) +end + + + +---@param hexStr string +---@return table +function DrawingHelper.ColorToColorTable(hexStr) + hexStr = hexStr:gsub("0x", "") + local a = tonumber(hexStr:sub(1, 2), 16) / 255 + local r = tonumber(hexStr:sub(3, 4), 16) / 255 + local g = tonumber(hexStr:sub(5, 6), 16) / 255 + local b = tonumber(hexStr:sub(7, 8), 16) / 255 + + return { r, g , b , a } +end + +---@param lineStyle string +function DrawingHelper.ToLineStyleInteger(lineStyle) + lineStyle = lineStyle:lower() + if lineStyle == "no line" then + return 0 + elseif lineStyle == "solid" then + return 1 + elseif lineStyle == "dashed" then + return 2 + elseif lineStyle == "dotted" then + return 3 + elseif lineStyle == "dot dash" then + return 4 + elseif lineStyle == "long dash" then + return 5 + elseif lineStyle == "two dash" then + return 6 + else + return 0 + end +end + +---@class ARGB +---@field public a number +---@field public r number +---@field public g number +---@field public b number + + +if not Spearhead then Spearhead = {} end +if not Spearhead.classes then Spearhead.classes = {} end +if not Spearhead.classes.stageClasses then Spearhead.classes.stageClasses = {} end +if not Spearhead.classes.stageClasses.drawings then Spearhead.classes.stageClasses.drawings = {} end +if not Spearhead.classes.stageClasses.drawings.helper then Spearhead.classes.stageClasses.drawings.helper = {} end +Spearhead.classes.stageClasses.drawings.helper.DrawingHelper = DrawingHelper \ No newline at end of file diff --git a/main.lua b/main.lua index 7ab3ab7..3f851b5 100644 --- a/main.lua +++ b/main.lua @@ -39,7 +39,7 @@ local detectionLogger = Spearhead.LoggerTemplate.new("DetectionManager", default local detectionManager = Spearhead.classes.capClasses.detection.DetectionManager.New(detectionLogger) Spearhead.classes.capClasses.GlobalCapManager.start(databaseManager, capConfig, detectionManager, stageConfig, defaultLogLevel, spawnManager) -Spearhead.internal.GlobalStageManager:NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager) +Spearhead.internal.GlobalStageManager.NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager) Spearhead.internal.GlobalFleetManager.start(databaseManager)