diff --git a/README.md b/README.md index d3e649db..068201b6 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,6 @@ the patreon link will keep pointing to [Khopa's](https://github.com/Khopa) accou Currently, Retribution supports the following new features: * A livery selector in the air wing configuration dialog - * Fixed mod support (still unfixed in Liberation) * Support for campaigns with quad-point triggers * Support for the F-15D 'Baz' mod * Support for the Su-30 mod diff --git a/changelog.md b/changelog.md index 231ae690..601b8a7d 100644 --- a/changelog.md +++ b/changelog.md @@ -2,13 +2,16 @@ ## Features/Improvements * **[Mission Generation]** Add option to configure the maximum front-line length in settings -* **[Mission Generation]** Variable flight-size (2/3/4-ship) for BAI/ANTISHIP/DEAD/STRIKE (main) missions +* **[Mission Generation]** Variable flight-size (2/3/4-ship) for +BAI/ANTISHIP/DEAD/STRIKE/BARCAP/CAS/OCA/AIR-ASSAULT (main) missions * **[Modding]** Support for F-15D 'Baz' mod version 1.0 * **[Modding]** Support for Su-30 mod version 2.01B +* **[Modding]** Support for A-6A Intruder version 2.7.5.01 * **[Modding]** Support for F-4B Phantom II mod version v2.7.10.02, patch 2022.10.02 * **[Modding]** Support for F-100 Super Sabre mod versions v2.7.18.01 & 2.7.18.30765 and patches 30.09.22 & 09.10.22 * **[Modding]** Support for F-105 mod version 2.7.12.23x * **[Modding]** Support IDF Mod Project F-16I Sufa & F-16D v2.2 mod +* **[Modding]** Support for F-84G mod version 2.5.7.01 * **[Modding]** Updated F-104 mod version support to 2.7.11.222.01 * **[UI]** Add livery selector to Air Wing Configurator's squadrons. * **[Performance]** Added performance option: Maximum front-line unit supply per control point. @@ -69,6 +72,7 @@ Saves from 5.x are not compatible with 6.0. * **[Squadrons]** Fixed issue in air wing configuration that would allow squadrons to be created with no home base if no base was available. * **[UI]** Fixed and issue where the liberation main exe was still running after application close. * **[UI]** Disable player slots for non-flyable aircraft. +* **[UI]** Add vanilla theme weather and time of day icons # 5.2.0 diff --git a/client/package-lock.json b/client/package-lock.json index 3ae8facc..c1e55c58 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -41,7 +41,9 @@ "electron": "^21.1.0", "electron-is-dev": "^2.0.0", "generate-license-file": "^2.0.0", + "got": "^11.8.5", "license-checker": "^25.0.1", + "nth-check": "^2.0.1", "react-scripts": "5.0.1", "ts-node": "^10.9.1", "wait-on": "^6.0.1" @@ -2579,6 +2581,78 @@ "global-tunnel-ng": "^2.7.1" } }, + "node_modules/@electron/get/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@electron/get/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@electron/get/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/get/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@electron/get/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, "node_modules/@electron/get/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2593,6 +2667,55 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/@electron/get/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@electron/get/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/get/node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@electron/get/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, "node_modules/@electron/get/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -2602,6 +2725,51 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/@electron/get/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/@electron/get/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/get/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@electron/get/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/@electron/get/node_modules/responselike/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3931,12 +4099,15 @@ "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==" }, "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sinonjs/commons": { @@ -4191,15 +4362,15 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/@terraformer/arcgis": { @@ -4549,6 +4720,18 @@ "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -4647,6 +4830,12 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "node_modules/@types/http-proxy": { "version": "1.17.8", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", @@ -4909,6 +5098,16 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/keyv": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz", + "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==", + "deprecated": "This is a stub types definition. keyv provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "keyv": "*" + } + }, "node_modules/@types/leaflet": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.8.0.tgz", @@ -5011,6 +5210,15 @@ "@types/node": "*" } }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -6724,19 +6932,28 @@ "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "engines": { "node": ">=8" @@ -6757,24 +6974,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -7843,15 +8042,30 @@ "dev": true }, "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dedent": { @@ -7919,10 +8133,13 @@ } }, "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/define-lazy-prop": { "version": "2.0.0", @@ -10370,37 +10587,28 @@ } }, "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" + "node": ">=10.19.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { @@ -10761,6 +10969,19 @@ "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", "dev": true }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -13476,9 +13697,9 @@ } }, "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "node_modules/json-parse-better-errors": { @@ -13574,12 +13795,12 @@ "peer": true }, "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "dependencies": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "node_modules/kind-of": { @@ -13908,12 +14129,12 @@ } }, "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/lru-cache": { @@ -15026,12 +15247,12 @@ } }, "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/p-limit": { @@ -17539,6 +17760,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -17639,12 +17866,15 @@ } }, "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "dependencies": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor": { @@ -22687,6 +22917,62 @@ "sumchecker": "^3.0.1" }, "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -22698,6 +22984,48 @@ "universalify": "^0.1.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -22707,6 +23035,44 @@ "graceful-fs": "^4.1.6" } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -23707,9 +24073,9 @@ "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==" }, "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@sinonjs/commons": { @@ -23866,12 +24232,12 @@ } }, "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "requires": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" } }, "@terraformer/arcgis": { @@ -24150,6 +24516,18 @@ "@types/node": "*" } }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -24248,6 +24626,12 @@ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "@types/http-proxy": { "version": "1.17.8", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", @@ -24460,6 +24844,15 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/keyv": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz", + "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==", + "dev": true, + "requires": { + "keyv": "*" + } + }, "@types/leaflet": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.8.0.tgz", @@ -24562,6 +24955,15 @@ "@types/node": "*" } }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -25864,19 +26266,25 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "dependencies": { "get-stream": { @@ -25887,18 +26295,6 @@ "requires": { "pump": "^3.0.0" } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true } } }, @@ -26689,12 +27085,20 @@ "dev": true }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } } }, "dedent": { @@ -26753,9 +27157,9 @@ } }, "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, "define-lazy-prop": { @@ -28609,33 +29013,22 @@ } }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, "graceful-fs": { @@ -28918,6 +29311,16 @@ "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", "dev": true }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -30899,9 +31302,9 @@ "dev": true }, "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-better-errors": { @@ -30983,12 +31386,12 @@ "peer": true }, "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "requires": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "kind-of": { @@ -31251,9 +31654,9 @@ } }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, "lru-cache": { @@ -32105,9 +32508,9 @@ } }, "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true }, "p-limit": { @@ -33866,6 +34269,12 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -33934,12 +34343,12 @@ "dev": true }, "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" } }, "restore-cursor": { diff --git a/client/package.json b/client/package.json index 53a9d1c3..4710af83 100644 --- a/client/package.json +++ b/client/package.json @@ -69,7 +69,9 @@ "electron": "^21.1.0", "electron-is-dev": "^2.0.0", "generate-license-file": "^2.0.0", + "got": "^11.8.5", "license-checker": "^25.0.1", + "nth-check": "^2.0.1", "react-scripts": "5.0.1", "ts-node": "^10.9.1", "wait-on": "^6.0.1" diff --git a/game/armedforces/armedforces.py b/game/armedforces/armedforces.py index b8d34a61..b829a604 100644 --- a/game/armedforces/armedforces.py +++ b/game/armedforces/armedforces.py @@ -2,8 +2,9 @@ from __future__ import annotations import random from typing import TYPE_CHECKING, Iterator, Optional -from game.data.groups import GroupTask + from game.armedforces.forcegroup import ForceGroup +from game.data.groups import GroupTask from game.layout import LAYOUTS from game.profiling import logged_duration diff --git a/game/armedforces/forcegroup.py b/game/armedforces/forcegroup.py index c0f7bf59..16508b19 100644 --- a/game/armedforces/forcegroup.py +++ b/game/armedforces/forcegroup.py @@ -10,19 +10,18 @@ import yaml from dcs.unittype import ShipType, StaticType, UnitType as DcsUnitType, VehicleType from game.data.groups import GroupTask -from game.data.radar_db import UNITS_WITH_RADAR from game.dcs.groundunittype import GroundUnitType from game.dcs.helpers import static_type_from_name from game.dcs.shipunittype import ShipUnitType from game.dcs.unittype import UnitType +from game.layout import LAYOUTS +from game.layout.layout import TgoLayout, TgoLayoutUnitGroup +from game.point_with_heading import PointWithHeading from game.theater.theatergroundobject import ( IadsGroundObject, IadsBuildingGroundObject, NavalGroundObject, ) -from game.layout import LAYOUTS -from game.layout.layout import TgoLayout, TgoLayoutUnitGroup -from game.point_with_heading import PointWithHeading from game.theater.theatergroup import IadsGroundGroup, IadsRole, TheaterGroup from game.utils import escape_string_for_lua diff --git a/game/ato/ai_flight_planner_db.py b/game/ato/ai_flight_planner_db.py index 5e56cfed..111450d6 100644 --- a/game/ato/ai_flight_planner_db.py +++ b/game/ato/ai_flight_planner_db.py @@ -121,6 +121,7 @@ from dcs.unittype import FlyingType from game.dcs.aircrafttype import AircraftType from pydcs_extensions.a4ec.a4ec import A_4E_C +from pydcs_extensions.a6a.a6a import VSN_A6A from pydcs_extensions.f100.f100 import VSN_F100 from pydcs_extensions.f104.f104 import VSN_F104C, VSN_F104G, VSN_F104S, VSN_F104S_AG from pydcs_extensions.f105.f105 import VSN_F105D, VSN_F105G @@ -135,6 +136,7 @@ from pydcs_extensions.f16i_idf.f16i_idf import ( ) from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.f4b.f4b import VSN_F4B +from pydcs_extensions.f84g.f84g import VSN_F84G from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG from pydcs_extensions.su30.su30 import Su_30MKA, Su_30MKI, Su_30MKM, Su_30SM @@ -207,6 +209,7 @@ CAP_CAPABLE = [ MiG_15bis, C_101CC, L_39ZA, + VSN_F84G, P_51D_30_NA, P_51D, SpitfireLFMkIXCW, @@ -233,6 +236,7 @@ CAS_CAPABLE = [ Su_25, F_15D, F_15E, + F_16A, F_16C_50, F_16I, F_16D_Barak, @@ -256,7 +260,6 @@ CAS_CAPABLE = [ Su_17M4, Su_33, F_4E, - VSN_F4B, S_3B, Su_30, Su_30MKA, @@ -296,12 +299,6 @@ CAS_CAPABLE = [ C_101CC, L_39ZA, UH_1H, - VSN_F105G, - VSN_F105D, - VSN_F104S_AG, - VSN_F104G, - VSN_F104C, - VSN_F100, A_20G, Ju_88A4, P_47D_40, @@ -319,6 +316,15 @@ CAS_CAPABLE = [ WingLoong_I, MQ_9_Reaper, RQ_1A_Predator, + VSN_A6A, + VSN_F100, + VSN_F105G, + VSN_F105D, + VSN_F104S_AG, + VSN_F104G, + VSN_F104C, + VSN_F4B, + VSN_F84G, ] @@ -361,6 +367,7 @@ DEAD_CAPABLE = SEAD_CAPABLE + [ AJS37, F_14B, F_14A_135_GR, + F_16A, JAS39Gripen_AG, B_1B, B_52H, @@ -369,11 +376,6 @@ DEAD_CAPABLE = SEAD_CAPABLE + [ H_6J, A_20G, Ju_88A4, - VSN_F105D, - VSN_F104S_AG, - VSN_F104G, - VSN_F104C, - VSN_F100, P_47D_40, P_47D_30bl1, P_47D_30, @@ -385,6 +387,13 @@ DEAD_CAPABLE = SEAD_CAPABLE + [ Bf_109K_4, FW_190D9, FW_190A8, + VSN_A6A, + VSN_F105D, + VSN_F104S_AG, + VSN_F104G, + VSN_F104C, + VSN_F100, + VSN_F84G, ] @@ -433,7 +442,6 @@ STRIKE_CAPABLE = [ MiG_29G, MiG_29A, F_4E, - VSN_F4B, A_10C_2, A_10C, S_3B, @@ -448,8 +456,6 @@ STRIKE_CAPABLE = [ Mirage_F1M_EE, Mirage_F1CT, MiG_27K, - VSN_F105G, - VSN_F105D, MiG_21Bis, MiG_15bis, F_5E_3, @@ -459,10 +465,6 @@ STRIKE_CAPABLE = [ B_17G, A_20G, Ju_88A4, - VSN_F104S_AG, - VSN_F104G, - VSN_F104C, - VSN_F100, P_47D_40, P_47D_30bl1, P_47D_30, @@ -474,6 +476,15 @@ STRIKE_CAPABLE = [ Bf_109K_4, FW_190D9, FW_190A8, + VSN_A6A, + VSN_F100, + VSN_F104S_AG, + VSN_F104G, + VSN_F104C, + VSN_F105G, + VSN_F105D, + VSN_F4B, + VSN_F84G, ] @@ -482,6 +493,7 @@ ANTISHIP_CAPABLE = [ Tu_142, Tu_22M3, H_6J, + F_16A, FA_18C_hornet, JAS39Gripen_AG, Su_24M, @@ -551,7 +563,6 @@ RUNWAY_ATTACK_CAPABLE = [ MiG_29G, MiG_29A, F_4E, - VSN_F4B, A_10C_2, A_10C, S_3B, @@ -566,8 +577,6 @@ RUNWAY_ATTACK_CAPABLE = [ Mirage_F1M_EE, Mirage_F1CT, MiG_27K, - VSN_F105G, - VSN_F105D, MiG_21Bis, MiG_15bis, F_5E_3, @@ -577,10 +586,6 @@ RUNWAY_ATTACK_CAPABLE = [ B_17G, A_20G, Ju_88A4, - VSN_F104S_AG, - VSN_F104G, - VSN_F104C, - VSN_F100, P_47D_40, P_47D_30bl1, P_47D_30, @@ -592,6 +597,14 @@ RUNWAY_ATTACK_CAPABLE = [ Bf_109K_4, FW_190D9, FW_190A8, + VSN_A6A, + VSN_F105G, + VSN_F105D, + VSN_F104S_AG, + VSN_F104G, + VSN_F104C, + VSN_F100, + VSN_F4B, ] # For any aircraft that isn't necessarily directly involved in strike diff --git a/game/ato/loadouts.py b/game/ato/loadouts.py index 00b29345..0852c534 100644 --- a/game/ato/loadouts.py +++ b/game/ato/loadouts.py @@ -3,7 +3,7 @@ from __future__ import annotations import datetime import logging from collections.abc import Iterable -from typing import Iterator, Mapping, Optional, TYPE_CHECKING, Type, Dict, Any +from typing import Iterator, Mapping, Optional, TYPE_CHECKING, Type, Dict from dcs.unittype import FlyingType diff --git a/game/callsigns.py b/game/callsigns.py index a722606f..cd1d7bf1 100644 --- a/game/callsigns.py +++ b/game/callsigns.py @@ -3,8 +3,8 @@ import logging import re from typing import Any -from dcs.unitgroup import FlyingGroup from dcs.flyingunit import FlyingUnit +from dcs.unitgroup import FlyingGroup def callsign_for_support_unit(group: FlyingGroup[Any]) -> str: diff --git a/game/campaignloader/defaultsquadronassigner.py b/game/campaignloader/defaultsquadronassigner.py index 8911c9b4..6575883d 100644 --- a/game/campaignloader/defaultsquadronassigner.py +++ b/game/campaignloader/defaultsquadronassigner.py @@ -1,13 +1,12 @@ from __future__ import annotations -import dataclasses import logging -from typing import Optional, TYPE_CHECKING, Dict, Union +from typing import Optional, TYPE_CHECKING from game.squadrons import Squadron from game.squadrons.squadrondef import SquadronDef -from ..ato.flighttype import FlightType from .campaignairwingconfig import CampaignAirWingConfig, SquadronConfig +from ..ato.flighttype import FlightType from ..dcs.aircrafttype import AircraftType from ..theater import ControlPoint diff --git a/game/campaignloader/squadrondefgenerator.py b/game/campaignloader/squadrondefgenerator.py index 26e65b8d..0bf87ea7 100644 --- a/game/campaignloader/squadrondefgenerator.py +++ b/game/campaignloader/squadrondefgenerator.py @@ -4,12 +4,12 @@ import itertools import random from typing import Optional, TYPE_CHECKING +from game.ato.ai_flight_planner_db import aircraft_for_task, tasks_for_aircraft from game.ato.flighttype import FlightType from game.dcs.aircrafttype import AircraftType from game.squadrons.operatingbases import OperatingBases from game.squadrons.squadrondef import SquadronDef from game.theater import ControlPoint -from game.ato.ai_flight_planner_db import aircraft_for_task, tasks_for_aircraft if TYPE_CHECKING: from game.factions.faction import Faction diff --git a/game/commander/missionproposals.py b/game/commander/missionproposals.py index 8749a76c..7f712422 100644 --- a/game/commander/missionproposals.py +++ b/game/commander/missionproposals.py @@ -2,8 +2,8 @@ from dataclasses import field, dataclass from enum import Enum, auto from typing import Optional -from game.theater import MissionTarget from game.ato.flighttype import FlightType +from game.theater import MissionTarget class EscortType(Enum): diff --git a/game/commander/missionscheduler.py b/game/commander/missionscheduler.py index 257747aa..5423d8d3 100644 --- a/game/commander/missionscheduler.py +++ b/game/commander/missionscheduler.py @@ -6,9 +6,9 @@ from collections import defaultdict from datetime import timedelta from typing import Iterator, Dict, TYPE_CHECKING -from game.theater import MissionTarget from game.ato.flighttype import FlightType from game.ato.traveltime import TotEstimator +from game.theater import MissionTarget if TYPE_CHECKING: from game.coalition import Coalition diff --git a/game/commander/objectivefinder.py b/game/commander/objectivefinder.py index 14934b9d..9f5767b6 100644 --- a/game/commander/objectivefinder.py +++ b/game/commander/objectivefinder.py @@ -5,6 +5,7 @@ import operator from collections.abc import Iterable, Iterator from typing import TYPE_CHECKING, TypeVar +from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache from game.theater import ( Airfield, ControlPoint, @@ -20,7 +21,6 @@ from game.theater.theatergroundobject import ( IadsBuildingGroundObject, ) from game.utils import meters, nautical_miles -from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache if TYPE_CHECKING: from game import Game diff --git a/game/commander/tasks/compound/nextaction.py b/game/commander/tasks/compound/nextaction.py index 56c6bad2..e09b4054 100644 --- a/game/commander/tasks/compound/nextaction.py +++ b/game/commander/tasks/compound/nextaction.py @@ -4,8 +4,8 @@ from dataclasses import dataclass from game.commander.tasks.compound.attackairinfrastructure import ( AttackAirInfrastructure, ) -from game.commander.tasks.compound.attackbuildings import AttackBuildings from game.commander.tasks.compound.attackbattlepositions import AttackBattlePositions +from game.commander.tasks.compound.attackbuildings import AttackBuildings from game.commander.tasks.compound.capturebases import CaptureBases from game.commander.tasks.compound.defendbases import DefendBases from game.commander.tasks.compound.degradeiads import DegradeIads diff --git a/game/commander/tasks/primitive/aewc.py b/game/commander/tasks/primitive/aewc.py index 3811dd44..8d4a80e7 100644 --- a/game/commander/tasks/primitive/aewc.py +++ b/game/commander/tasks/primitive/aewc.py @@ -2,10 +2,10 @@ from __future__ import annotations from dataclasses import dataclass +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import MissionTarget -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/airassault.py b/game/commander/tasks/primitive/airassault.py index bac5d86e..82704b23 100644 --- a/game/commander/tasks/primitive/airassault.py +++ b/game/commander/tasks/primitive/airassault.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import ControlPoint -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/antiship.py b/game/commander/tasks/primitive/antiship.py index 31b06724..e90800eb 100644 --- a/game/commander/tasks/primitive/antiship.py +++ b/game/commander/tasks/primitive/antiship.py @@ -3,11 +3,11 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.missionproposals import EscortType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater.theatergroundobject import NavalGroundObject -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/antishipping.py b/game/commander/tasks/primitive/antishipping.py index cafefb4f..fa084c4e 100644 --- a/game/commander/tasks/primitive/antishipping.py +++ b/game/commander/tasks/primitive/antishipping.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.transfers import CargoShip -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/bai.py b/game/commander/tasks/primitive/bai.py index 6b6f8d9f..1984247a 100644 --- a/game/commander/tasks/primitive/bai.py +++ b/game/commander/tasks/primitive/bai.py @@ -2,10 +2,10 @@ from __future__ import annotations from dataclasses import dataclass +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater.theatergroundobject import VehicleGroupGroundObject -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/barcap.py b/game/commander/tasks/primitive/barcap.py index ba752ea0..f83f9c54 100644 --- a/game/commander/tasks/primitive/barcap.py +++ b/game/commander/tasks/primitive/barcap.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import ControlPoint -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/cas.py b/game/commander/tasks/primitive/cas.py index 2c4d8740..3f036c2b 100644 --- a/game/commander/tasks/primitive/cas.py +++ b/game/commander/tasks/primitive/cas.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import FrontLine -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/convoyinterdiction.py b/game/commander/tasks/primitive/convoyinterdiction.py index 063d7a76..98368056 100644 --- a/game/commander/tasks/primitive/convoyinterdiction.py +++ b/game/commander/tasks/primitive/convoyinterdiction.py @@ -2,11 +2,10 @@ from __future__ import annotations from dataclasses import dataclass +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState -from game.data.doctrine import Doctrine from game.transfers import Convoy -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/dead.py b/game/commander/tasks/primitive/dead.py index a8211c89..5687e45c 100644 --- a/game/commander/tasks/primitive/dead.py +++ b/game/commander/tasks/primitive/dead.py @@ -2,11 +2,11 @@ from __future__ import annotations from dataclasses import dataclass +from game.ato.flighttype import FlightType from game.commander.missionproposals import EscortType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater.theatergroundobject import IadsGroundObject -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/oca.py b/game/commander/tasks/primitive/oca.py index de62b54c..bbe73e15 100644 --- a/game/commander/tasks/primitive/oca.py +++ b/game/commander/tasks/primitive/oca.py @@ -3,10 +3,10 @@ from __future__ import annotations from dataclasses import dataclass from random import randint +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import ControlPoint -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/refueling.py b/game/commander/tasks/primitive/refueling.py index f43e4941..bd228de8 100644 --- a/game/commander/tasks/primitive/refueling.py +++ b/game/commander/tasks/primitive/refueling.py @@ -2,10 +2,10 @@ from __future__ import annotations from dataclasses import dataclass +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater import MissionTarget -from game.ato.flighttype import FlightType @dataclass diff --git a/game/commander/tasks/primitive/strike.py b/game/commander/tasks/primitive/strike.py index bf230ed0..4e142e16 100644 --- a/game/commander/tasks/primitive/strike.py +++ b/game/commander/tasks/primitive/strike.py @@ -1,12 +1,11 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any +from game.ato.flighttype import FlightType from game.commander.tasks.packageplanningtask import PackagePlanningTask from game.commander.theaterstate import TheaterState from game.theater.theatergroundobject import TheaterGroundObject -from game.ato.flighttype import FlightType @dataclass diff --git a/game/dcs/helpers.py b/game/dcs/helpers.py index b8bcb751..a6c75b3c 100644 --- a/game/dcs/helpers.py +++ b/game/dcs/helpers.py @@ -3,9 +3,9 @@ from typing import Optional, Type from dcs.helicopters import helicopter_map from dcs.planes import plane_map from dcs.ships import ship_map +from dcs.statics import fortification_map, groundobject_map, warehouse_map, cargo_map from dcs.unittype import UnitType from dcs.vehicles import vehicle_map -from dcs.statics import fortification_map, groundobject_map, warehouse_map, cargo_map def unit_type_from_name(name: str) -> Optional[Type[UnitType]]: diff --git a/game/factions/faction.py b/game/factions/faction.py index 29a91ffe..b8d139b4 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -11,6 +11,7 @@ from dcs.countries import country_dict from dcs.unittype import ShipType, StaticType from dcs.unittype import UnitType as DcsUnitType +from game.armedforces.forcegroup import ForceGroup from game.data.building_data import ( WW2_ALLIES_BUILDINGS, DEFAULT_AVAILABLE_BUILDINGS, @@ -25,12 +26,11 @@ from game.data.doctrine import ( COLDWAR_DOCTRINE, WWII_DOCTRINE, ) -from game.data.units import UnitClass from game.data.groups import GroupRole +from game.data.units import UnitClass from game.dcs.aircrafttype import AircraftType from game.dcs.groundunittype import GroundUnitType from game.dcs.shipunittype import ShipUnitType -from game.armedforces.forcegroup import ForceGroup from game.dcs.unittype import UnitType from pydcs_extensions.f16i_idf.f16i_idf import inject_F16I @@ -336,6 +336,8 @@ class Faction: inject_F16I() if not mod_settings.f22_raptor: self.remove_aircraft("F-22A") + if not mod_settings.f84g_thunderjet: + self.remove_aircraft("VSN_F84G") if not mod_settings.f100_supersabre: self.remove_aircraft("VSN_F100") if not mod_settings.f104_starfighter: @@ -345,6 +347,8 @@ class Faction: if not mod_settings.f105_thunderchief: self.remove_aircraft("VSN_F105D") self.remove_aircraft("VSN_F105G") + if not mod_settings.a6a_intruder: + self.remove_aircraft("VSN_A6A") if not mod_settings.jas39_gripen: self.remove_aircraft("JAS39Gripen") self.remove_aircraft("JAS39Gripen_AG") diff --git a/game/factions/factionloader.py b/game/factions/factionloader.py index d0722a00..2a513127 100644 --- a/game/factions/factionloader.py +++ b/game/factions/factionloader.py @@ -1,4 +1,5 @@ from __future__ import annotations + import json import logging from pathlib import Path diff --git a/game/layout/layout.py b/game/layout/layout.py index 38c0fac0..d5b946d4 100644 --- a/game/layout/layout.py +++ b/game/layout/layout.py @@ -1,7 +1,5 @@ from __future__ import annotations -from collections import defaultdict -import logging import random from dataclasses import dataclass, field from typing import TYPE_CHECKING, Iterator, Type, Optional @@ -28,7 +26,6 @@ from game.theater.theatergroundobject import ( IadsGroundObject, ) from game.theater.theatergroup import TheaterUnit -from game.utils import Heading if TYPE_CHECKING: from game.factions.faction import Faction diff --git a/game/layout/layoutloader.py b/game/layout/layoutloader.py index 98bbedf2..ade8c0e5 100644 --- a/game/layout/layoutloader.py +++ b/game/layout/layoutloader.py @@ -1,9 +1,9 @@ from __future__ import annotations -from collections import defaultdict import itertools import logging import pickle +from collections import defaultdict from concurrent.futures import ThreadPoolExecutor from pathlib import Path from typing import Iterator diff --git a/game/layout/layoutmapping.py b/game/layout/layoutmapping.py index 12da9b08..7f4a617a 100644 --- a/game/layout/layoutmapping.py +++ b/game/layout/layoutmapping.py @@ -1,6 +1,6 @@ from __future__ import annotations -from collections import defaultdict +from collections import defaultdict from dataclasses import dataclass, field from typing import Any, Optional, Type diff --git a/game/missiongenerator/aircraft/aircraftgenerator.py b/game/missiongenerator/aircraft/aircraftgenerator.py index 223bc00e..62614509 100644 --- a/game/missiongenerator/aircraft/aircraftgenerator.py +++ b/game/missiongenerator/aircraft/aircraftgenerator.py @@ -17,8 +17,8 @@ from game.ato.flighttype import FlightType from game.ato.package import Package from game.ato.starttype import StartType from game.factions.faction import Faction -from game.missiongenerator.missiondata import MissionData from game.missiongenerator.lasercoderegistry import LaserCodeRegistry +from game.missiongenerator.missiondata import MissionData from game.radio.radios import RadioRegistry from game.radio.tacan import TacanRegistry from game.runways import RunwayData diff --git a/game/missiongenerator/aircraft/flightgroupconfigurator.py b/game/missiongenerator/aircraft/flightgroupconfigurator.py index baeb284d..6e40caa2 100644 --- a/game/missiongenerator/aircraft/flightgroupconfigurator.py +++ b/game/missiongenerator/aircraft/flightgroupconfigurator.py @@ -12,9 +12,9 @@ from dcs.unitgroup import FlyingGroup from game.ato import Flight, FlightType from game.callsigns import callsign_for_support_unit from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum -from game.missiongenerator.missiondata import MissionData, AwacsInfo, TankerInfo from game.missiongenerator.lasercoderegistry import LaserCodeRegistry from game.missiongenerator.logisticsgenerator import LogisticsGenerator +from game.missiongenerator.missiondata import MissionData, AwacsInfo, TankerInfo from game.radio.radios import RadioFrequency, RadioRegistry from game.radio.tacan import TacanBand, TacanRegistry, TacanUsage from game.runways import RunwayData diff --git a/game/missiongenerator/aircraft/waypoints/cargostop.py b/game/missiongenerator/aircraft/waypoints/cargostop.py index ea0302b7..08a57585 100644 --- a/game/missiongenerator/aircraft/waypoints/cargostop.py +++ b/game/missiongenerator/aircraft/waypoints/cargostop.py @@ -1,10 +1,8 @@ from dcs.point import MovingPoint +from dcs.point import PointAction from dcs.task import Land from game.utils import feet -from dcs.point import PointAction - - from .pydcswaypointbuilder import PydcsWaypointBuilder diff --git a/game/missiongenerator/aircraft/waypoints/joinpoint.py b/game/missiongenerator/aircraft/waypoints/joinpoint.py index 59fe56ab..a30f426d 100644 --- a/game/missiongenerator/aircraft/waypoints/joinpoint.py +++ b/game/missiongenerator/aircraft/waypoints/joinpoint.py @@ -11,6 +11,7 @@ from dcs.task import ( ) from game.ato import FlightType +from game.theater import NavalControlPoint from game.utils import nautical_miles from .pydcswaypointbuilder import PydcsWaypointBuilder @@ -32,9 +33,18 @@ class JoinPointBuilder(PydcsWaypointBuilder): waypoint.tasks.append(OptFormation.spread_four_open()) elif self.flight.flight_type == FlightType.SEAD_ESCORT: - self.configure_escort_tasks( - waypoint, [Targets.All.GroundUnits.AirDefence.AAA.SAMRelated] - ) + if isinstance(self.flight.package.target, NavalControlPoint): + self.configure_escort_tasks( + waypoint, + [ + Targets.All.Naval, + Targets.All.GroundUnits.AirDefence.AAA.SAMRelated, + ], + ) + else: + self.configure_escort_tasks( + waypoint, [Targets.All.GroundUnits.AirDefence.AAA.SAMRelated] + ) # Let the AI use ECM to preemptively defend themselves. ecm_option = OptECMUsing(value=OptECMUsing.Values.UseIfDetectedLockByRadar) diff --git a/game/missiongenerator/aircraft/waypoints/refuel.py b/game/missiongenerator/aircraft/waypoints/refuel.py index c87036f8..775051f4 100644 --- a/game/missiongenerator/aircraft/waypoints/refuel.py +++ b/game/missiongenerator/aircraft/waypoints/refuel.py @@ -1,5 +1,6 @@ from dcs.point import MovingPoint from dcs.task import RefuelingTaskAction + from .pydcswaypointbuilder import PydcsWaypointBuilder diff --git a/game/missiongenerator/aircraft/waypoints/seadingress.py b/game/missiongenerator/aircraft/waypoints/seadingress.py index 3bbbcf81..0c0cd416 100644 --- a/game/missiongenerator/aircraft/waypoints/seadingress.py +++ b/game/missiongenerator/aircraft/waypoints/seadingress.py @@ -8,8 +8,8 @@ from dcs.task import ( OptECMUsing, WeaponType as DcsWeaponType, ) -from game.data.weapons import WeaponType +from game.data.weapons import WeaponType from game.theater import TheaterGroundObject from .pydcswaypointbuilder import PydcsWaypointBuilder diff --git a/game/missiongenerator/aircraft/waypoints/stopover.py b/game/missiongenerator/aircraft/waypoints/stopover.py index 9c292881..69732cb4 100644 --- a/game/missiongenerator/aircraft/waypoints/stopover.py +++ b/game/missiongenerator/aircraft/waypoints/stopover.py @@ -1,5 +1,4 @@ from dcs.point import MovingPoint, PointAction -from dcs.task import Land from .pydcswaypointbuilder import PydcsWaypointBuilder diff --git a/game/missiongenerator/logisticsgenerator.py b/game/missiongenerator/logisticsgenerator.py index 3ee7c12f..e6aa7f38 100644 --- a/game/missiongenerator/logisticsgenerator.py +++ b/game/missiongenerator/logisticsgenerator.py @@ -1,7 +1,9 @@ from typing import Any, Optional + from dcs import Mission -from dcs.unitgroup import FlyingGroup from dcs.statics import Fortification +from dcs.unitgroup import FlyingGroup + from game.ato import Flight from game.ato.flightplans.airassault import AirAssaultFlightPlan from game.ato.flightwaypointtype import FlightWaypointType @@ -9,7 +11,6 @@ from game.missiongenerator.missiondata import CargoInfo, LogisticsInfo from game.settings.settings import Settings from game.transfers import TransferOrder - ZONE_RADIUS = 300 CRATE_ZONE_RADIUS = 50 diff --git a/game/missiongenerator/luagenerator.py b/game/missiongenerator/luagenerator.py index e29350dd..09e98925 100644 --- a/game/missiongenerator/luagenerator.py +++ b/game/missiongenerator/luagenerator.py @@ -17,7 +17,6 @@ from game.plugins import LuaPluginManager from game.theater import TheaterGroundObject from game.theater.iadsnetwork.iadsrole import IadsRole from game.utils import escape_string_for_lua - from .missiondata import MissionData if TYPE_CHECKING: diff --git a/game/missiongenerator/missiondata.py b/game/missiongenerator/missiondata.py index 935f962b..566cbf75 100644 --- a/game/missiongenerator/missiondata.py +++ b/game/missiongenerator/missiondata.py @@ -3,9 +3,9 @@ from __future__ import annotations from dataclasses import dataclass, field from datetime import timedelta from typing import Optional, TYPE_CHECKING + from game.dcs.aircrafttype import AircraftType from game.missiongenerator.aircraft.flightdata import FlightData - from game.runways import RunwayData if TYPE_CHECKING: diff --git a/game/missiongenerator/tgogenerator.py b/game/missiongenerator/tgogenerator.py index b7382b92..939a6ac9 100644 --- a/game/missiongenerator/tgogenerator.py +++ b/game/missiongenerator/tgogenerator.py @@ -9,15 +9,13 @@ from __future__ import annotations import logging import random -from collections import defaultdict from typing import Any, Dict, Iterator, List, Optional, TYPE_CHECKING, Type import dcs.vehicles -from dcs import Mission, Point, unitgroup +from dcs import Mission, Point from dcs.action import DoScript, SceneryDestructionZone from dcs.condition import MapObjectIsDead from dcs.country import Country -from dcs.point import StaticPoint from dcs.ships import ( CVN_71, CVN_72, @@ -41,8 +39,8 @@ from dcs.unit import Unit, InvisibleFARP from dcs.unitgroup import MovingGroup, ShipGroup, StaticGroup, VehicleGroup from dcs.unittype import ShipType, VehicleType from dcs.vehicles import vehicle_map -from game.missiongenerator.missiondata import CarrierInfo, MissionData +from game.missiongenerator.missiondata import CarrierInfo, MissionData from game.radio.radios import RadioFrequency, RadioRegistry from game.radio.tacan import TacanBand, TacanChannel, TacanRegistry, TacanUsage from game.runways import RunwayData @@ -53,7 +51,7 @@ from game.theater.theatergroundobject import ( LhaGroundObject, MissileSiteGroundObject, ) -from game.theater.theatergroup import SceneryUnit, TheaterGroup, IadsGroundGroup +from game.theater.theatergroup import SceneryUnit, IadsGroundGroup from game.unitmap import UnitMap from game.utils import Heading, feet, knots, mps diff --git a/game/plugins/manager.py b/game/plugins/manager.py index 5ffdf9de..2cea82bf 100644 --- a/game/plugins/manager.py +++ b/game/plugins/manager.py @@ -4,7 +4,6 @@ from pathlib import Path from typing import Dict, List from game.settings import Settings - from .luaplugin import LuaPlugin diff --git a/game/radio/radios.py b/game/radio/radios.py index 2d74ad05..2299d281 100644 --- a/game/radio/radios.py +++ b/game/radio/radios.py @@ -6,6 +6,7 @@ import logging import re from dataclasses import dataclass from typing import Dict, FrozenSet, Iterator, List, Set, Tuple + from dcs.task import Modulation diff --git a/game/scenery_group.py b/game/scenery_group.py index 8659f3ba..3a4f4291 100644 --- a/game/scenery_group.py +++ b/game/scenery_group.py @@ -1,4 +1,5 @@ from __future__ import annotations + from typing import Iterable, List, TYPE_CHECKING from dcs.mapping import Polygon diff --git a/game/server/eventstream/models.py b/game/server/eventstream/models.py index fcedb6e7..fbb17ac3 100644 --- a/game/server/eventstream/models.py +++ b/game/server/eventstream/models.py @@ -12,10 +12,10 @@ from game.server.frontlines.models import FrontLineJs from game.server.iadsnetwork.models import IadsConnectionJs from game.server.leaflet import LeafletPoint from game.server.mapzones.models import ThreatZonesJs -from game.server.navmesh.models import NavMeshJs -from game.server.tgos.models import TgoJs from game.server.mapzones.models import UnculledZoneJs +from game.server.navmesh.models import NavMeshJs from game.server.supplyroutes.models import SupplyRouteJs +from game.server.tgos.models import TgoJs if TYPE_CHECKING: from game import Game diff --git a/game/server/game/models.py b/game/server/game/models.py index b5089d2e..610f2ae1 100644 --- a/game/server/game/models.py +++ b/game/server/game/models.py @@ -7,12 +7,12 @@ from pydantic import BaseModel from game.server.controlpoints.models import ControlPointJs from game.server.flights.models import FlightJs from game.server.frontlines.models import FrontLineJs +from game.server.iadsnetwork.models import IadsNetworkJs from game.server.leaflet import LeafletPoint from game.server.mapzones.models import ThreatZoneContainerJs, UnculledZoneJs from game.server.navmesh.models import NavMeshesJs from game.server.supplyroutes.models import SupplyRouteJs from game.server.tgos.models import TgoJs -from game.server.iadsnetwork.models import IadsConnectionJs, IadsNetworkJs if TYPE_CHECKING: from game import Game diff --git a/game/server/iadsnetwork/models.py b/game/server/iadsnetwork/models.py index a00321ff..6a4a4fea 100644 --- a/game/server/iadsnetwork/models.py +++ b/game/server/iadsnetwork/models.py @@ -1,11 +1,11 @@ from __future__ import annotations + from uuid import UUID from pydantic import BaseModel from game.server.leaflet import LeafletPoint from game.theater.iadsnetwork.iadsnetwork import IadsNetworkNode, IadsNetwork -from game.theater.theatergroundobject import TheaterGroundObject class IadsConnectionJs(BaseModel): diff --git a/game/server/iadsnetwork/routes.py b/game/server/iadsnetwork/routes.py index 81cd28b1..8bc35a02 100644 --- a/game/server/iadsnetwork/routes.py +++ b/game/server/iadsnetwork/routes.py @@ -1,4 +1,5 @@ from uuid import UUID + from fastapi import APIRouter, Depends from game import Game diff --git a/game/server/supplyroutes/models.py b/game/server/supplyroutes/models.py index 68a8da5e..cc1dffed 100644 --- a/game/server/supplyroutes/models.py +++ b/game/server/supplyroutes/models.py @@ -1,8 +1,6 @@ from __future__ import annotations -import uuid from typing import Any, TYPE_CHECKING -from uuid import UUID from dcs import Point from pydantic import BaseModel diff --git a/game/squadrons/airwing.py b/game/squadrons/airwing.py index c674b617..de035b36 100644 --- a/game/squadrons/airwing.py +++ b/game/squadrons/airwing.py @@ -4,9 +4,9 @@ import itertools from collections import defaultdict from typing import Sequence, Iterator, TYPE_CHECKING, Optional -from game.dcs.aircrafttype import AircraftType from game.ato.ai_flight_planner_db import aircraft_for_task from game.ato.closestairfields import ObjectiveDistanceCache +from game.dcs.aircrafttype import AircraftType from .squadrondefloader import SquadronDefLoader from ..campaignloader.squadrondefgenerator import SquadronDefGenerator from ..factions.faction import Faction diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 583b164d..c23f158b 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -63,7 +63,6 @@ from .frontline import FrontLine from .missiontarget import MissionTarget from .theatergroundobject import ( GenericCarrierGroundObject, - IadsGroundObject, TheaterGroundObject, VehicleGroupGroundObject, ) @@ -1177,7 +1176,10 @@ class NavalControlPoint(ControlPoint, ABC): # TODO: Inter-ship logistics? ] else: - yield FlightType.ANTISHIP + yield from [ + FlightType.ANTISHIP, + FlightType.SEAD_ESCORT, + ] yield from super().mission_types(for_player) @property @@ -1425,6 +1427,7 @@ class Fob(ControlPoint): if not self.is_friendly(for_player): yield FlightType.STRIKE yield FlightType.AIR_ASSAULT + yield FlightType.OCA_AIRCRAFT yield from super().mission_types(for_player) diff --git a/game/theater/iadsnetwork/iadsnetwork.py b/game/theater/iadsnetwork/iadsnetwork.py index e053f479..6b1fdadf 100644 --- a/game/theater/iadsnetwork/iadsnetwork.py +++ b/game/theater/iadsnetwork/iadsnetwork.py @@ -1,13 +1,14 @@ from __future__ import annotations -from collections import defaultdict -from dataclasses import dataclass, field import logging +import uuid +from collections import defaultdict +from dataclasses import dataclass, field from typing import TYPE_CHECKING, Iterator, Optional from uuid import UUID -import uuid -from game.theater.iadsnetwork.iadsrole import IadsRole + from game.dcs.groundunittype import GroundUnitType +from game.theater.iadsnetwork.iadsrole import IadsRole from game.theater.theatergroundobject import ( IadsBuildingGroundObject, IadsGroundObject, diff --git a/game/theater/iadsnetwork/iadsrole.py b/game/theater/iadsnetwork/iadsrole.py index 135d1208..d6fbd365 100644 --- a/game/theater/iadsnetwork/iadsrole.py +++ b/game/theater/iadsnetwork/iadsrole.py @@ -1,9 +1,8 @@ from __future__ import annotations -from dataclasses import dataclass, field from enum import Enum -from game.data.groups import GroupTask +from game.data.groups import GroupTask from game.utils import Distance diff --git a/game/theater/landmap.py b/game/theater/landmap.py index 8192b057..d3663e9a 100644 --- a/game/theater/landmap.py +++ b/game/theater/landmap.py @@ -1,9 +1,9 @@ -from dataclasses import dataclass -import pickle -from functools import cached_property -from typing import Optional, Tuple, Union import logging +import pickle +from dataclasses import dataclass +from functools import cached_property from pathlib import Path +from typing import Optional, Union from shapely import geometry from shapely.geometry import MultiPolygon, Polygon diff --git a/game/theater/missiontarget.py b/game/theater/missiontarget.py index eeeb5dc7..dbb7241b 100644 --- a/game/theater/missiontarget.py +++ b/game/theater/missiontarget.py @@ -1,10 +1,8 @@ from __future__ import annotations -from collections.abc import Sequence -from typing import Iterator, TYPE_CHECKING, Union +from typing import Iterator, TYPE_CHECKING from dcs.mapping import Point -from dcs.unit import Unit if TYPE_CHECKING: from game.ato.flighttype import FlightType diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 82ec646d..bc163989 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -52,10 +52,12 @@ class GeneratorSettings: @dataclass class ModSettings: a4_skyhawk: bool = False + a6a_intruder: bool = False f4b_phantom: bool = False f15d_baz: bool = False f_16_idf: bool = False f22_raptor: bool = False + f84g_thunderjet: bool = False f100_supersabre: bool = False f104_starfighter: bool = False f105_thunderchief: bool = False diff --git a/game/theater/theatergroundobject.py b/game/theater/theatergroundobject.py index 6bfb7c2f..479a8144 100644 --- a/game/theater/theatergroundobject.py +++ b/game/theater/theatergroundobject.py @@ -6,7 +6,6 @@ from abc import ABC from typing import Any, Iterator, List, Optional, TYPE_CHECKING from dcs.mapping import Point - from shapely.geometry import Point as ShapelyPoint from game.sidc import ( @@ -351,7 +350,10 @@ class NavalGroundObject(TheaterGroundObject, ABC): from game.ato import FlightType if not self.is_friendly(for_player): - yield FlightType.ANTISHIP + yield from [ + FlightType.ANTISHIP, + FlightType.SEAD_ESCORT, + ] yield from super().mission_types(for_player) @property diff --git a/game/unitmap.py b/game/unitmap.py index 8298c14b..066536ff 100644 --- a/game/unitmap.py +++ b/game/unitmap.py @@ -10,10 +10,10 @@ from dcs.triggers import TriggerZone from dcs.unit import Unit from dcs.unitgroup import FlyingGroup, VehicleGroup, ShipGroup +from game.ato.flight import Flight from game.dcs.groundunittype import GroundUnitType from game.squadrons import Pilot from game.theater import Airfield, ControlPoint, TheaterUnit -from game.ato.flight import Flight from game.theater.theatergroup import SceneryUnit if TYPE_CHECKING: diff --git a/game/weather.py b/game/weather.py index 47d83211..8ae4720f 100644 --- a/game/weather.py +++ b/game/weather.py @@ -9,7 +9,6 @@ from typing import Optional, TYPE_CHECKING from dcs.cloud_presets import Clouds as PydcsClouds from dcs.weather import CloudPreset, Weather as PydcsWeather, Wind -from game.theater.daytimemap import DaytimeMap from game.theater.seasonalconditions import determine_season from game.timeofday import TimeOfDay from game.utils import Distance, Heading, Pressure, inches_hg, interpolate, meters diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index 9d3186c7..8182fb3e 100644 --- a/pydcs_extensions/__init__.py +++ b/pydcs_extensions/__init__.py @@ -1,5 +1,10 @@ from .a4ec import * +from .a6a import * +from .f4b import * +from .f84g import * +from .f100 import * from .f104 import * +from .f105 import * from .f22a import * from .frenchpack import * from .hercules import * diff --git a/pydcs_extensions/a6a/a6a.py b/pydcs_extensions/a6a/a6a.py new file mode 100644 index 00000000..f2120ee6 --- /dev/null +++ b/pydcs_extensions/a6a/a6a.py @@ -0,0 +1,257 @@ +from typing import Set + +from dcs import task +from dcs.planes import PlaneType +from dcs.weapons_data import Weapons +from dcs.liveries_scanner import Liveries + +from game.modsupport import planemod + + +@planemod +class VSN_A6A(PlaneType): + id = "VSN_A6A" + flyable = True + group_size_max = 1 + height = 4.57 + width = 10.15 + length = 17.98 + fuel_max = 6994 + max_speed = 1047.96 + chaff = 30 + flare = 30 + charge_total = 60 + chaff_charge_size = 1 + flare_charge_size = 1 + eplrs = True + radio_frequency = 250.5 + + livery_name = "VSN_A6A" # from type + Liveries = Liveries()[livery_name] + + class Pylon1: + F_5_275Gal_Fuel_tank = (1, Weapons.F_5_275Gal_Fuel_tank) + AIM_9M_Sidewinder_IR_AAM = (1, Weapons.AIM_9M_Sidewinder_IR_AAM) + AIM_9X_Sidewinder_IR_AAM = (1, Weapons.AIM_9X_Sidewinder_IR_AAM) + Mk_82___500lb_GP_Bomb_LD = (1, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_83___1000lb_GP_Bomb_LD = (1, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (1, Weapons.Mk_84___2000lb_GP_Bomb_LD) + BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = ( + 1, + Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD, + ) + BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD = ( + 1, + Weapons.BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 1, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 1, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 1, + Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 1, + Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 1, + Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 1, + Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {ac94375e-aa45-491e-858b-a8b93ee8b959} + # ERRR + + class Pylon2: + F_5_275Gal_Fuel_tank = (2, Weapons.F_5_275Gal_Fuel_tank) + AIM_9M_Sidewinder_IR_AAM = (2, Weapons.AIM_9M_Sidewinder_IR_AAM) + AIM_9X_Sidewinder_IR_AAM = (2, Weapons.AIM_9X_Sidewinder_IR_AAM) + Mk_82___500lb_GP_Bomb_LD = (2, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_83___1000lb_GP_Bomb_LD = (2, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (2, Weapons.Mk_84___2000lb_GP_Bomb_LD) + MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD = ( + 2, + Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD, + ) + MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = ( + 2, + Weapons.MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets, + ) + BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = ( + 2, + Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD, + ) + BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD = ( + 2, + Weapons.BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 2, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 2, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 2, + Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 2, + Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 2, + Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 2, + Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {ac94375e-aa45-491e-858b-a8b93ee8b959} + # ERRR + + class Pylon3: + F_5_275Gal_Fuel_tank = (3, Weapons.F_5_275Gal_Fuel_tank) + Mk_82___500lb_GP_Bomb_LD = (3, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD) + MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD = ( + 3, + Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD, + ) + MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = ( + 3, + Weapons.MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets, + ) + BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = ( + 3, + Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD, + ) + BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD = ( + 3, + Weapons.BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD, + ) + + # ERRR {ac94375e-aa45-491e-858b-a8b93ee8b959} + # ERRR + + class Pylon4: + F_5_275Gal_Fuel_tank = (4, Weapons.F_5_275Gal_Fuel_tank) + AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM) + AIM_9X_Sidewinder_IR_AAM = (4, Weapons.AIM_9X_Sidewinder_IR_AAM) + Mk_82___500lb_GP_Bomb_LD = (4, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (4, Weapons.Mk_84___2000lb_GP_Bomb_LD) + MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD = ( + 4, + Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD, + ) + MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = ( + 4, + Weapons.MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets, + ) + BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = ( + 4, + Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD, + ) + BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD = ( + 4, + Weapons.BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 4, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 4, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 4, + Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 4, + Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 4, + Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 4, + Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {ac94375e-aa45-491e-858b-a8b93ee8b959} + # ERRR + + class Pylon5: + F_5_275Gal_Fuel_tank = (5, Weapons.F_5_275Gal_Fuel_tank) + AIM_9M_Sidewinder_IR_AAM = (5, Weapons.AIM_9M_Sidewinder_IR_AAM) + AIM_9X_Sidewinder_IR_AAM = (5, Weapons.AIM_9X_Sidewinder_IR_AAM) + Mk_82___500lb_GP_Bomb_LD = (5, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_83___1000lb_GP_Bomb_LD = (5, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (5, Weapons.Mk_84___2000lb_GP_Bomb_LD) + BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = ( + 5, + Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD, + ) + BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD = ( + 5, + Weapons.BRU_42_with_3_x_Mk_82_AIR_Ballute___500lb_GP_Bombs_HD, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 5, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 5, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 5, + Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 5, + Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 5, + Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 5, + Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {ac94375e-aa45-491e-858b-a8b93ee8b959} + # ERRR + + pylons: Set[int] = {1, 2, 3, 4, 5} + + tasks = [ + task.Escort, + task.Reconnaissance, + task.GroundAttack, + task.CAS, + task.AFAC, + task.RunwayAttack, + task.AntishipStrike, + task.SEAD, + ] + task_default = task.GroundAttack diff --git a/pydcs_extensions/f4b/f4b.py b/pydcs_extensions/f4b/f4b.py index a6b1e9ed..20953812 100644 --- a/pydcs_extensions/f4b/f4b.py +++ b/pydcs_extensions/f4b/f4b.py @@ -1,6 +1,3 @@ -from enum import Enum -from typing import Dict, Any - from dcs import task from dcs.planes import PlaneType from dcs.weapons_data import Weapons diff --git a/pydcs_extensions/f84g/f84g.py b/pydcs_extensions/f84g/f84g.py new file mode 100644 index 00000000..e0e8bb32 --- /dev/null +++ b/pydcs_extensions/f84g/f84g.py @@ -0,0 +1,217 @@ +from typing import Set + +from dcs import task +from dcs.liveries_scanner import Liveries +from dcs.planes import PlaneType +from dcs.weapons_data import Weapons + +from game.modsupport import planemod +from pydcs_extensions.weapon_injector import inject_weapons + + +class WeaponsF84G: + Tank = {"clsid": "{PTB_F84G}", "name": "Tank", "weight": 910} + + +inject_weapons(WeaponsF84G) + + +@planemod +class VSN_F84G(PlaneType): + id = "VSN_F84G" + flyable = True + height = 4.496 + width = 11.9 + length = 11.43 + fuel_max = 1282 + max_speed = 964.8 + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 127.5 + + livery_name = "VSN_F84G" # from type + Liveries = Liveries()[livery_name] + + class Pylon2: + Tank = (2, WeaponsF84G.Tank) + + class Pylon3: + AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (3, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod) + AIM_9B_Sidewinder_IR_AAM = (3, Weapons.AIM_9B_Sidewinder_IR_AAM) + Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = ( + 3, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk, + ) + M117___750lb_GP_Bomb_LD = (3, Weapons.M117___750lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD_ = (3, Weapons.AN_M64___500lb_GP_Bomb_LD_) + _2_x_HVAR__UnGd_Rkts = (3, Weapons._2_x_HVAR__UnGd_Rkts) + # ERRR + Smoke_Generator___red_ = (3, Weapons.Smoke_Generator___red_) + Smoke_Generator___green_ = (3, Weapons.Smoke_Generator___green_) + Smoke_Generator___blue_ = (3, Weapons.Smoke_Generator___blue_) + Smoke_Generator___white_ = (3, Weapons.Smoke_Generator___white_) + Smoke_Generator___yellow_ = (3, Weapons.Smoke_Generator___yellow_) + Smoke_Generator___orange_ = (3, Weapons.Smoke_Generator___orange_) + + class Pylon6: + Smoke_Generator___red_ = (6, Weapons.Smoke_Generator___red_) + Smoke_Generator___green_ = (6, Weapons.Smoke_Generator___green_) + Smoke_Generator___blue_ = (6, Weapons.Smoke_Generator___blue_) + Smoke_Generator___white_ = (6, Weapons.Smoke_Generator___white_) + Smoke_Generator___yellow_ = (6, Weapons.Smoke_Generator___yellow_) + Smoke_Generator___orange_ = (6, Weapons.Smoke_Generator___orange_) + + class Pylon9: + AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (9, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod) + AIM_9B_Sidewinder_IR_AAM = (9, Weapons.AIM_9B_Sidewinder_IR_AAM) + Mk_83___1000lb_GP_Bomb_LD = (9, Weapons.Mk_83___1000lb_GP_Bomb_LD) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = ( + 9, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = ( + 9, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk, + ) + M117___750lb_GP_Bomb_LD = (9, Weapons.M117___750lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD_ = (9, Weapons.AN_M64___500lb_GP_Bomb_LD_) + _2_x_HVAR__UnGd_Rkts = (9, Weapons._2_x_HVAR__UnGd_Rkts) + # ERRR + Smoke_Generator___red_ = (9, Weapons.Smoke_Generator___red_) + Smoke_Generator___green_ = (9, Weapons.Smoke_Generator___green_) + Smoke_Generator___blue_ = (9, Weapons.Smoke_Generator___blue_) + Smoke_Generator___white_ = (9, Weapons.Smoke_Generator___white_) + Smoke_Generator___yellow_ = (9, Weapons.Smoke_Generator___yellow_) + Smoke_Generator___orange_ = (9, Weapons.Smoke_Generator___orange_) + + class Pylon10: + Tank = (10, WeaponsF84G.Tank) + + pylons: Set[int] = {2, 3, 6, 9, 10} + + tasks = [ + task.CAP, + task.CAS, + task.Escort, + task.FighterSweep, + task.GroundAttack, + task.Intercept, + task.AntishipStrike, + ] + task_default = task.GroundAttack diff --git a/qt_ui/main.py b/qt_ui/main.py index f66ad404..30f38e55 100644 --- a/qt_ui/main.py +++ b/qt_ui/main.py @@ -306,8 +306,10 @@ def create_game( ), ModSettings( a4_skyhawk=False, + a6a_intruder=False, f4b_phantom=False, f22_raptor=False, + f84g_thunderjet=False, f100_supersabre=False, f104_starfighter=False, f105_thunderchief=False, diff --git a/qt_ui/uiconstants.py b/qt_ui/uiconstants.py index 4d239c16..e32ab635 100644 --- a/qt_ui/uiconstants.py +++ b/qt_ui/uiconstants.py @@ -63,10 +63,18 @@ def load_icons(): ICONS["Hangar"] = QPixmap("./resources/ui/misc/hangar.png") - ICONS["Dawn"] = QPixmap("./resources/ui/conditions/timeofday/dawn.png") - ICONS["Day"] = QPixmap("./resources/ui/conditions/timeofday/day.png") - ICONS["Dusk"] = QPixmap("./resources/ui/conditions/timeofday/dusk.png") - ICONS["Night"] = QPixmap("./resources/ui/conditions/timeofday/night.png") + ICONS["Dawn"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/timeofday/dawn.png" + ) + ICONS["Day"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/timeofday/day.png" + ) + ICONS["Dusk"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/timeofday/dusk.png" + ) + ICONS["Night"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/timeofday/night.png" + ) ICONS["Money"] = QPixmap( "./resources/ui/misc/" + get_theme_icons() + "/money_icon.png" @@ -116,46 +124,64 @@ def load_icons(): """ Weather Icons """ - ICONS["Weather_winds"] = QPixmap("./resources/ui/conditions/weather/winds.png") + ICONS["Weather_winds"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/weather/winds.png" + ) ICONS["Weather_day-clear"] = QPixmap( - "./resources/ui/conditions/weather/day-clear.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/day-clear.png" ) ICONS["Weather_day-cloudy-fog"] = QPixmap( - "./resources/ui/conditions/weather/day-cloudy-fog.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/day-cloudy-fog.png" + ) + ICONS["Weather_day-fog"] = QPixmap( + "./resources/ui/conditions/" + get_theme_icons() + "/weather/day-fog.png" ) - ICONS["Weather_day-fog"] = QPixmap("./resources/ui/conditions/weather/day-fog.png") ICONS["Weather_day-partly-cloudy"] = QPixmap( - "./resources/ui/conditions/weather/day-partly-cloudy.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/day-partly-cloudy.png" ) ICONS["Weather_day-rain"] = QPixmap( - "./resources/ui/conditions/weather/day-rain.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/day-rain.png" ) ICONS["Weather_day-thunderstorm"] = QPixmap( - "./resources/ui/conditions/weather/day-thunderstorm.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/day-thunderstorm.png" ) ICONS["Weather_day-totally-cloud"] = QPixmap( - "./resources/ui/conditions/weather/day-totally-cloud.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/day-totally-cloud.png" ) ICONS["Weather_night-clear"] = QPixmap( - "./resources/ui/conditions/weather/night-clear.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/night-clear.png" ) ICONS["Weather_night-cloudy-fog"] = QPixmap( - "./resources/ui/conditions/weather/night-cloudy-fog.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/night-cloudy-fog.png" ) ICONS["Weather_night-fog"] = QPixmap( - "./resources/ui/conditions/weather/night-fog.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/night-fog.png" ) ICONS["Weather_night-partly-cloudy"] = QPixmap( - "./resources/ui/conditions/weather/night-partly-cloudy.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/night-partly-cloudy.png" ) ICONS["Weather_night-rain"] = QPixmap( - "./resources/ui/conditions/weather/night-rain.png" + "./resources/ui/conditions/" + get_theme_icons() + "/weather/night-rain.png" ) ICONS["Weather_night-thunderstorm"] = QPixmap( - "./resources/ui/conditions/weather/night-thunderstorm.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/night-thunderstorm.png" ) ICONS["Weather_night-totally-cloud"] = QPixmap( - "./resources/ui/conditions/weather/night-totally-cloud.png" + "./resources/ui/conditions/" + + get_theme_icons() + + "/weather/night-totally-cloud.png" ) ICONS["heading"] = QPixmap("./resources/ui/misc/heading.png") diff --git a/qt_ui/widgets/QBudgetBox.py b/qt_ui/widgets/QBudgetBox.py index 30713c92..cff1cbf5 100644 --- a/qt_ui/widgets/QBudgetBox.py +++ b/qt_ui/widgets/QBudgetBox.py @@ -1,4 +1,4 @@ -from PySide2.QtWidgets import QLabel, QHBoxLayout, QGroupBox, QPushButton +from PySide2.QtWidgets import QHBoxLayout, QGroupBox, QPushButton import qt_ui.uiconstants as CONST from game import Game diff --git a/qt_ui/widgets/QFactionsInfos.py b/qt_ui/widgets/QFactionsInfos.py index c0ca25cd..a0244227 100644 --- a/qt_ui/widgets/QFactionsInfos.py +++ b/qt_ui/widgets/QFactionsInfos.py @@ -1,4 +1,5 @@ from PySide2.QtWidgets import QLabel, QGroupBox, QGridLayout + from game import Game diff --git a/qt_ui/widgets/QIntelBox.py b/qt_ui/widgets/QIntelBox.py index cd22b898..eb50d1a0 100644 --- a/qt_ui/widgets/QIntelBox.py +++ b/qt_ui/widgets/QIntelBox.py @@ -41,15 +41,6 @@ class QIntelBox(QGroupBox): self.economic_strength = QLabel() summary.addWidget(self.economic_strength, 2, 1) - # some dirty styling to make the labels show up well on the button - button_text_style = "background-color: rgba(0,0,0,0%); color: white;" - air_superiority.setStyleSheet(button_text_style) - front_line.setStyleSheet(button_text_style) - economy.setStyleSheet(button_text_style) - self.air_strength.setStyleSheet(button_text_style) - self.ground_strength.setStyleSheet(button_text_style) - self.economic_strength.setStyleSheet(button_text_style) - self.details = QPushButton() self.details.setMinimumHeight(50) self.details.setMinimumWidth(210) diff --git a/qt_ui/widgets/QTopPanel.py b/qt_ui/widgets/QTopPanel.py index c8166759..102ac14c 100644 --- a/qt_ui/widgets/QTopPanel.py +++ b/qt_ui/widgets/QTopPanel.py @@ -11,7 +11,6 @@ from PySide2.QtWidgets import ( import qt_ui.uiconstants as CONST from game import Game, persistency -from game.game import TurnState from game.ato.package import Package from game.ato.traveltime import TotEstimator from game.profiling import logged_duration diff --git a/qt_ui/widgets/combos/QAircraftTypeSelector.py b/qt_ui/widgets/combos/QAircraftTypeSelector.py index f64a55b0..7fe8f0c2 100644 --- a/qt_ui/widgets/combos/QAircraftTypeSelector.py +++ b/qt_ui/widgets/combos/QAircraftTypeSelector.py @@ -1,5 +1,6 @@ """Combo box for selecting aircraft types.""" from PySide2.QtWidgets import QComboBox + from game.dcs.aircrafttype import AircraftType diff --git a/qt_ui/widgets/combos/QFlightTypeComboBox.py b/qt_ui/widgets/combos/QFlightTypeComboBox.py index bb214ad3..235049f8 100644 --- a/qt_ui/widgets/combos/QFlightTypeComboBox.py +++ b/qt_ui/widgets/combos/QFlightTypeComboBox.py @@ -1,9 +1,9 @@ """Combo box for selecting a flight's task type.""" from PySide2.QtWidgets import QComboBox + from game.ato.flighttype import FlightType from game.settings.settings import Settings - from game.theater import ConflictTheater, MissionTarget diff --git a/qt_ui/widgets/views/QStrikeTargetInfoView.py b/qt_ui/widgets/views/QStrikeTargetInfoView.py index 26feac8e..4c21d01a 100644 --- a/qt_ui/widgets/views/QStrikeTargetInfoView.py +++ b/qt_ui/widgets/views/QStrikeTargetInfoView.py @@ -1,10 +1,6 @@ -import random - from PySide2.QtGui import QStandardItemModel, QStandardItem from PySide2.QtWidgets import ( QGroupBox, - QLabel, - QWidget, QVBoxLayout, QListView, QAbstractItemView, diff --git a/qt_ui/windows/AirWingConfigurationDialog.py b/qt_ui/windows/AirWingConfigurationDialog.py index 4b30e412..00c46693 100644 --- a/qt_ui/windows/AirWingConfigurationDialog.py +++ b/qt_ui/windows/AirWingConfigurationDialog.py @@ -29,6 +29,7 @@ from PySide2.QtWidgets import ( QToolButton, QMessageBox, ) + from game import Game from game.ato.flighttype import FlightType from game.coalition import Coalition diff --git a/qt_ui/windows/AirWingDialog.py b/qt_ui/windows/AirWingDialog.py index d6a4b930..e31130b4 100644 --- a/qt_ui/windows/AirWingDialog.py +++ b/qt_ui/windows/AirWingDialog.py @@ -17,9 +17,9 @@ from PySide2.QtWidgets import ( QHBoxLayout, ) +from game.ato.flight import Flight from game.squadrons import Squadron from game.theater import ConflictTheater -from game.ato.flight import Flight from qt_ui.delegates import TwoColumnRowDelegate from qt_ui.models import GameModel, AirWingModel, SquadronModel, AtoModel from qt_ui.windows.SquadronDialog import SquadronDialog diff --git a/qt_ui/windows/GameUpdateSignal.py b/qt_ui/windows/GameUpdateSignal.py index 00e96264..ba7309c2 100644 --- a/qt_ui/windows/GameUpdateSignal.py +++ b/qt_ui/windows/GameUpdateSignal.py @@ -5,8 +5,8 @@ from typing import Optional from PySide2.QtCore import QObject, Signal from game import Game -from game.game import TurnState from game.debriefing import Debriefing +from game.game import TurnState class GameUpdateSignal(QObject): diff --git a/qt_ui/windows/QDebriefingWindow.py b/qt_ui/windows/QDebriefingWindow.py index ab0e67f0..9e2b6711 100644 --- a/qt_ui/windows/QDebriefingWindow.py +++ b/qt_ui/windows/QDebriefingWindow.py @@ -12,10 +12,8 @@ from PySide2.QtWidgets import ( ) from game.debriefing import Debriefing -from game.game import TurnState from qt_ui.windows.GameUpdateSignal import GameUpdateSignal - T = TypeVar("T") diff --git a/qt_ui/windows/QUnitInfoWindow.py b/qt_ui/windows/QUnitInfoWindow.py index 577eef00..d59f3bed 100644 --- a/qt_ui/windows/QUnitInfoWindow.py +++ b/qt_ui/windows/QUnitInfoWindow.py @@ -11,11 +11,11 @@ from PySide2.QtWidgets import ( ) import game.ato.ai_flight_planner_db +from game.ato.flighttype import FlightType from game.dcs.aircrafttype import AircraftType from game.dcs.groundunittype import GroundUnitType from game.dcs.unittype import UnitType from game.game import Game -from game.ato.flighttype import FlightType from qt_ui.uiconstants import AIRCRAFT_BANNERS, VEHICLE_BANNERS diff --git a/qt_ui/windows/basemenu/QBaseMenu2.py b/qt_ui/windows/basemenu/QBaseMenu2.py index 5f56f3be..6932c6b8 100644 --- a/qt_ui/windows/basemenu/QBaseMenu2.py +++ b/qt_ui/windows/basemenu/QBaseMenu2.py @@ -9,12 +9,10 @@ from PySide2.QtWidgets import ( QVBoxLayout, QWidget, ) -from dcs.ships import Stennis, KUZNECOW from game import Game from game.ato.flighttype import FlightType from game.config import RUNWAY_REPAIR_COST -from game.game import TurnState from game.server import EventStream from game.sim import GameUpdateEvents from game.theater import ( diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index c82605b8..dc4ce0d5 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -11,12 +11,12 @@ from PySide2.QtWidgets import ( ) from game.dcs.aircrafttype import AircraftType +from game.purchaseadapter import AircraftPurchaseAdapter from game.squadrons import Squadron from game.theater import ControlPoint from qt_ui.models import GameModel from qt_ui.uiconstants import ICONS from qt_ui.windows.basemenu.UnitTransactionFrame import UnitTransactionFrame -from game.purchaseadapter import AircraftPurchaseAdapter class QAircraftRecruitmentMenu(UnitTransactionFrame[Squadron]): diff --git a/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py b/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py index 77e2af8f..6149ce8e 100644 --- a/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py @@ -2,10 +2,10 @@ from PySide2.QtCore import Qt from PySide2.QtWidgets import QGridLayout, QScrollArea, QVBoxLayout, QWidget from game.dcs.groundunittype import GroundUnitType +from game.purchaseadapter import GroundUnitPurchaseAdapter from game.theater import ControlPoint from qt_ui.models import GameModel from qt_ui.windows.basemenu.UnitTransactionFrame import UnitTransactionFrame -from game.purchaseadapter import GroundUnitPurchaseAdapter class QArmorRecruitmentMenu(UnitTransactionFrame[GroundUnitType]): diff --git a/qt_ui/windows/groundobject/QBuildingInfo.py b/qt_ui/windows/groundobject/QBuildingInfo.py index aa4e67ba..8a762a31 100644 --- a/qt_ui/windows/groundobject/QBuildingInfo.py +++ b/qt_ui/windows/groundobject/QBuildingInfo.py @@ -2,9 +2,9 @@ import os from PySide2.QtGui import QPixmap from PySide2.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QVBoxLayout -from game.theater import TheaterUnit from game.config import REWARDS +from game.theater import TheaterUnit class QBuildingInfo(QGroupBox): diff --git a/qt_ui/windows/infos/QInfoList.py b/qt_ui/windows/infos/QInfoList.py index 7614d21f..f6f02cfb 100644 --- a/qt_ui/windows/infos/QInfoList.py +++ b/qt_ui/windows/infos/QInfoList.py @@ -2,7 +2,7 @@ from PySide2.QtCore import QItemSelectionModel, QPoint from PySide2.QtGui import QStandardItemModel from PySide2.QtWidgets import QListView -from game import Game, game +from game import Game from qt_ui.windows.infos.QInfoItem import QInfoItem diff --git a/qt_ui/windows/infos/QInfoPanel.py b/qt_ui/windows/infos/QInfoPanel.py index 2bb021ab..1bfbc204 100644 --- a/qt_ui/windows/infos/QInfoPanel.py +++ b/qt_ui/windows/infos/QInfoPanel.py @@ -1,4 +1,4 @@ -from PySide2.QtWidgets import QFrame, QVBoxLayout, QLabel, QGroupBox +from PySide2.QtWidgets import QVBoxLayout, QGroupBox from game import Game from qt_ui.windows.infos.QInfoList import QInfoList diff --git a/qt_ui/windows/logs/QLogsWindow.py b/qt_ui/windows/logs/QLogsWindow.py index 47bc872e..bc15d6ad 100644 --- a/qt_ui/windows/logs/QLogsWindow.py +++ b/qt_ui/windows/logs/QLogsWindow.py @@ -2,13 +2,13 @@ import logging import typing from PySide2.QtCore import Signal +from PySide2.QtGui import QTextCursor, QIcon from PySide2.QtWidgets import ( QDialog, QPlainTextEdit, QVBoxLayout, QPushButton, ) -from PySide2.QtGui import QTextCursor, QIcon from qt_ui.logging_handler import HookableInMemoryHandler diff --git a/qt_ui/windows/mission/flight/QFlightCreator.py b/qt_ui/windows/mission/flight/QFlightCreator.py index 1ffa8f0e..d882a4fd 100644 --- a/qt_ui/windows/mission/flight/QFlightCreator.py +++ b/qt_ui/windows/mission/flight/QFlightCreator.py @@ -14,12 +14,12 @@ from PySide2.QtWidgets import ( from dcs.unittype import FlyingType from game import Game +from game.ato.flight import Flight +from game.ato.flightroster import FlightRoster +from game.ato.package import Package from game.ato.starttype import StartType from game.squadrons.squadron import Squadron from game.theater import ControlPoint, OffMapSpawn -from game.ato.package import Package -from game.ato.flightroster import FlightRoster -from game.ato.flight import Flight from qt_ui.uiconstants import EVENT_ICONS from qt_ui.widgets.QFlightSizeSpinner import QFlightSizeSpinner from qt_ui.widgets.QLabeledWidget import QLabeledWidget diff --git a/qt_ui/windows/mission/flight/SquadronSelector.py b/qt_ui/windows/mission/flight/SquadronSelector.py index 0813843c..459de9d7 100644 --- a/qt_ui/windows/mission/flight/SquadronSelector.py +++ b/qt_ui/windows/mission/flight/SquadronSelector.py @@ -3,9 +3,9 @@ from typing import Optional from PySide2.QtWidgets import QComboBox +from game.ato.flighttype import FlightType from game.dcs.aircrafttype import AircraftType from game.squadrons.airwing import AirWing -from game.ato.flighttype import FlightType class SquadronSelector(QComboBox): diff --git a/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py b/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py index a41edb92..0b70af76 100644 --- a/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py +++ b/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py @@ -7,8 +7,8 @@ from PySide2.QtWidgets import ( ) from game import Game -from game.data.weapons import Pylon from game.ato.flight import Flight +from game.data.weapons import Pylon from qt_ui.windows.mission.flight.payload.QPylonEditor import QPylonEditor diff --git a/qt_ui/windows/mission/flight/payload/QPylonEditor.py b/qt_ui/windows/mission/flight/payload/QPylonEditor.py index acb4151e..057e12bf 100644 --- a/qt_ui/windows/mission/flight/payload/QPylonEditor.py +++ b/qt_ui/windows/mission/flight/payload/QPylonEditor.py @@ -5,9 +5,9 @@ from typing import Optional from PySide2.QtWidgets import QComboBox from game import Game -from game.data.weapons import Pylon, Weapon from game.ato.flight import Flight from game.ato.loadouts import Loadout +from game.data.weapons import Pylon, Weapon class QPylonEditor(QComboBox): diff --git a/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py b/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py index 8ff93f73..fd403442 100644 --- a/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py +++ b/qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py @@ -14,9 +14,9 @@ from PySide2.QtWidgets import ( ) from game import Game -from game.squadrons.pilot import Pilot -from game.ato.flightroster import FlightRoster from game.ato.flight import Flight +from game.ato.flightroster import FlightRoster +from game.squadrons.pilot import Pilot from qt_ui.models import PackageModel diff --git a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py index d52d438e..0c9070a5 100644 --- a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py +++ b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py @@ -7,12 +7,12 @@ from qt_ui.models import PackageModel from qt_ui.windows.mission.flight.settings.FlightAirfieldDisplay import ( FlightAirfieldDisplay, ) +from qt_ui.windows.mission.flight.settings.QCustomName import QFlightCustomName from qt_ui.windows.mission.flight.settings.QFlightSlotEditor import QFlightSlotEditor from qt_ui.windows.mission.flight.settings.QFlightStartType import QFlightStartType from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import ( QFlightTypeTaskInfo, ) -from qt_ui.windows.mission.flight.settings.QCustomName import QFlightCustomName class QGeneralFlightSettingsTab(QFrame): diff --git a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointItem.py b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointItem.py index 545c3a5d..0f84f9dd 100644 --- a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointItem.py +++ b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointItem.py @@ -1,5 +1,3 @@ -from typing import List - from PySide2.QtGui import QStandardItem from game.ato.flightwaypoint import FlightWaypoint diff --git a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointList.py b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointList.py index 5044315e..49a417ab 100644 --- a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointList.py +++ b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointList.py @@ -4,10 +4,10 @@ from PySide2.QtCore import QItemSelectionModel, QPoint from PySide2.QtGui import QStandardItem, QStandardItemModel from PySide2.QtWidgets import QHeaderView, QTableView -from game.ato.package import Package -from game.ato.flightwaypointtype import FlightWaypointType -from game.ato.flightwaypoint import FlightWaypoint from game.ato.flight import Flight +from game.ato.flightwaypoint import FlightWaypoint +from game.ato.flightwaypointtype import FlightWaypointType +from game.ato.package import Package from qt_ui.windows.mission.flight.waypoints.QFlightWaypointItem import QWaypointItem diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 55a1f08b..768c5710 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -159,10 +159,12 @@ class NewGameWizard(QtWidgets.QWizard): ) mod_settings = ModSettings( a4_skyhawk=self.field("a4_skyhawk"), + a6a_intruder=self.field("a6a_intruder"), f4b_phantom=self.field("f4b_phantom"), f15d_baz=self.field("f15d_baz"), f_16_idf=self.field("f_16_idf"), f22_raptor=self.field("f22_raptor"), + f84g_thunderjet=self.field("f84g_thunderjet"), f100_supersabre=self.field("f100_supersabre"), f104_starfighter=self.field("f104_starfighter"), f105_thunderchief=self.field("f105_thunderchief"), @@ -657,6 +659,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): modSettingsGroup = QtWidgets.QGroupBox("Mod Settings") a4_skyhawk = QtWidgets.QCheckBox() self.registerField("a4_skyhawk", a4_skyhawk) + a6a_intruder = QtWidgets.QCheckBox() + self.registerField("a6a_intruder", a6a_intruder) hercules = QtWidgets.QCheckBox() self.registerField("hercules", hercules) uh_60l = QtWidgets.QCheckBox() @@ -669,6 +673,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.registerField("f_16_idf", f_16_idf) f22_raptor = QtWidgets.QCheckBox() self.registerField("f22_raptor", f22_raptor) + f84g_thunderjet = QtWidgets.QCheckBox() + self.registerField("f84g_thunderjet", f84g_thunderjet) f100_supersabre = QtWidgets.QCheckBox() self.registerField("f100_supersabre", f100_supersabre) f104_starfighter = QtWidgets.QCheckBox() @@ -698,6 +704,11 @@ class GeneratorOptions(QtWidgets.QWizardPage): ) modLayout.addWidget(a4_skyhawk, modLayout_row, 1) modLayout_row += 1 + modLayout.addWidget( + QtWidgets.QLabel("A-6A Intruder (v2.7.5.01)"), modLayout_row, 0 + ) + modLayout.addWidget(a6a_intruder, modLayout_row, 1) + modLayout_row += 1 modLayout.addWidget( QtWidgets.QLabel("F-4B Phantom II (v2.7.10.02 EFM + Patch 2022.10.02)"), modLayout_row, @@ -715,11 +726,18 @@ class GeneratorOptions(QtWidgets.QWizardPage): ) modLayout.addWidget(f_16_idf, modLayout_row, 1) modLayout_row += 1 + # Section break here for readability + modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0) + modLayout_row += 1 modLayout.addWidget(QtWidgets.QLabel("F-22A Raptor"), modLayout_row, 0) modLayout.addWidget(f22_raptor, modLayout_row, 1) modLayout_row += 1 - # Section break here for readability - modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0) + modLayout.addWidget( + QtWidgets.QLabel("F-84G Thunderjet (version 2.5.7.01)"), + modLayout_row, + 0, + ) + modLayout.addWidget(f84g_thunderjet, modLayout_row, 1) modLayout_row += 1 modLayout.addWidget( QtWidgets.QLabel("F-100 Super Sabre (version 2.7.18.30765 patch 09.10.22)"), @@ -742,6 +760,9 @@ class GeneratorOptions(QtWidgets.QWizardPage): ) modLayout.addWidget(f105_thunderchief, modLayout_row, 1) modLayout_row += 1 + # Section break here for readability + modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0) + modLayout_row += 1 modLayout.addWidget( QtWidgets.QLabel("C-130J-30 Super Hercules"), modLayout_row, 0 ) @@ -752,9 +773,6 @@ class GeneratorOptions(QtWidgets.QWizardPage): ) modLayout.addWidget(uh_60l, modLayout_row, 1) modLayout_row += 1 - # Section break here for readability - modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0) - modLayout_row += 1 modLayout.addWidget( QtWidgets.QLabel("JAS 39 Gripen (version v1.8.0-beta)"), modLayout_row, 0 ) @@ -768,11 +786,16 @@ class GeneratorOptions(QtWidgets.QWizardPage): modLayout.addWidget(QtWidgets.QLabel("Su-57 Felon"), modLayout_row, 0) modLayout.addWidget(su57_felon, modLayout_row, 1) modLayout_row += 1 + # Section break here for readability + modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0) + modLayout_row += 14 modLayout.addWidget(QtWidgets.QLabel("Frenchpack"), modLayout_row, 0) modLayout.addWidget(frenchpack, modLayout_row, 1) - modLayout_row += 1 - modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 0) - modLayout.addWidget(high_digit_sams, modLayout_row, 1) + + # new column starts here + modLayout_row = 1 + modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 2) + modLayout.addWidget(high_digit_sams, modLayout_row, 3) modSettingsGroup.setLayout(modLayout) mlayout = QVBoxLayout() diff --git a/qt_ui/windows/notes/QNotesWindow.py b/qt_ui/windows/notes/QNotesWindow.py index cb1419b5..4726f5e9 100644 --- a/qt_ui/windows/notes/QNotesWindow.py +++ b/qt_ui/windows/notes/QNotesWindow.py @@ -1,3 +1,5 @@ +from PySide2.QtCore import QTimer +from PySide2.QtGui import QTextCursor from PySide2.QtWidgets import ( QDialog, QPlainTextEdit, @@ -6,14 +8,10 @@ from PySide2.QtWidgets import ( QPushButton, QLabel, ) -from PySide2.QtGui import QTextCursor -from PySide2.QtCore import QTimer import qt_ui.uiconstants as CONST from game.game import Game -from time import sleep - class QNotesWindow(QDialog): def __init__(self, game: Game): diff --git a/qt_ui/windows/preferences/QLiberationPreferencesWindow.py b/qt_ui/windows/preferences/QLiberationPreferencesWindow.py index e23a3c08..1a2d2aa8 100644 --- a/qt_ui/windows/preferences/QLiberationPreferencesWindow.py +++ b/qt_ui/windows/preferences/QLiberationPreferencesWindow.py @@ -1,4 +1,4 @@ -from PySide2.QtGui import QIcon, Qt +from PySide2.QtGui import QIcon from PySide2.QtWidgets import QDialog, QVBoxLayout, QPushButton, QHBoxLayout from qt_ui.windows.preferences.QLiberationPreferences import QLiberationPreferences diff --git a/qt_ui/windows/stats/QAircraftChart.py b/qt_ui/windows/stats/QAircraftChart.py index 6516ec58..439f775b 100644 --- a/qt_ui/windows/stats/QAircraftChart.py +++ b/qt_ui/windows/stats/QAircraftChart.py @@ -2,6 +2,7 @@ from PySide2.QtCharts import QtCharts from PySide2.QtCore import QPoint, Qt from PySide2.QtGui import QPainter from PySide2.QtWidgets import QFrame, QGridLayout + from game import Game diff --git a/qt_ui/windows/stats/QArmorChart.py b/qt_ui/windows/stats/QArmorChart.py index e952c717..4a140b32 100644 --- a/qt_ui/windows/stats/QArmorChart.py +++ b/qt_ui/windows/stats/QArmorChart.py @@ -2,6 +2,7 @@ from PySide2.QtCharts import QtCharts from PySide2.QtCore import QPoint, Qt from PySide2.QtGui import QPainter from PySide2.QtWidgets import QFrame, QGridLayout + from game import Game diff --git a/requirements.txt b/requirements.txt index 6205a0ee..98be4ba4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,22 +1,22 @@ -altgraph==0.17.2 -anyio==3.6.1 +altgraph==0.17.3 +anyio==3.6.2 asgiref==3.5.2 atomicwrites==1.4.1 -attrs==21.4.0 -black==22.6.0 -certifi==2022.6.15 +attrs==22.1.0 +black==22.10.0 +certifi==2022.9.24 cfgv==3.3.1 click==8.1.3 -colorama==0.4.5 -distlib==0.3.4 -Faker==13.15.0 -fastapi==0.78.0 -filelock==3.7.1 +colorama==0.4.6 +distlib==0.3.6 +Faker==15.1.1 +fastapi==0.85.1 +filelock==3.8.0 future==0.18.2 -h11==0.13.0 -httptools==0.4.0 -identify==2.5.1 -idna==3.3 +h11==0.14.0 +httptools==0.5.0 +identify==2.5.7 +idna==3.4 iniconfig==1.1.1 Jinja2==3.1.2 MarkupSafe==2.1.1 @@ -24,42 +24,42 @@ mypy==0.982 mypy-extensions==0.4.3 nodeenv==1.7.0 packaging==21.3 -pathspec==0.9.0 +pathspec==0.10.1 pefile==2022.5.30 Pillow==9.2.0 platformdirs==2.5.2 pluggy==1.0.0 -pre-commit==2.19.0 +pre-commit==2.20.0 py==1.11.0 -pydantic==1.9.1 +pydantic==1.10.2 -e git+https://github.com/pydcs/dcs@16ea5d01c57a395ea5868630615c8a42dd2ea1a9#egg=pydcs -pyinstaller==5.2 -pyinstaller-hooks-contrib==2022.8 +pyinstaller==5.6.1 +pyinstaller-hooks-contrib==2022.10 pyparsing==3.0.9 -pyproj==3.3.1 +pyproj==3.4.0 pyshp==2.3.1 PySide2==5.15.2.1 -pytest==7.1.2 +pytest==7.2.0 python-dateutil==2.8.2 -python-dotenv==0.20.0 +python-dotenv==0.21.0 pywin32-ctypes==0.2.0 PyYAML==6.0 -Shapely==1.8.2 +Shapely==1.8.5.post1 shiboken2==5.15.2.1 six==1.16.0 -sniffio==1.2.0 -starlette==0.19.1 -tabulate==0.8.10 +sniffio==1.3.0 +starlette==0.20.4 +tabulate==0.9.0 text-unidecode==1.3 toml==0.10.2 tomli==2.0.1 types-Jinja2==2.11.9 types-MarkupSafe==1.1.10 -types-Pillow==9.2.0 -types-PyYAML==6.0.9 -types-tabulate==0.8.11 -typing_extensions==4.3.0 -uvicorn==0.18.2 -virtualenv==20.15.1 +types-Pillow==9.2.2.2 +types-PyYAML==6.0.12 +types-tabulate==0.9.0.0 +typing_extensions==4.4.0 +uvicorn==0.19.0 +virtualenv==20.16.5 watchgod==0.8.2 websockets==10.3 diff --git a/resources/campaigns/AssaultonDamascus.miz b/resources/campaigns/AssaultonDamascus.miz new file mode 100644 index 00000000..7159928f Binary files /dev/null and b/resources/campaigns/AssaultonDamascus.miz differ diff --git a/resources/campaigns/AssaultonDamascus.yaml b/resources/campaigns/AssaultonDamascus.yaml new file mode 100644 index 00000000..1e0ab613 --- /dev/null +++ b/resources/campaigns/AssaultonDamascus.yaml @@ -0,0 +1,251 @@ +--- +name: Syria - Assault on Damascus +theater: Syria +authors: HolyOrangeJuice +recommended_player_faction: WRL - Task Force Blue +recommended_enemy_faction: WRL - Task Force Red +description:

Edited by HolyOrangeJuice. Original Golan Heights by Khopa. Modified for We Run Liberation group.

+miz: AssaultonDamascus.miz +performance: 1 +version: "10.2" +advanced_iads: false +squadrons: + CVN-74 John Stennis: + - primary: BARCAP + secondary: any + aircraft: + - VF-142 + #F14B + - primary: Strike + secondary: any + aircraft: + - VFA-192 + #Hornet Navy + - primary: AEW&C + aircraft: + - VAW-125 + #E2C + - primary: Refueling + aircraft: + - S-3B Tanker + - primary: Strike + secondary: any + aircraft: + - S-3B Viking + LHA-1 Tarawa: + - primary: BAI + secondary: air-to-ground + aircraft: + - VMA-223 + #AV8B + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-1W SuperCobra + - primary: Strike + secondary: air-to-ground + aircraft: + - SH-60B Seahawk + # AIR SPAWN BLUE + BLUEAIR: + - primary: Strike + secondary: air-to-ground + aircraft: + - 335th FS + #F15e + - primary: Strike + secondary: any + aircraft: + - B-1B Lancer + - primary: Strike + secondary: any + aircraft: + - B-52H Stratofortress + - primary: Strike + secondary: any + aircraft: + - F-117A Nighthawk + - primary: Strike + secondary: any + aircraft: + - Tornado GR4 + - primary: Strike + secondary: any + aircraft: + - Tornado IDS + # Ramat-David + 30: + - primary: BARCAP + secondary: air-to-air + aircraft: + - 58th FS + #F15c + - primary: BARCAP + secondary: air-to-air + aircraft: + - VF-143 + #F14B + - primary: BARCAP + secondary: any + aircraft: + - Mirage 2000C + - primary: BARCAP + secondary: any + aircraft: + - JF-17 Thunder + - primary: Strike + secondary: any + aircraft: + - 23rd FS + #Viper USAF + - primary: Strike + secondary: any + aircraft: + - VMA-214 + #AV8B + - primary: Strike + secondary: any + aircraft: + - AJS-37 Viggen + - primary: SEAD + secondary: air-to-ground + aircraft: + - VMFA-251 + #Hornet - Marines + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10C Thunderbolt II (Suite 7) + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10A Thunderbolt II + - primary: AEW&C + aircraft: + - E-3A + - primary: Refueling + aircraft: + - KC-135 Stratotanker MPRS + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-25T Frogfoot + - primary: CAS + secondary: air-to-ground + aircraft: + - Su-25 Frogfoot + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-29S Fulcrum-C + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-33 Flanker-D + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-27 Flanker-B + - primary: BARCAP + secondary: air-to-air + aircraft: + - J-11A Flanker-L + # Golan South + Golan South: + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-1W SuperCobra + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow (AI) + # Golan North + Golan North: + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow + - primary: CAS + secondary: air-to-ground + aircraft: + - Mi-24P Hind-F + - primary: CAS + secondary: air-to-ground + aircraft: + - Ka-50 Hokum + - primary: CAS + secondary: air-to-ground + aircraft: + - SA 342L Gazelle + - primary: CAS + secondary: air-to-ground + aircraft: + - SA 342M Gazelle + - primary: CAS + secondary: air-to-ground + aircraft: + - SA 342M Gazelle Mistral + - primary: Transport + secondary: any + aircraft: + - UH-1H Iroquois + - primary: Transport + secondary: any + aircraft: + - Mi-8MTV2 Hip + # Marj Ruhayyil + 23: + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + # Al-Dumayr + 9: + - primary: BARCAP + secondary: any + aircraft: + - MiG-29S Fulcrum-C + # Khalkhalah + 18: + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + # Damascus + 7: + - primary: AEW&C + aircraft: + - A-50 + - primary: BARCAP + secondary: any + aircraft: + - Su-30 Flanker-C + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-24M Fencer-D + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-25T Frogfoot + - primary: CAS + secondary: air-to-ground + aircraft: + - Su-25 Frogfoot + - primary: Strike + secondary: air-to-ground + aircraft: + - Tu-142 Bear-F + - primary: Strike + secondary: air-to-ground + aircraft: + - Tu-160 Blackjack + - primary: Strike + secondary: air-to-ground + aircraft: + - Tu-22M3 Backfire-C + - primary: Strike + secondary: air-to-ground + aircraft: + - Tu-95MS Bear-H \ No newline at end of file diff --git a/resources/campaigns/Battle4Georgia_v8.miz b/resources/campaigns/Battle4Georgia_v8.miz new file mode 100644 index 00000000..93ef208d Binary files /dev/null and b/resources/campaigns/Battle4Georgia_v8.miz differ diff --git a/resources/campaigns/Battle4Georgia_v8.yaml b/resources/campaigns/Battle4Georgia_v8.yaml new file mode 100644 index 00000000..41b7c37b --- /dev/null +++ b/resources/campaigns/Battle4Georgia_v8.yaml @@ -0,0 +1,232 @@ +--- +name: Caucasus - Battle for Georgia (v8) +theater: Caucasus +authors: HolyOrangeJuice +recommended_player_faction: WRL - Task Force Blue +recommended_enemy_faction: WRL - Task Force Red +description:

This mission was designed for the We Run Liberation group [WRL]. werunliberation.com

+

The invasion of Georgia has begun. Russian forces have pushed all the way up to Zugdidi. + NATO has decided to help Georgia out and push Russia back towards Sochi. The Abraham Lincoln was dispatched + by the US to support NATO's efforts to help Georgia, along with the Saipan. Georgia has also allowed NATO + aircraft to make use of Georgian airfields for its defence. The objective is simple, liberate Georgia + from its Russian neighbours before it's too late! +

+miz: Battle4Georgia_v8.miz +performance: 2 +version: "10.2" +recommended_player_money: 2000 +recommended_enemy_money: 2000 +recommended_player_income_multiplier: 1.0 +recommended_enemy_income_multiplier: 1.0 +squadrons: + Blue CV-1: + - primary: BARCAP + secondary: any + aircraft: + - VF-142 + #F14B + - primary: BARCAP + secondary: air-to-air + aircraft: + - F-14A Tomcat (Block 135-GR Late) + - primary: SEAD + secondary: any + aircraft: + - VFA-192 + #Hornet Navy + - primary: AEW&C + aircraft: + - VAW-125 + #E2C + - primary: Refueling + aircraft: + - S-3B Tanker + Blue LHA: + - primary: BAI + secondary: air-to-ground + aircraft: + - VMA-223 + #AV8B + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow +# Senaki-Kholki + 23: + - primary: BARCAP + secondary: any + aircraft: + - F-5E Tiger II + - primary: Strike + secondary: any + aircraft: + - VMA-214 + #AV8B + - primary: SEAD + secondary: air-to-ground + aircraft: + - VMFA-251 + #Hornet - Marines + - primary: CAS + secondary: air-to-ground + aircraft: + - 74th TFS + #A10c s3 + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10C Thunderbolt II (Suite 7) + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10A Thunderbolt II + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow + - primary: BAI + secondary: air-to-ground + aircraft: + - Mi-24P Hind-F + - primary: BAI + secondary: air-to-ground + aircraft: + - Ka-50 Hokum + - primary: BAI + secondary: air-to-ground + aircraft: + - Mi-8MTV2 Hip + - primary: BAI + secondary: air-to-ground + aircraft: + - UH-1H Iroquois + - primary: BAI + secondary: air-to-ground + aircraft: + - SA 342L Gazelle + - primary: BAI + secondary: air-to-ground + aircraft: + - SA 342M Gazelle + # Kutaisi + 25: + - primary: BARCAP + secondary: air-to-air + aircraft: + - 58th FS + #F15c + - primary: BARCAP + secondary: air-to-air + aircraft: + - VF-143 + #F14B + - primary: BARCAP + secondary: air-to-air + aircraft: + - F-14A Tomcat (Block 135-GR Late) + - primary: Strike + secondary: any + aircraft: + - 23rd FS + #Viper USAF + - primary: Strike + secondary: air-to-ground + aircraft: + - 335th FS + #F15e + - primary: Strike + secondary: air-to-ground + aircraft: + - B-52H Stratofortress + - primary: AEW&C + aircraft: + - E-3A + - primary: Refueling + aircraft: + - KC-135 Stratotanker MPRS + # Kobuleti + 24: + - primary: BARCAP + secondary: any + aircraft: + - Mirage 2000C + - primary: BARCAP + secondary: any + aircraft: + - Mirage-F1CE + - primary: BARCAP + secondary: any + aircraft: + - JF-17 Thunder + - primary: Strike + secondary: any + aircraft: + - AJS-37 Viggen + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-25T Frogfoot + - primary: CAS + secondary: air-to-ground + aircraft: + - Su-25 Frogfoot + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-21bis Fishbed-N + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-29S Fulcrum-C + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-29A Fulcrum-A + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-33 Flanker-D + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-27 Flanker-B + - primary: BARCAP + secondary: air-to-air + aircraft: + - J-11A Flanker-L +#Sukhumi-Babushara + 20: + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-17M4 Fitter-K +# Gudauta + 21: + - primary: BARCAP + secondary: any + aircraft: + - MiG-23MLD Flogger-K + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-25T Frogfoot + # Sochi-Adler + 18: + - primary: BARCAP + secondary: any + aircraft: + - MiG-29S Fulcrum-C + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-24M Fencer-D +#FARPs +# FARP ALPHA: +# FARP BRAVO: +# Batumi +## 22: + \ No newline at end of file diff --git a/resources/campaigns/WRL_up_the_coast.miz b/resources/campaigns/WRL_up_the_coast.miz new file mode 100644 index 00000000..d95fb83d Binary files /dev/null and b/resources/campaigns/WRL_up_the_coast.miz differ diff --git a/resources/campaigns/WRL_up_the_coast.yaml b/resources/campaigns/WRL_up_the_coast.yaml new file mode 100644 index 00000000..6d5dd659 --- /dev/null +++ b/resources/campaigns/WRL_up_the_coast.yaml @@ -0,0 +1,240 @@ +--- +name: Caucasus - Up The Coast +theater: Caucasus +authors: HolyOrangeJuice +recommended_player_faction: WRL - Task Force Blue +recommended_enemy_faction: WRL - Task Force Red +description:

This mission was designed for the We Run Liberation group [WRL]. werunliberation.com

+

The goal of this mission is to strike at the enemy economy, cripple their finances, + and take all of the enemy air bases.

+

All strike targets (objective buildings) are used to generate income for blufor or redfor. Once destroyed, + these buildings can not be repaired, even after you capture them. In normal DCS liberation missions, + destroying these buildings means ruining your future economy.

In Up The Coast, careful consideration + has been made for the starting economy of Blufor. You do not need to rely on future captured buildings for income. + As long as you do not take heavy losses, your starting economy, plus income, should sustain you for the mission. + Anything captured is a bonus.

+

In this mission, it is just as important to kill the economy generating buildings, as it is to kill the enemy + ground units. The enemy will be able to spend a lot of money replacing units if you do not target the buildings.

+

Factory targets are used to produce ground units. Ammo targets are used to dictate how many frontline units can + be deployed at once. Each airbase has one or more factories. Each airbase has only three ammo targets. Do not + destroy these if you wish to use them after you capture them

+miz: WRL_up_the_coast.miz +performance: 1 +version: "10.2" +recommended_start_date: 2005-12-12 +recommended_player_money: 2000 +recommended_enemy_money: 2000 +recommended_player_income_multiplier: 1.0 +recommended_enemy_income_multiplier: 1.0 +squadrons: + Blue CV-1: + - primary: BARCAP + secondary: any + aircraft: + - VF-142 + #F14B + - primary: BARCAP + secondary: air-to-air + aircraft: + - F-14A Tomcat (Block 135-GR Late) + - primary: SEAD + secondary: any + aircraft: + - VFA-192 + #Hornet Navy + - primary: AEW&C + aircraft: + - VAW-125 + #E2C + - primary: Refueling + aircraft: + - S-3B Tanker + Blue LHA: + - primary: BAI + secondary: air-to-ground + aircraft: + - VMA-223 + #AV8B + - primary: CAS + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow +#FARPs + ZUGDIDI: + - primary: BAI + secondary: air-to-ground + aircraft: + - AH-64D Apache Longbow + - primary: BAI + secondary: air-to-ground + aircraft: + - Mi-24P Hind-F + - primary: BAI + secondary: air-to-ground + aircraft: + - Ka-50 Hokum + - primary: BAI + secondary: air-to-ground + aircraft: + - Mi-8MTV2 Hip + - primary: BAI + secondary: air-to-ground + aircraft: + - UH-1H Iroquois + - primary: BAI + secondary: air-to-ground + aircraft: + - SA 342L Gazelle + - primary: BAI + secondary: air-to-ground + aircraft: + - SA 342M Gazelle +#Sukhumi-Babushara + 20: + - primary: BARCAP + secondary: any + aircraft: + - MiG-21bis Fishbed-N + - primary: CAS + secondary: air-to-ground + aircraft: + - Mi-24V Hind-E + - primary: CAS + secondary: air-to-ground + aircraft: + - Mi-24P Hind-F + - primary: CAS + secondary: air-to-ground + aircraft: + - Ka-50 Hokum + - primary: CAS + secondary: air-to-ground + aircraft: + - Mi-28N Havoc + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-25 Frogfoot +# Gudauta + 21: + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-17M4 Fitter-K + - primary: Strike + secondary: air-to-ground + aircraft: + - Su-24M Fencer-D +#Anapa-Vityazevo + 12: + - primary: BARCAP + secondary: any + aircraft: + - MiG-29A Fulcrum-A + - primary: AEW&C + aircraft: + - A-50 +# Senaki-Kholki + 23: + - primary: BARCAP + secondary: air-to-air + aircraft: + - 58th FS + #F15c + - primary: BARCAP + secondary: air-to-air + aircraft: + - VF-143 + #F14B + - primary: BARCAP + secondary: air-to-air + aircraft: + - F-14A Tomcat (Block 135-GR Late) + - primary: BARCAP + secondary: any + aircraft: + - F-5E Tiger II + - primary: BARCAP + secondary: any + aircraft: + - Mirage 2000C + - primary: BARCAP + secondary: any + aircraft: + - JF-17 Thunder + - primary: Strike + secondary: any + aircraft: + - 23rd FS + #Viper USAF + - primary: Strike + secondary: any + aircraft: + - VMA-214 + #AV8B + - primary: Strike + secondary: any + aircraft: + - AJS-37 Viggen + - primary: Strike + secondary: air-to-ground + aircraft: + - 335th FS + #F15e + - primary: SEAD + secondary: air-to-ground + aircraft: + - VMFA-251 + #Hornet - Marines + - primary: CAS + secondary: air-to-ground + aircraft: + - 74th TFS + #A10c s3 + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10C Thunderbolt II (Suite 7) + - primary: CAS + secondary: air-to-ground + aircraft: + - A-10A Thunderbolt II + - primary: Strike + secondary: air-to-ground + aircraft: + - B-52H Stratofortress + - primary: AEW&C + aircraft: + - E-3A + - primary: Refueling + aircraft: + - KC-135 Stratotanker MPRS + - primary: SEAD + secondary: air-to-ground + aircraft: + - Su-25T Frogfoot + - primary: CAS + secondary: air-to-ground + aircraft: + - Su-25 Frogfoot + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-21bis Fishbed-N + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-29S Fulcrum-C + - primary: BARCAP + secondary: air-to-air + aircraft: + - MiG-29A Fulcrum-A + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-33 Flanker-D + - primary: BARCAP + secondary: air-to-air + aircraft: + - Su-27 Flanker-B + \ No newline at end of file diff --git a/resources/customized_payloads/VSN_A6A.lua b/resources/customized_payloads/VSN_A6A.lua new file mode 100644 index 00000000..e3e5a40d --- /dev/null +++ b/resources/customized_payloads/VSN_A6A.lua @@ -0,0 +1,129 @@ +local unitPayloads = { + ["name"] = "VSN_A6A", + ["payloads"] = { + [1] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 15, + [2] = 32, + }, + }, + [2] = { + ["displayName"] = "Retribution OCA/Runway", + ["name"] = "Retribution OCA/Runway", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{BRU-42_3*Mk-82AIR}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{BRU-42_3*Mk-82AIR}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 15, + [2] = 34, + }, + }, + [3] = { + ["displayName"] = "Retribution OCA/Aircraft", + ["name"] = "Retribution OCA/Aircraft", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{3C7CD675-7D39-41C5-8735-0F4F537818A8}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 15, + [2] = 32, + }, + }, + [4] = { + ["displayName"] = "DEAD", + ["name"] = "DEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{3C7CD675-7D39-41C5-8735-0F4F537818A8}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{0395076D-2F77-4420-9D33-087A4398130B}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 15, + [2] = 29, + [3] = 32, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "VSN_A6A", +} +return unitPayloads diff --git a/resources/customized_payloads/VSN_F84G.lua b/resources/customized_payloads/VSN_F84G.lua new file mode 100644 index 00000000..dfc3e21c --- /dev/null +++ b/resources/customized_payloads/VSN_F84G.lua @@ -0,0 +1,134 @@ +local unitPayloads = { + ["name"] = "VSN_F84G", + ["payloads"] = { + [1] = { + ["displayName"] = "CAP", + ["name"] = "CAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "", + ["num"] = 9, + }, + [4] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 11, + }, + }, + [2] = { + ["displayName"] = "DEAD", + ["name"] = "DEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{69926055-0DA8-4530-9F2F-C86B157EA9F6}", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{69926055-0DA8-4530-9F2F-C86B157EA9F6}", + ["num"] = 9, + }, + [4] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 19, + }, + }, + [3] = { + ["displayName"] = "CAS", + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{319293F2-392C-4617-8315-7C88C22AF7C4}", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{319293F2-392C-4617-8315-7C88C22AF7C4}", + ["num"] = 9, + }, + [4] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 19, + }, + }, + [4] = { + ["displayName"] = "STRIKE", + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{7A44FF09-527C-4B7E-B42B-3F111CFE50FB}", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{7A44FF09-527C-4B7E-B42B-3F111CFE50FB}", + ["num"] = 9, + }, + [4] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 19, + }, + }, + [5] = { + ["displayName"] = "OCA", + ["name"] = "OCA", + ["pylons"] = { + [1] = { + ["CLSID"] = "{7A44FF09-527C-4B7E-B42B-3F111CFE50FB}", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{7A44FF09-527C-4B7E-B42B-3F111CFE50FB}", + ["num"] = 9, + }, + [4] = { + ["CLSID"] = "{PTB_F84G}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 19, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "VSN_F84G", +} +return unitPayloads diff --git a/resources/factions/bluefor_coldwar.json b/resources/factions/bluefor_coldwar.json index 5dd956b8..50936b93 100644 --- a/resources/factions/bluefor_coldwar.json +++ b/resources/factions/bluefor_coldwar.json @@ -6,6 +6,7 @@ "aircrafts": [ "A-10A Thunderbolt II", "A-4E Skyhawk", + "A-6A Intruder", "AJS-37 Viggen", "B-52H Stratofortress", "C-130", diff --git a/resources/factions/syria_1967_with_ww2_weapons.json b/resources/factions/syria_1967_with_ww2_weapons.json index 16f9a9e9..ac68d529 100644 --- a/resources/factions/syria_1967_with_ww2_weapons.json +++ b/resources/factions/syria_1967_with_ww2_weapons.json @@ -43,7 +43,7 @@ "SA-2/S-75", "SA-3/S-125", "Cold-War-Flak", - "KS-19" + "KS-19/SON-9" ], "naval_units": [ "Corvette 1124.4 Grish" diff --git a/resources/factions/syria_2012.json b/resources/factions/syria_2012.json index a1d119cf..e637a455 100644 --- a/resources/factions/syria_2012.json +++ b/resources/factions/syria_2012.json @@ -42,8 +42,7 @@ "2S1 Gvozdika", "2S9 Nona-S", "BM-21 Grad", - "BM-27 Uragan", - "KS-19/SON-9" + "BM-27 Uragan" ], "logistics_units": [ "LUV UAZ-469 Jeep", @@ -65,7 +64,8 @@ "SA-11", "SA-10/S-300PS", "SA-17", - "Cold-War-Flak" + "Cold-War-Flak", + "KS-19/SON-9" ], "naval_units": [ "Corvette 1124.4 Grish", diff --git a/resources/factions/unc_1950_fictional.json b/resources/factions/unc_1950_fictional.json index e3fd6313..a809aa30 100644 --- a/resources/factions/unc_1950_fictional.json +++ b/resources/factions/unc_1950_fictional.json @@ -6,6 +6,7 @@ "aircrafts": [ "A-20G Havoc", "B-17G Flying Fortress", + "F-84G Thunderjet", "F-86F Sabre", "P-47D-40 Thunderbolt", "P-51D-25-NA Mustang", diff --git a/resources/factions/usa_1955.json b/resources/factions/usa_1955.json index 88018012..a047d771 100644 --- a/resources/factions/usa_1955.json +++ b/resources/factions/usa_1955.json @@ -9,6 +9,7 @@ "aircrafts": [ "B-52H Stratofortress", "C-130", + "F-84G Thunderjet", "F-86F Sabre", "F-100 Super Sabre", "P-51D-25-NA Mustang", diff --git a/resources/factions/usa_1960.json b/resources/factions/usa_1960.json index f2e3656b..5904938c 100644 --- a/resources/factions/usa_1960.json +++ b/resources/factions/usa_1960.json @@ -9,6 +9,7 @@ "aircrafts": [ "B-52H Stratofortress", "C-130", + "F-84G Thunderjet", "F-86F Sabre", "F-100 Super Sabre", "F-104C Starfighter", diff --git a/resources/factions/usa_1965.json b/resources/factions/usa_1965.json index 40b24bd5..a04658b6 100644 --- a/resources/factions/usa_1965.json +++ b/resources/factions/usa_1965.json @@ -10,6 +10,7 @@ "B-52H Stratofortress", "C-130", "CH-47D", + "A-6A Intruder", "F-4B Phantom II", "F-4E Phantom II", "F-5E Tiger II", diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index 26b54b5e..06b8d12f 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -9,13 +9,14 @@ "aircrafts": [ "AH-1W SuperCobra", "A-4E Skyhawk", + "A-6A Intruder", "F-14A Tomcat (Block 135-GR Late)", "F-14B Tomcat", "F-4B Phantom II", "F-4E Phantom II", "S-3B Viking", "SH-60B Seahawk", - "UH-1H Iroquois" + "UH-1H Iroquois", ], "awacs": [ "E-2C Hawkeye" diff --git a/resources/factions/wrl_taskforceblue.json b/resources/factions/wrl_taskforceblue.json new file mode 100644 index 00000000..158c3102 --- /dev/null +++ b/resources/factions/wrl_taskforceblue.json @@ -0,0 +1,118 @@ +{ + "country": "Combined Joint Task Forces Blue", + "name": "WRL - Task Force Blue", + "authors": "HolyOrangeJuice", + "description": "

A generic blufor faction which is similar to the Blufor Modern preset. This meets the needs of the We Run Liberation group. werunliberation.com.

", + "aircrafts": [ + "MiG-21bis Fishbed-N", + "F-5E Tiger II", + "Mirage-F1CE", + "MiG-29A Fulcrum-A", + "MiG-29S Fulcrum-C", + "J-11A Flanker-L", + "Su-27 Flanker-B", + "Su-33 Flanker-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "A-10A Thunderbolt II", + "A-10C Thunderbolt II (Suite 3)", + "A-10C Thunderbolt II (Suite 7)", + "AJS-37 Viggen", + "AV-8B Harrier II Night Attack", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "JF-17 Thunder", + "Mirage 2000C", + "AH-64D Apache Longbow", + "Ka-50 Hokum", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral", + "UH-1H Iroquois", + "Tornado IDS", + "Tornado GR4", + "B-1B Lancer", + "B-52H Stratofortress", + "S-3B Viking", + "F-117A Nighthawk", + "AH-1W SuperCobra", + "SH-60B Seahawk", + "AH-64D Apache Longbow (AI)" + ], + "awacs": [ + "E-2D Advanced Hawkeye", + "E-3A" + ], + "tankers": [ + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", + "S-3B Tanker" + ], + "frontline_units": [ + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1128 Stryker Mobile Gun System", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M6 Linebacker" + ], + "artillery_units": [ + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" + ], + "logistics_units": [ + "Truck M818 6x6" + ], + "infantry_units": [ + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" + ], + "preset_groups": [ + "Hawk", + "Patriot", + "NASAMS AIM-120C" + ], + "naval_units": [ + "DDG Arleigh Burke IIa", + "CG Ticonderoga", + "LHA-1 Tarawa", + "CVN-74 John C. Stennis" + ], + "missiles": [], + "air_defense_units": [ + "SAM Patriot STR", + "M163 Vulcan Air Defense System", + "M1097 Heavy HMMWV Avenger", + "M48 Chaparral" + ], + "requirements": {}, + "carrier_names": [ + "CVN-71 Theodore Roosevelt", + "CVN-72 Abraham Lincoln", + "CVN-73 George Washington", + "CVN-74 John C. Stennis" + ], + "helicopter_carrier_names": [ + "LHA-1 Tarawa", + "LHA-2 Saipan", + "LHA-3 Belleau Wood", + "LHA-4 Nassau", + "LHA-5 Peleliu" + ], + "has_jtac": true, + "jtac_unit": "MQ-9 Reaper", + "doctrine": "modern", + "unrestricted_satnav": true +} \ No newline at end of file diff --git a/resources/factions/wrl_taskforcered.json b/resources/factions/wrl_taskforcered.json new file mode 100644 index 00000000..be81c033 --- /dev/null +++ b/resources/factions/wrl_taskforcered.json @@ -0,0 +1,121 @@ +{ + "country": "Combined Joint Task Forces Red", + "name": "WRL - Task Force Red", + "authors": "HolyOrangeJuice", + "description": "

A generic blufor faction which is similar to the Blufor Modern preset. This meets the needs of the We Run Liberation group. werunliberation.com.

", + "locales": [ + "ru_RU" + ], + "aircrafts": [ + "MiG-19P Farmer-B", + "L-39ZA Albatros", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "MiG-25PD Foxbat-E", + "MiG-29A Fulcrum-A", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-17M4 Fitter-K", + "Su-24M Fencer-D", + "Su-27 Flanker-B", + "Su-30 Flanker-C", + "Su-33 Flanker-D", + "Su-34 Fullback", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "F-4E Phantom II", + "F-5E Tiger II", + "Mirage-F1CE", + "Tu-142 Bear-F", + "Tu-160 Blackjack", + "Tu-22M3 Backfire-C", + "Tu-95MS Bear-H", + "Ka-50 Hokum", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral", + "UH-1H Iroquois" + ], + "awacs": [ + "A-50" + ], + "tankers": [ + "IL-78M" + ], + "frontline_units": [ + "BMP-1", + "BMP-2", + "BMP-3", + "BMD-1", + "MT-LB", + "BRDM-2", + "BTR-80", + "BTR-82A", + "BTR-D", + "PT-76", + "T-55A", + "T-72B3 model 2011", + "T-72B with Kontakt-1 ERA", + "T-80UD", + "T-90A", + "ZU-23 on Ural-375", + "ZSU-23-4 Shilka" + ], + "artillery_units": [ + "2S19 Msta-S", + "2S9 Nona-S", + "BM-27 Uragan", + "BM-30 Smerch (9M55K5 HE Rockets)" + ], + "logistics_units": [ + "LUV UAZ-469 Jeep", + "Truck Ural-375" + ], + "infantry_units": [ + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" + ], +"missiles": [ + "SSM SS-1C Scud-B" + ], + "preset_groups": [ + "SA-2/S-75", + "SA-3/S-125", + "SA-6", + "SA-11", + "SA-10/S-300PS", + "SA-10B/S-300PS", + "Silkworm", + "Russian Navy" + ], + "naval_units": [ + "Frigate 1135M Rezky", + "Corvette 1241.1 Molniya", + "CV 1143.5 Admiral Kuznetsov" + ], + "air_defense_units": [ + "EWR 1L13", + "EWR 55G6", + "SAM SA-8 Osa \"Gecko\" TEL", + "SA-9 Strela", + "SA-13 Gopher (9K35 Strela-10M3)", + "SA-15 Tor", + "SA-19 Grison (2K22 Tunguska)", + "ZSU-23-4 Shilka" + ], + "helicopter_carrier_names": [], + "requirements": {}, + "carrier_names": [ + "Admiral Kuznetsov", + "Admiral Gorshkov" + ], + "has_jtac": false, + "doctrine": "modern" +} \ No newline at end of file diff --git a/resources/groups/Cold-War-Flak.yaml b/resources/groups/Cold-War-Flak.yaml index c163abfd..8642b793 100644 --- a/resources/groups/Cold-War-Flak.yaml +++ b/resources/groups/Cold-War-Flak.yaml @@ -4,7 +4,6 @@ tasks: units: - 8.8 cm Flak 18 - S-60 57mm - - AAA Fire Can SON-9 - AAA KS-19 100mm layouts: - Cold War Flak Site \ No newline at end of file diff --git a/resources/layouts/ground_forces/Armor_Group.yaml b/resources/layouts/ground_forces/Armor_Group.yaml index acee4ca5..2b562ca6 100644 --- a/resources/layouts/ground_forces/Armor_Group.yaml +++ b/resources/layouts/ground_forces/Armor_Group.yaml @@ -7,7 +7,7 @@ groups: - Armor Group: - name: Armor Group 0 unit_count: - - 2 + - 4 - 6 unit_classes: - APC diff --git a/resources/layouts/ground_forces/Armor_Group_with_Anti-Air.yaml b/resources/layouts/ground_forces/Armor_Group_with_Anti-Air.yaml index 50d9be53..5527c7d1 100644 --- a/resources/layouts/ground_forces/Armor_Group_with_Anti-Air.yaml +++ b/resources/layouts/ground_forces/Armor_Group_with_Anti-Air.yaml @@ -7,7 +7,7 @@ groups: - Armor Group: - name: Armor Group with Anti-Air 0 unit_count: - - 2 + - 4 - 6 unit_classes: - APC diff --git a/resources/stylesheets/style-dcs.css b/resources/stylesheets/style-dcs.css index 9ade529c..79edf3e4 100644 --- a/resources/stylesheets/style-dcs.css +++ b/resources/stylesheets/style-dcs.css @@ -618,6 +618,8 @@ QGroupBox[style="IntelSummary"] QLabel { margin: 0px; font-size: 9px; line-height: 9px; + color: #fff; + background: transparent; } QCalendarWidget diff --git a/resources/ui/conditions/timeofday/dawn.png b/resources/ui/conditions/light/timeofday/dawn.png similarity index 100% rename from resources/ui/conditions/timeofday/dawn.png rename to resources/ui/conditions/light/timeofday/dawn.png diff --git a/resources/ui/conditions/timeofday/day.png b/resources/ui/conditions/light/timeofday/day.png similarity index 100% rename from resources/ui/conditions/timeofday/day.png rename to resources/ui/conditions/light/timeofday/day.png diff --git a/resources/ui/conditions/timeofday/dusk.png b/resources/ui/conditions/light/timeofday/dusk.png similarity index 100% rename from resources/ui/conditions/timeofday/dusk.png rename to resources/ui/conditions/light/timeofday/dusk.png diff --git a/resources/ui/conditions/timeofday/night.png b/resources/ui/conditions/light/timeofday/night.png similarity index 100% rename from resources/ui/conditions/timeofday/night.png rename to resources/ui/conditions/light/timeofday/night.png diff --git a/resources/ui/conditions/weather/day-clear.png b/resources/ui/conditions/light/weather/day-clear.png similarity index 100% rename from resources/ui/conditions/weather/day-clear.png rename to resources/ui/conditions/light/weather/day-clear.png diff --git a/resources/ui/conditions/weather/day-cloudy-fog.png b/resources/ui/conditions/light/weather/day-cloudy-fog.png similarity index 100% rename from resources/ui/conditions/weather/day-cloudy-fog.png rename to resources/ui/conditions/light/weather/day-cloudy-fog.png diff --git a/resources/ui/conditions/weather/day-fog.png b/resources/ui/conditions/light/weather/day-fog.png similarity index 100% rename from resources/ui/conditions/weather/day-fog.png rename to resources/ui/conditions/light/weather/day-fog.png diff --git a/resources/ui/conditions/weather/day-partly-cloudy.png b/resources/ui/conditions/light/weather/day-partly-cloudy.png similarity index 100% rename from resources/ui/conditions/weather/day-partly-cloudy.png rename to resources/ui/conditions/light/weather/day-partly-cloudy.png diff --git a/resources/ui/conditions/weather/day-rain.png b/resources/ui/conditions/light/weather/day-rain.png similarity index 100% rename from resources/ui/conditions/weather/day-rain.png rename to resources/ui/conditions/light/weather/day-rain.png diff --git a/resources/ui/conditions/weather/day-thunderstorm.png b/resources/ui/conditions/light/weather/day-thunderstorm.png similarity index 100% rename from resources/ui/conditions/weather/day-thunderstorm.png rename to resources/ui/conditions/light/weather/day-thunderstorm.png diff --git a/resources/ui/conditions/weather/day-totally-cloud.png b/resources/ui/conditions/light/weather/day-totally-cloud.png similarity index 100% rename from resources/ui/conditions/weather/day-totally-cloud.png rename to resources/ui/conditions/light/weather/day-totally-cloud.png diff --git a/resources/ui/conditions/weather/night-clear.png b/resources/ui/conditions/light/weather/night-clear.png similarity index 100% rename from resources/ui/conditions/weather/night-clear.png rename to resources/ui/conditions/light/weather/night-clear.png diff --git a/resources/ui/conditions/weather/night-cloudy-fog.png b/resources/ui/conditions/light/weather/night-cloudy-fog.png similarity index 100% rename from resources/ui/conditions/weather/night-cloudy-fog.png rename to resources/ui/conditions/light/weather/night-cloudy-fog.png diff --git a/resources/ui/conditions/weather/night-fog.png b/resources/ui/conditions/light/weather/night-fog.png similarity index 100% rename from resources/ui/conditions/weather/night-fog.png rename to resources/ui/conditions/light/weather/night-fog.png diff --git a/resources/ui/conditions/weather/night-partly-cloudy.png b/resources/ui/conditions/light/weather/night-partly-cloudy.png similarity index 100% rename from resources/ui/conditions/weather/night-partly-cloudy.png rename to resources/ui/conditions/light/weather/night-partly-cloudy.png diff --git a/resources/ui/conditions/weather/night-rain.png b/resources/ui/conditions/light/weather/night-rain.png similarity index 100% rename from resources/ui/conditions/weather/night-rain.png rename to resources/ui/conditions/light/weather/night-rain.png diff --git a/resources/ui/conditions/weather/night-thundersotrm.png b/resources/ui/conditions/light/weather/night-thundersotrm.png similarity index 100% rename from resources/ui/conditions/weather/night-thundersotrm.png rename to resources/ui/conditions/light/weather/night-thundersotrm.png diff --git a/resources/ui/conditions/weather/night-totally-cloud.png b/resources/ui/conditions/light/weather/night-totally-cloud.png similarity index 100% rename from resources/ui/conditions/weather/night-totally-cloud.png rename to resources/ui/conditions/light/weather/night-totally-cloud.png diff --git a/resources/ui/conditions/weather/winds.png b/resources/ui/conditions/light/weather/winds.png similarity index 100% rename from resources/ui/conditions/weather/winds.png rename to resources/ui/conditions/light/weather/winds.png diff --git a/resources/ui/conditions/medium/timeofday/dawn.png b/resources/ui/conditions/medium/timeofday/dawn.png new file mode 100644 index 00000000..f492b778 Binary files /dev/null and b/resources/ui/conditions/medium/timeofday/dawn.png differ diff --git a/resources/ui/conditions/medium/timeofday/day.png b/resources/ui/conditions/medium/timeofday/day.png new file mode 100644 index 00000000..350f98cd Binary files /dev/null and b/resources/ui/conditions/medium/timeofday/day.png differ diff --git a/resources/ui/conditions/medium/timeofday/dusk.png b/resources/ui/conditions/medium/timeofday/dusk.png new file mode 100644 index 00000000..73d4dd1d Binary files /dev/null and b/resources/ui/conditions/medium/timeofday/dusk.png differ diff --git a/resources/ui/conditions/medium/timeofday/night.png b/resources/ui/conditions/medium/timeofday/night.png new file mode 100644 index 00000000..3401bf7f Binary files /dev/null and b/resources/ui/conditions/medium/timeofday/night.png differ diff --git a/resources/ui/conditions/medium/weather/day-clear.png b/resources/ui/conditions/medium/weather/day-clear.png new file mode 100644 index 00000000..128cf9f0 Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-clear.png differ diff --git a/resources/ui/conditions/medium/weather/day-cloudy-fog.png b/resources/ui/conditions/medium/weather/day-cloudy-fog.png new file mode 100644 index 00000000..210cfa4c Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-cloudy-fog.png differ diff --git a/resources/ui/conditions/medium/weather/day-fog.png b/resources/ui/conditions/medium/weather/day-fog.png new file mode 100644 index 00000000..8053fa58 Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-fog.png differ diff --git a/resources/ui/conditions/medium/weather/day-partly-cloudy.png b/resources/ui/conditions/medium/weather/day-partly-cloudy.png new file mode 100644 index 00000000..4f270a3f Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-partly-cloudy.png differ diff --git a/resources/ui/conditions/medium/weather/day-rain.png b/resources/ui/conditions/medium/weather/day-rain.png new file mode 100644 index 00000000..1984bb6d Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-rain.png differ diff --git a/resources/ui/conditions/medium/weather/day-thunderstorm.png b/resources/ui/conditions/medium/weather/day-thunderstorm.png new file mode 100644 index 00000000..13627e46 Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-thunderstorm.png differ diff --git a/resources/ui/conditions/medium/weather/day-totally-cloud.png b/resources/ui/conditions/medium/weather/day-totally-cloud.png new file mode 100644 index 00000000..fe042f5c Binary files /dev/null and b/resources/ui/conditions/medium/weather/day-totally-cloud.png differ diff --git a/resources/ui/conditions/medium/weather/night-clear.png b/resources/ui/conditions/medium/weather/night-clear.png new file mode 100644 index 00000000..a657f6f0 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-clear.png differ diff --git a/resources/ui/conditions/medium/weather/night-cloudy-fog.png b/resources/ui/conditions/medium/weather/night-cloudy-fog.png new file mode 100644 index 00000000..79a7058d Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-cloudy-fog.png differ diff --git a/resources/ui/conditions/medium/weather/night-fog.png b/resources/ui/conditions/medium/weather/night-fog.png new file mode 100644 index 00000000..8cabd603 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-fog.png differ diff --git a/resources/ui/conditions/medium/weather/night-partly-cloudy.png b/resources/ui/conditions/medium/weather/night-partly-cloudy.png new file mode 100644 index 00000000..b56b89c8 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-partly-cloudy.png differ diff --git a/resources/ui/conditions/medium/weather/night-rain.png b/resources/ui/conditions/medium/weather/night-rain.png new file mode 100644 index 00000000..94b8e980 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-rain.png differ diff --git a/resources/ui/conditions/medium/weather/night-thundersotrm.png b/resources/ui/conditions/medium/weather/night-thundersotrm.png new file mode 100644 index 00000000..5a549cb5 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-thundersotrm.png differ diff --git a/resources/ui/conditions/medium/weather/night-totally-cloud.png b/resources/ui/conditions/medium/weather/night-totally-cloud.png new file mode 100644 index 00000000..7d5f8718 Binary files /dev/null and b/resources/ui/conditions/medium/weather/night-totally-cloud.png differ diff --git a/resources/ui/conditions/medium/weather/winds.png b/resources/ui/conditions/medium/weather/winds.png new file mode 100644 index 00000000..c14eda8a Binary files /dev/null and b/resources/ui/conditions/medium/weather/winds.png differ diff --git a/resources/ui/units/aircrafts/banners/VSN_A6A_24.jpg b/resources/ui/units/aircrafts/banners/VSN_A6A_24.jpg new file mode 100644 index 00000000..2ff7a708 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/VSN_A6A_24.jpg differ diff --git a/resources/ui/units/aircrafts/banners/VSN_F84G_24.jpg b/resources/ui/units/aircrafts/banners/VSN_F84G_24.jpg new file mode 100644 index 00000000..9f34bdc3 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/VSN_F84G_24.jpg differ diff --git a/resources/ui/units/aircrafts/icons/VSN_A6A_24.jpg b/resources/ui/units/aircrafts/icons/VSN_A6A_24.jpg new file mode 100644 index 00000000..772b0fcc Binary files /dev/null and b/resources/ui/units/aircrafts/icons/VSN_A6A_24.jpg differ diff --git a/resources/ui/units/aircrafts/icons/VSN_F84G_24.jpg b/resources/ui/units/aircrafts/icons/VSN_F84G_24.jpg new file mode 100644 index 00000000..c1be3720 Binary files /dev/null and b/resources/ui/units/aircrafts/icons/VSN_F84G_24.jpg differ diff --git a/resources/units/aircraft/VSN_A6A.yaml b/resources/units/aircraft/VSN_A6A.yaml new file mode 100644 index 00000000..14a24d10 --- /dev/null +++ b/resources/units/aircraft/VSN_A6A.yaml @@ -0,0 +1,12 @@ +description: # from wiki + The Grumman A-6 Intruder is an American dual-engine all-weather attack aircraft developed and manufactured by + American aircraft company Grumman Aerospace and operated by the U.S. Navy and U.S. Marine Corps. +introduced: 1963 +manufacturer: Boeing +origin: USA +price: 20 +role: Close Air Support/Attack +carrier_capable: true +gunfighter: false +variants: + A-6A Intruder: {} diff --git a/resources/units/aircraft/VSN_F84G.yaml b/resources/units/aircraft/VSN_F84G.yaml new file mode 100644 index 00000000..d40f9586 --- /dev/null +++ b/resources/units/aircraft/VSN_F84G.yaml @@ -0,0 +1,15 @@ +description: + "The Republic F-84 Thunderjet is an American turbojet fighter-bomber aircraft. \ + \ The Thunderjet became the USAF's primary strike aircraft during the Korean War, \ + \ flying 86,408 sorties and destroying 60% of all ground targets in the war as \ + \ well as eight Soviet-built MiG fighters. The F-84G is the definitive variant, \ + \ introduced in 1951." +introduced: 1951 +manufacturer: Republic Aviation +origin: USA +price: 6 +role: Fighter-Bomber +max_range: 100 +gunfighter: true +variants: + F-84G Thunderjet: {}