From b2fe15aa2de4307ac4b1a0536be4dadcc36f17b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 10:47:47 +0200 Subject: [PATCH 01/16] Updated tools and workflows (#255) * Updated tools and workflows * Fixed script_component.hpp * Run all validations always * Arma is now testing in action caption * Added manual deploy --- .github/workflows/arma.yml | 6 +- .github/workflows/hemtt-deploy.yml | 39 ++ .github/workflows/hemtt.yml | 38 ++ .../pronelauncher/functions/fnc_onKeyDown.sqf | 2 +- .../functions/script_component.hpp | 1 - tools/check_strings.py | 53 +- tools/compileExtensions.py | 97 +++ tools/config_style_checker.py | 46 +- tools/config_validator.py | 2 +- tools/deploy_both.ps1 | 46 -- tools/deploy_legacy.ps1 | 29 - tools/extract_dependencies.py | 111 ++++ tools/generate_airfriction_config.py | 555 ++++++++++++++++++ tools/publish.py | 122 ++++ tools/search_undefinedFunctions.py | 101 ++-- tools/setup.bat | 16 + tools/setupEditorPreviewImages.py | 84 --- tools/sqf_linter.py | 99 ++-- tools/sqf_validator.py | 19 +- tools/sqfvmChecker.py | 96 +++ tools/stringtable_validator.py | 39 +- tools/stringtablediag.py | 2 +- tools/updateIncludes.py | 25 + 23 files changed, 1335 insertions(+), 293 deletions(-) create mode 100644 .github/workflows/hemtt-deploy.yml create mode 100644 .github/workflows/hemtt.yml delete mode 100644 addons/pronelauncher/functions/script_component.hpp create mode 100644 tools/compileExtensions.py delete mode 100644 tools/deploy_both.ps1 delete mode 100644 tools/deploy_legacy.ps1 create mode 100644 tools/extract_dependencies.py create mode 100644 tools/generate_airfriction_config.py create mode 100644 tools/publish.py create mode 100644 tools/setup.bat delete mode 100644 tools/setupEditorPreviewImages.py create mode 100644 tools/sqfvmChecker.py create mode 100644 tools/updateIncludes.py diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml index a2f60ae7..ffc15edf 100644 --- a/.github/workflows/arma.yml +++ b/.github/workflows/arma.yml @@ -1,4 +1,4 @@ -name: Arma +name: Testing on: push: @@ -13,13 +13,17 @@ jobs: - name: Checkout the source code uses: actions/checkout@master - name: Validate SQF + if: always() run: python3 tools/sqf_validator.py - name: Validate Config + if: always() run: python3 tools/config_style_checker.py - name: Validate Stringtables + if: always() run: python3 tools/stringtable_validator.py continue-on-error: true - name: Check Strings + if: always() run: python3 tools/check_strings.py # - name: Check for BOM # uses: arma-actions/bom-check@master diff --git a/.github/workflows/hemtt-deploy.yml b/.github/workflows/hemtt-deploy.yml new file mode 100644 index 00000000..bf11e3f7 --- /dev/null +++ b/.github/workflows/hemtt-deploy.yml @@ -0,0 +1,39 @@ +name: Deploy + +on: + workflow_dispatch: + inputs: + environment: + description: 'Selected deploy enviroment' + required: true + default: 'dev' + type: choice + options: + - dev + - live +jobs: + windows: + runs-on: windows-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Checkout pull request + uses: actions/checkout@v4 + - name: Run HEMTT release + run: hemtt release + #- name: Rename build folder + # run: mv .hemttout/build .hemttout/@cav + - name: DEBUG ending... + run: | + Write-Host "Environment: $ENVIRONMENT" + Get-Content -Path .hemttout + env: + ENVIRONMENT: ${{ inputs.environment }} + shell: pwsh + #- name: Upload Artifact + # uses: actions/upload-artifact@v4 + # with: + # name: cav-${{ github.sha }} + # path: .hemttout/@* \ No newline at end of file diff --git a/.github/workflows/hemtt.yml b/.github/workflows/hemtt.yml new file mode 100644 index 00000000..3ca73d8e --- /dev/null +++ b/.github/workflows/hemtt.yml @@ -0,0 +1,38 @@ +name: HEMTT + +on: + push: + branches: + - main + pull_request_target: + +jobs: + windows: + runs-on: windows-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Checkout pull request + uses: actions/checkout@v4 + if: ${{ github.event_name == 'pull_request_target' }} + with: + path: pullrequest + ref: 'refs/pull/${{ github.event.number }}/merge' + - name: Replace addons with pull request addons + if: ${{ github.event_name == 'pull_request_target' }} + run: | + rm -r addons\ + rm -r include\ + xcopy /e /h /q pullrequest\addons addons\ + xcopy /e /h /q pullrequest\include include\ + - name: Run HEMTT build + run: hemtt build + - name: Rename build folder + run: mv .hemttout/build .hemttout/@cav + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: cav-${{ github.sha }} + path: .hemttout/@* \ No newline at end of file diff --git a/addons/pronelauncher/functions/fnc_onKeyDown.sqf b/addons/pronelauncher/functions/fnc_onKeyDown.sqf index fc92c1ed..7f35b081 100644 --- a/addons/pronelauncher/functions/fnc_onKeyDown.sqf +++ b/addons/pronelauncher/functions/fnc_onKeyDown.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "..\script_component.hpp" /* * Author: PiZZADOX, Jonpas * Handles keyDown EH for overriding engine stance changes when in AT launcher stance. diff --git a/addons/pronelauncher/functions/script_component.hpp b/addons/pronelauncher/functions/script_component.hpp deleted file mode 100644 index cdc3dede..00000000 --- a/addons/pronelauncher/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "../script_component.hpp" diff --git a/tools/check_strings.py b/tools/check_strings.py index 09897781..bfe7ddf8 100644 --- a/tools/check_strings.py +++ b/tools/check_strings.py @@ -11,14 +11,15 @@ def getDefinedStrings(filepath): # print("getDefinedStrings {0}".format(filepath)) with open(filepath, 'r', encoding="latin-1") as file: content = file.read() - srch = re.compile('Key ID\=\"(STR_CAV_[_a-zA-Z0-9]*)"', re.IGNORECASE) + srch = re.compile('Key ID\=\"(STR_ACE_[_a-zA-Z0-9]*)"', re.IGNORECASE) modStrings = srch.findall(content) modStrings = [s.lower() for s in modStrings] return modStrings def getStringUsage(filepath): - selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) - # print("Checking {0} from {1}".format(filepath,selfmodule)) + selfmodule = (re.search('(addons|optionals)[\W]*([_a-zA-Z0-9]*)', filepath)).group(2) + submodule = (re.search(f'(addons|optionals)[\W]*{selfmodule}[\W]*([_a-zA-Z0-9]*)', filepath)).group(2) + # print(f"Checking {filepath} from {selfmodule} ({submodule})") fileStrings = [] with open(filepath, 'r') as file: @@ -27,7 +28,7 @@ def getStringUsage(filepath): srch = re.compile('(STR_CAV_[_a-zA-Z0-9]*)', re.IGNORECASE) fileStrings = srch.findall(content) - srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)', re.IGNORECASE) + srch = re.compile('[^EB][CL]STRING\(([_a-zA-Z0-9]*)\)', re.IGNORECASE) modStrings = srch.findall(content) for localString in modStrings: fileStrings.append("STR_CAV_{0}_{1}".format(selfmodule, localString)) @@ -37,6 +38,11 @@ def getStringUsage(filepath): for (exModule, exString) in exStrings: fileStrings.append("STR_CAV_{0}_{1}".format(exModule, exString)) + srch = re.compile('SUB[CL]STRING\(([_a-zA-Z0-9]*)\)') + subStrings = srch.findall(content) + for (subString) in subStrings: + fileStrings.append(f"STR_CAV_{submodule}_{subString}") + srch = re.compile('IGNORE_STRING_WARNING\([\'"]*([_a-zA-Z0-9]*)[\'"]*\)') ignoreWarnings = srch.findall(content) @@ -51,23 +57,24 @@ def main(argv): allDefinedStrings = [] allUsedStrings = [] - # Allow running from root directory as well as from inside the tools directory - rootDir = "../addons" - if (os.path.exists("addons")): - rootDir = "addons" - - for root, dirnames, filenames in os.walk(rootDir): - for filename in fnmatch.filter(filenames, '*.sqf'): - sqf_list.append(os.path.join(root, filename)) - for filename in fnmatch.filter(filenames, '*.cpp'): - sqf_list.append(os.path.join(root, filename)) - for filename in fnmatch.filter(filenames, '*.hpp'): - sqf_list.append(os.path.join(root, filename)) - for filename in fnmatch.filter(filenames, '*.h'): - sqf_list.append(os.path.join(root, filename)) - - for filename in fnmatch.filter(filenames, '*.xml'): - xml_list.append(os.path.join(root, filename)) + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.h'): + sqf_list.append(os.path.join(root, filename)) + + for filename in fnmatch.filter(filenames, '*.xml'): + xml_list.append(os.path.join(root, filename)) for filename in xml_list: allDefinedStrings = allDefinedStrings + getDefinedStrings(filename) @@ -77,6 +84,8 @@ def main(argv): allDefinedStrings = list(sorted(set(allDefinedStrings))) allUsedStrings = list(sorted(set(allUsedStrings))) + if ("str_cav_tagging_name" in allUsedStrings): allUsedStrings.remove("str_cav_tagging_name") # Handle tagging macro + print("-----------") countUnusedStrings = 0 countUndefinedStrings = 0 @@ -98,4 +107,4 @@ def main(argv): return countUndefinedStrings if __name__ == "__main__": - main(sys.argv) \ No newline at end of file + main(sys.argv) diff --git a/tools/compileExtensions.py b/tools/compileExtensions.py new file mode 100644 index 00000000..8864d98e --- /dev/null +++ b/tools/compileExtensions.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +# vim: set fileencoding=utf-8 : + +# compileExtensions.py (from acre2's make.py) + +############################################################################### + +# The MIT License (MIT) + +# Copyright (c) 2013-2014 Ryan Schultz + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +############################################################################### + +import sys +import os.path +import subprocess +import shutil +import time +import timeit + +if sys.platform == "win32": + import winreg + + +def compile_extensions(force_build): + originalDir = os.getcwd() + extensions_root = os.path.join(os.path.dirname(os.getcwd()), "extensions") + os.chdir(extensions_root) + print("\nCompiling extensions in {} with rebuild:{}\n".format(extensions_root, force_build)) + + if shutil.which("git") == None: + print("Failed to find Git!") + return + if shutil.which("cmake") == None: + print("Failed to find CMake!") + return + if shutil.which("msbuild") == None: + print("Failed to find MSBuild!") + return + + try: + buildType = "rebuild" if force_build else "build" + # 32-bit + vcproj32 = os.path.join(extensions_root, "vcproj32") + if not os.path.exists(vcproj32): + os.mkdir(vcproj32) + os.chdir(vcproj32) + subprocess.call(["cmake", "..", "-A", "Win32"]) # note: cmake will update ace_version stuff + subprocess.call(["msbuild", "ACE.sln", "/m", "/t:{}".format(buildType), "/p:Configuration=Release"]) + + # 64-bit + vcproj64 = os.path.join(extensions_root, "vcproj64") + if not os.path.exists(vcproj64): + os.mkdir(vcproj64) + os.chdir(vcproj64) + subprocess.call(["cmake", "..", "-A", "x64"]) + subprocess.call(["msbuild", "ACE.sln", "/m", "/t:{}".format(buildType), "/p:Configuration=Release"]) + except Exception as e: + print("Error: COMPILING EXTENSIONS - {}".format(e)) + raise + finally: + os.chdir(originalDir) + + +def main(argv): + if "force" in argv: + argv.remove("force") + force_build = True + else: + force_build = False + + compile_extensions(force_build) + + +if __name__ == "__main__": + start_time = timeit.default_timer() + main(sys.argv) + print("\nTotal Program time elapsed: {0} sec".format(timeit.default_timer() - start_time)) + input("Press Enter to continue...") diff --git a/tools/config_style_checker.py b/tools/config_style_checker.py index 03d8f222..afa78a2d 100644 --- a/tools/config_style_checker.py +++ b/tools/config_style_checker.py @@ -16,6 +16,14 @@ def pushClosing(t): def popClosing(): closing << closingStack.pop() + reIsClass = re.compile(r'^\s*class(.*)') + reIsClassInherit = re.compile(r'^\s*class(.*):') + reIsClassBody = re.compile(r'^\s*class(.*){') + reBadColon = re.compile(r'\s*class (.*) :') + reSpaceAfterColon = re.compile(r'\s*class (.*): ') + reSpaceBeforeCurly = re.compile(r'\s*class (.*) {') + reClassSingleLine = re.compile(r'\s*class (.*)[{;]') + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: content = file.read() @@ -118,6 +126,23 @@ def popClosing(): if brackets_list.count('{') != brackets_list.count('}'): print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) bad_count_file += 1 + + file.seek(0) + for lineNumber, line in enumerate(file.readlines()): + if reIsClass.match(line): + if reBadColon.match(line): + print(f"WARNING: bad class colon {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + if reIsClassInherit.match(line): + if not reSpaceAfterColon.match(line): + print(f"WARNING: bad class missing space after colon {filepath} Line number: {lineNumber+1}") + if reIsClassBody.match(line): + if not reSpaceBeforeCurly.match(line): + print(f"WARNING: bad class inherit missing space before curly braces {filepath} Line number: {lineNumber+1}") + if not reClassSingleLine.match(line): + print(f"WARNING: bad class braces placement {filepath} Line number: {lineNumber+1}") + # bad_count_file += 1 + return bad_count_file def main(): @@ -131,16 +156,17 @@ def main(): parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") args = parser.parse_args() - # Allow running from root directory as well as from inside the tools directory - rootDir = "../addons" - if (os.path.exists("addons")): - rootDir = "addons" - - for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): - for filename in fnmatch.filter(filenames, '*.cpp'): - sqf_list.append(os.path.join(root, filename)) - for filename in fnmatch.filter(filenames, '*.hpp'): - sqf_list.append(os.path.join(root, filename)) + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) for filename in sqf_list: bad_count = bad_count + check_config_style(filename) diff --git a/tools/config_validator.py b/tools/config_validator.py index 71076007..50722319 100644 --- a/tools/config_validator.py +++ b/tools/config_validator.py @@ -13,7 +13,7 @@ ######## GLOBALS ######### MAINPREFIX = "Z" -PREFIX = "cav" +PREFIX = "ACE" ########################## def Fract_Sec(s): diff --git a/tools/deploy_both.ps1 b/tools/deploy_both.ps1 deleted file mode 100644 index c22ec925..00000000 --- a/tools/deploy_both.ps1 +++ /dev/null @@ -1,46 +0,0 @@ -if ( ![bool](Test-Path -Path "P:") ) { - Write-Host "Arma 3 P: is not mounted..." -ForegroundColor Red - exit 1 -} - -cd $PSScriptRoot\.. - -# Clear folder -Remove-Item releases -Force -Recurse -ErrorAction 'silentlycontinue' - -$tagVersion = git describe --tags --abbrev=0 -Write-Host "Build release versions for tag $tagVersion" -ForegroundColor Yellow - -$version = $tagVersion.Split(".") -$versionMajor = $version[0] -$versionMinor = $version[1] -$versionPatch = $version[2] -$versionBuild = 0 - -# Set version -Write-Host "Build both Hemtt and PBO Project Releases" -ForegroundColor Blue - -# Hemtt -Write-Host "Build Hemtt" -ForegroundColor Blue -cd $PSScriptRoot -.\deploy.ps1 - -# Rename hemtt zip -cd $PSScriptRoot\.. - -Write-Host "Renaming and saving hemtt release in temp" -New-Item -ItemType Directory -Path tools\temp -Force >$null 2>&1 -Rename-Item -Path .\releases\7CavAddon_$tagVersion.zip -NewName 7CavAddon_$tagVersion-hemtt.zip -Move-Item -Path .\releases\7CavAddon_$tagVersion-hemtt.zip -Destination .\tools\temp\. - - -# Pbo Project -Write-Host "Build Pbo Project" -ForegroundColor Blue -cd $PSScriptRoot -.\deploy_legacy.ps1 -cd $PSScriptRoot\.. - -# Rename hemtt zip -Rename-Item -Path .\releases\7CavAddon_$tagVersion.zip -NewName 7CavAddon_$tagVersion-pboProject.zip -Move-Item -Path .\tools\temp\7CavAddon_$tagVersion-hemtt.zip -Destination .\releases\. -Remove-Item .\tools\temp -Force -Recurse -ErrorAction 'SilentlyContinue' \ No newline at end of file diff --git a/tools/deploy_legacy.ps1 b/tools/deploy_legacy.ps1 deleted file mode 100644 index 9a0da7d7..00000000 --- a/tools/deploy_legacy.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -if ( ![bool](Test-Path -Path "P:") ) { - Write-Host "Arma 3 P: is not mounted..." -ForegroundColor Red - exit 1 -} - -# Set version -$tagVersion = git describe --tags --abbrev=0 -Write-Host "Build version $tagVersion" - -$version = $tagVersion.Split(".") -$versionMajor = $version[0] -$versionMinor = $version[1] -$versionPatch = $version[2] -$versionBuild = 0 - -sed -e "s/DevBuild/$tagVersion/g" "../mod.cpp" | Set-Content "../mod.cpp" - -Set-Content -Path '../addons/main/script_version.hpp' -Value "#define MAJOR $versionMajor -#define MINOR $versionMinor -#define PATCHLVL $versionPatch -#define BUILD $versionBuild" - -# Build release -py make.py release ci - -# Clean up -Write-Host "Restoring version files..." -git checkout origin/main ../addons/main/script_version.hpp -git checkout origin/main ../mod.cpp diff --git a/tools/extract_dependencies.py b/tools/extract_dependencies.py new file mode 100644 index 00000000..e28eb6cd --- /dev/null +++ b/tools/extract_dependencies.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 + +# Author: Jonpas +# Extracts dependencies to "docs/_includes/dependencies_list.md" for use with Jekyll include statement. +# Use the following line to add dependencies to an ACE3 feature page: {% include dependencies_list.md component="" %} + + +import os +import sys +import re + + +def get_dependencies(line): + dependencies = re.findall(r'"(.*?)"', line) + return dependencies + + +def main(): + if "--markdown" not in sys.argv: + print(""" + ############################################# + # Extract ACE3 Module Dependencies # + # (for Jekyll include) # + ############################################# + """) + + # Mod paths + script_path = os.path.realpath(__file__) + project_path = os.path.dirname(os.path.dirname(script_path)) + addons_path = os.path.join(project_path, "addons") + optionals_path = os.path.join(project_path, "optionals") + + # Documentation paths + include_path = os.path.join(project_path, "docs", "_includes") + dependencies_path = os.path.join(include_path, "dependencies_list.md") + + # Prepare files and paths list + if not os.path.exists(include_path): + print("Jekyll documentation not found!") + sys.exit(0) + + open(dependencies_path, "w", newline="\n").close() + if os.path.exists(addons_path): + addons = sorted(next(os.walk(addons_path))[1]) + if os.path.exists(optionals_path): + addons += ["."] + sorted(next(os.walk(optionals_path))[1]) + + dependencies_path_current = dependencies_path + addons_path_current = addons_path + + # Iterate through folders in the addons directories + for folder in addons: + # Ignore "main" component + if folder == "main": + continue + + # Change to optionals list on "." separator + if folder == ".": + if addons_path_current == addons_path: + addons_path_current = optionals_path + continue + + # Open config.cpp file and extract dependencies + data = [] + configfile = os.path.join(addons_path_current, folder, "config.cpp") + + if os.path.exists(configfile): + with open(os.path.join(addons_path_current, folder, "config.cpp")) as file: + match = False + for line in file: + # One-line + if not match and re.match(r"\s+requiredAddons\[\]\ = {.+?};", line): + data += get_dependencies(line) + break + # Multi-line + else: + if re.match(r"\s+requiredAddons\[\]\ = {", line): + # First line + match = True + data += get_dependencies(line) + continue + elif match and re.match(r"\s+};", line): + # Final line + data += get_dependencies(line) + match = False + break + elif match: + # All lines between + data += get_dependencies(line) + continue + + data = "`, `".join(data) + data = "`{}`".format(data) + + jekyll_statement = "".join([ + "{% if include.component == \"" + folder + "\" %}\n", + "- {}\n".format(data.replace(", ", "\n- ")), + "{% endif %}\n" + ]) + + with open(dependencies_path_current, "a", newline="\n") as file: + file.writelines([jekyll_statement, "\n"]) + + if "--markdown" not in sys.argv: + print("{}: {}".format(folder, data)) + else: + print(jekyll_statement) + + +if __name__ == "__main__": + main() diff --git a/tools/generate_airfriction_config.py b/tools/generate_airfriction_config.py new file mode 100644 index 00000000..70f87a22 --- /dev/null +++ b/tools/generate_airfriction_config.py @@ -0,0 +1,555 @@ +import math + +def retard(dm, bc, v): + mach = v / 340.276 + CDs = [] + Ms = [] + if (dm) == 1: + CDs = [0.2629, 0.2558, 0.2487, 0.2413, 0.2344, 0.2278, 0.2214, 0.2155, 0.2104, 0.2061, 0.2032, 0.2020, 0.2034, 0.2165, 0.2230, 0.2313, 0.2417, 0.2546, 0.2706, 0.2901, 0.3136, 0.3415, 0.3734, 0.4084, 0.4448, 0.4805, 0.5136, 0.5427, 0.5677, 0.5883, 0.6053, 0.6191, 0.6393, 0.6518, 0.6589, 0.6621, 0.6625, 0.6607, 0.6573, 0.6528, 0.6474, 0.6413, 0.6347, 0.6280, 0.6210, 0.6141, 0.6072, 0.6003, 0.5934, 0.5867, 0.5804, 0.5743, 0.5685, 0.5630, 0.5577, 0.5527, 0.5481, 0.5438, 0.5397, 0.5325, 0.5264, 0.5211, 0.5168, 0.5133, 0.5105, 0.5084, 0.5067, 0.5054, 0.5040, 0.5030, 0.5022, 0.5016, 0.5010, 0.5006, 0.4998, 0.4995, 0.4992, 0.4990, 0.4988] + Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.70, 0.725, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + elif (dm) == 2: + CDs = [0.2303, 0.2298, 0.2287, 0.2271, 0.2251, 0.2227, 0.2196, 0.2156, 0.2107, 0.2048, 0.1980, 0.1905, 0.1828, 0.1758, 0.1702, 0.1669, 0.1664, 0.1667, 0.1682, 0.1711, 0.1761, 0.1831, 0.2004, 0.2589, 0.3492, 0.3983, 0.4075, 0.4103, 0.4114, 0.4106, 0.4089, 0.4068, 0.4046, 0.4021, 0.3966, 0.3904, 0.3835, 0.3759, 0.3678, 0.3594, 0.3512, 0.3432, 0.3356, 0.3282, 0.3213, 0.3149, 0.3089, 0.3033, 0.2982, 0.2933, 0.2889, 0.2846, 0.2806, 0.2768, 0.2731, 0.2696, 0.2663, 0.2632, 0.2602, 0.2572, 0.2543, 0.2515, 0.2487, 0.2460, 0.2433, 0.2408, 0.2382, 0.2357, 0.2333, 0.2309, 0.2262, 0.2217, 0.2173, 0.2132, 0.2091, 0.2052, 0.2014, 0.1978, 0.1944, 0.1912, 0.1851, 0.1794, 0.1741, 0.1693, 0.1648] + Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.175, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + elif (dm) == 5: + CDs = [0.1710, 0.1719, 0.1727, 0.1732, 0.1734, 0.1730, 0.1718, 0.1696, 0.1668, 0.1637, 0.1603, 0.1566, 0.1529, 0.1497, 0.1473, 0.1463, 0.1489, 0.1583, 0.1672, 0.1815, 0.2051, 0.2413, 0.2884, 0.3379, 0.3785, 0.4032, 0.4147, 0.4201, 0.4278, 0.4338, 0.4373, 0.4392, 0.4403, 0.4406, 0.4401, 0.4386, 0.4362, 0.4328, 0.4286, 0.4237, 0.4182, 0.4121, 0.4057, 0.3991, 0.3926, 0.3861, 0.3800, 0.3741, 0.3684, 0.3630, 0.3578, 0.3529, 0.3481, 0.3435, 0.3391, 0.3349, 0.3269, 0.3194, 0.3125, 0.3060, 0.2999, 0.2942, 0.2889, 0.2838, 0.2790, 0.2745, 0.2703, 0.2662, 0.2624, 0.2588, 0.2553, 0.2488, 0.2429, 0.2376, 0.2326, 0.2280] + Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + elif (dm) == 6: + CDs = [0.2617, 0.2553, 0.2491, 0.2432, 0.2376, 0.2324, 0.2278, 0.2238, 0.2205, 0.2177, 0.2155, 0.2138, 0.2126, 0.2121, 0.2122, 0.2132, 0.2154, 0.2194, 0.2229, 0.2297, 0.2449, 0.2732, 0.3141, 0.3597, 0.3994, 0.4261, 0.4402, 0.4465, 0.4490, 0.4497, 0.4494, 0.4482, 0.4464, 0.4441, 0.4390, 0.4336, 0.4279, 0.4221, 0.4162, 0.4102, 0.4042, 0.3981, 0.3919, 0.3855, 0.3788, 0.3721, 0.3652, 0.3583, 0.3515, 0.3447, 0.3381, 0.3314, 0.3249, 0.3185, 0.3122, 0.3060, 0.3000, 0.2941, 0.2883, 0.2772, 0.2668, 0.2574, 0.2487, 0.2407, 0.2333, 0.2265, 0.2202, 0.2144, 0.2089, 0.2039, 0.1991, 0.1947, 0.1905, 0.1866, 0.1794, 0.1730, 0.1673, 0.1621, 0.1574] + Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.175, 1.20, 1.225, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + elif (dm) == 7: + CDs = [0.1198, 0.1197, 0.1196, 0.1194, 0.1193, 0.1194, 0.1194, 0.1194, 0.1193, 0.1193, 0.1194, 0.1193, 0.1194, 0.1197, 0.1202, 0.1207, 0.1215, 0.1226, 0.1242, 0.1266, 0.1306, 0.1368, 0.1464, 0.1660, 0.2054, 0.2993, 0.3803, 0.4015, 0.4043, 0.4034, 0.4014, 0.3987, 0.3955, 0.3884, 0.3810, 0.3732, 0.3657, 0.3580, 0.3440, 0.3376, 0.3315, 0.3260, 0.3209, 0.3160, 0.3117, 0.3078, 0.3042, 0.3010, 0.2980, 0.2951, 0.2922, 0.2892, 0.2864, 0.2835, 0.2807, 0.2779, 0.2752, 0.2725, 0.2697, 0.2670, 0.2643, 0.2615, 0.2588, 0.2561, 0.2533, 0.2506, 0.2479, 0.2451, 0.2424, 0.2368, 0.2313, 0.2258, 0.2205, 0.2154, 0.2106, 0.2060, 0.2017, 0.1975, 0.1935, 0.1861, 0.1793, 0.1730, 0.1672, 0.1618] + Ms = [0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.725, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + elif (dm) == 8: + CDs = [0.2105, 0.2105, 0.2104, 0.2104, 0.2103, 0.2103, 0.2103, 0.2103, 0.2103, 0.2102, 0.2102, 0.2102, 0.2102, 0.2102, 0.2103, 0.2103, 0.2104, 0.2104, 0.2105, 0.2106, 0.2109, 0.2183, 0.2571, 0.3358, 0.4068, 0.4378, 0.4476, 0.4493, 0.4477, 0.4450, 0.4419, 0.4353, 0.4283, 0.4208, 0.4133, 0.4059, 0.3986, 0.3915, 0.3845, 0.3777, 0.3710, 0.3645, 0.3581, 0.3519, 0.3458, 0.3400, 0.3343, 0.3288, 0.3234, 0.3182, 0.3131, 0.3081, 0.3032, 0.2983, 0.2937, 0.2891, 0.2845, 0.2802, 0.2720, 0.2642, 0.2569, 0.2499, 0.2432, 0.2368, 0.2308, 0.2251, 0.2197, 0.2147, 0.2101, 0.2058, 0.2019, 0.1983, 0.1950, 0.1890, 0.1837, 0.1791, 0.1750, 0.1713] + Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] + for i in range(len(Ms)): + if Ms[i] >= mach: + previousIdx = max(0, i - 1); + lc = CDs[previousIdx]; + lm = Ms[previousIdx]; + tc = lc + (CDs[i] - lc) * (mach - lm) / (Ms[i] - lm) + return 0.00068418 * (tc / bc) * pow(v, 2) + return 0 + +def distanceAtTOF2(tof, v, dM, bc): + lx = 0 + lt = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + t = 0 + while t <= tof: + lx = dx + lt = t + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + t = t+1/2 + return lx + (tof - lt) * (dx - lx) / (t - lt) + +def velocityAtM(m, v, a): + lx = 0 + lv = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + lx = dx + lv = v + drag = a*pow(v,2) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + return lv + (m - lx) * (v - lv) / (dx - lx) + +def velocityAtM2(m, v, dM, bc): + lx = 0 + lv = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + lx = dx + lv = v + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + return lv + (m - lx) * (v - lv) / (dx - lx) + +def velocityTillM(m, v, a, g): + velocities = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + velocities[round(dx)] = v + drag = a*pow(v,2) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * g + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + + return velocities + +def velocityTillM2(m, v, dM, bc): + velocities = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + velocities[round(dx)] = v + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + + return velocities + +def tofAtM(m, v, a): + lx = 0 + lt = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + t = 0 + while dx <= m: + lx = dx + lt = t + drag = a*pow(v,2) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + t = t+1/2 + return lt + (m - lx) * (t - lt) / (dx - lx) + +def tofAtM2(m, v, dM, bc): + lx = 0 + lt = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + t = 0 + while dx <= m: + lx = dx + lt = t + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + t = t+1/2 + return lt + (m - lx) * (t - lt) / (dx - lx) + +def tofTillM(m, v, a, g): + times = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + t = 0 + while dx <= m: + times[round(dx)] = t + drag = a*pow(v,2) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * g + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + t = t+1/2 + return times + +def tofTillM2(m, v, dM, bc): + times = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + t = 0 + while dx <= m: + times[round(dx)] = t + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + t = t+1/2 + return times + +def dropAtM(m, v, a): + lx = 0 + ly = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + lx = dx + ly = dy + drag = a*pow(v,2) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + return ly + (m - lx) * (dy - ly) / (dx - lx) + +def dropAtM2(m, v, dM, bc): + lx = 0 + ly = 0 + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx <= m: + lx = dx + ly = dy + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + return ly + (m - lx) * (dy - ly) / (dx - lx) + +def dropTillM(m, v, a, g): + drops = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx < m: + drops[round(dx)] = dy + drag = a*v*v + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * g + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + + return drops + +def dropTillM2(m, v, dM, bc): + drops = [0] * round(m + 1) + dx = 0 + dy = 0 + vx = v + vy = 0 + drag = 0 + while dx < m: + drops[round(dx)] = dy + drag = retard(dM, bc, v) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + vx = vx - (1/2000) * (vx/v) * drag + vy = vy - (1/2000) * (vy/v) * drag + vy = vy + (1/2000) * 9.8066 + v = math.sqrt(vx*vx+vy*vy) + dx = dx+(1/2000)*vx*0.5 + dy = dy+(1/2000)*vy*0.5 + + return drops + +def tofAtMDiff(m, v, a, d, bc): + return tofAtM2(m, v, d, bc)-tofAtM(m, v, a) + +def tofAtMDiffBC(m, v, dM1, bc1, dM2, bc2): + return tofAtM2(m, v, dM1, bc1)-tofAtM2(m, v, dM2, bc2) + +def velocityAtMDiff(m, v, a, d, bc): + return velocityAtM2(m, v, d, bc)-velocityAtM(m, v, a) + +def velocityAtMDiffBC(m, v, dM1, bc1, dM2, bc2): + return velocityAtM2(m, v, dM1, bc1)-velocityAtM2(m, v, dM2, bc2) + +def dragAtV(v, a): + return a*v^2 + +def dragAtV2(v, d, bc): + return retard(d, bc, v) + +def dragAtVDiff(v, a, d, bc): + return retard(d, bc, v)-a*pow(v,2) + +def dropAtMDiff(m, v, a, d, bc): + return dropAtM2(m, v, d, bc)-dropAtM(m, v, a) + +def dropAtMDiffBC(m, v, dM1, bc1, dM2, bc2): + return dropAtM2(m, v, dM1, bc1)-dropAtM2(m, v, dM2, bc2) + +def airFrictionAtV(v, d, bc): + return retard(d, bc, v)/pow(v,2) + +def maxDropDiff(m, v, a, dM, bc): + maxDiff = 0 + drops1 = dropTillM(m, v, a, 9.8066) + drops2 = dropTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) + return maxDiff + +def maxDropDiffG(m, v, a, dM, bc, g): + maxDiff = 0 + drops1 = dropTillM(m, v, a, g) + drops2 = dropTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) + return maxDiff + +def maxDropDiffV(distances, velocities, a, dM, bc): + maxDiff = 0 + for m, v in zip(distances, velocities): + drops1 = dropTillM(m, v, a, 9.8066) + drops2 = dropTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) + return maxDiff + +def maxDropDiffBC(m, v, dM1, bc1, dM2, bc2): + maxDiff = 0 + drops1 = dropTillM2(m, v, dM1, bc1) + drops2 = dropTillM2(m, v, dM2, bc2) + for d in range(0, m): + maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) + return maxDiff + +def maxVelocityDiff(m, v, a, dM, bc): + maxDiff = 0 + velocities1 = velocityTillM(m, v, a, 9.8066) + velocities2 = velocityTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) + return maxDiff + +def maxVelocityDiffG(m, v, a, dM, bc, g): + maxDiff = 0 + velocities1 = velocityTillM(m, v, a, g) + velocities2 = velocityTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) + return maxDiff + +def maxVelocityDiffV(distances, velocities, a, dM, bc): + maxDiff = 0 + for m, v in zip(distances, velocities): + velocities1 = velocityTillM(m, v, a, 9.8066) + velocities2 = velocityTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) + return maxDiff + +def maxVelocityDiffBC(m, v, dM1, bc1, dM2, bc2): + maxDiff = 0 + velocities1 = velocityTillM2(m, v, dM1, bc1) + velocities2 = velocityTillM2(m, v, dM2, bc2) + for d in range(0, m): + maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) + return maxDiff + +def maxTOFDiff(m, v, a, dM, bc): + maxDiff = 0 + times1 = tofTillM(m, v, a, 9.8066) + times2 = tofTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(times2[d] - times1[d])) + return maxDiff + +def maxTOFDiffG(m, v, a, dM, bc, g): + maxDiff = 0 + times1 = tofTillM(m, v, a, g) + times2 = tofTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(times2[d] - times1[d])) + return maxDiff + +def maxTOFDiffV(distances, velocities, a, dM, bc): + maxDiff = 0 + for m, v in zip(distances, velocities): + times1 = tofTillM(m, v, a, 9.8066) + times2 = tofTillM2(m, v, dM, bc) + for d in range(0, m): + maxDiff = max(maxDiff, abs(times2[d] - times1[d])) + return maxDiff + +def maxTOFDiffBC(m, v, dM1, bc1, dM2, bc2): + maxDiff = 0 + times1 = tofTillM2(m, v, dM1, bc1) + times2 = tofTillM2(m, v, dM2, bc2) + for d in range(0, m): + maxDiff = max(maxDiff, abs(times2[d] - times1[d])) + return maxDiff + +def predictAirFriction(mv, thresholdVelocity, dragModel, bc): + airFrictions = [] + for v in range(1,1000): + airFrictions.append(retard(dragModel, bc, v) / pow(v, 2)) + + arr = airFrictions[thresholdVelocity:mv] + return sum(arr)/len(arr) + +def calculateAirFriction(v, dragModel, bc): + return retard(dragModel, bc, v) / pow(v, 2) + +# Each list entry needs to be in the following form: +# [ammo name, list of engagement ranges, list of muzzle velocities, drag model, ballistic coefficient] +ammoList = [["B_556x45_Ball", [300, 500, 500], [750, 870, 910], 7, 0.151], + ["ACE_556x45_Ball_Mk262", [600, 600], [810, 840], 1, 0.361], + ["ACE_556x45_Ball_Mk318", [300, 500, 500], [780, 880, 950], 1, 0.307], + ["ACE_556x45_Ball_M995_AP", [400, 500], [820, 880], 1, 0.310], + ["B_545x39_Ball_F", [400, 500], [735, 892], 7, 0.168], + ["B_580x42_Ball_F", [500, 500], [930, 970], 7, 0.156], + ["ACE_580x42_DBP88_Ball", [950, 950], [890, 900], 7, 0.21], + ["B_65x39_Caseless", [400, 800, 800], [730, 800, 830], 7, 0.263], + ["ACE_65x47_Ball_Scenar", [500, 800], [730, 830], 7, 0.290], + ["ACE_65_Creedmor_Ball", [600, 1000], [750, 860], 7, 0.317], + ["B_762x51_Ball", [500, 800], [700, 833], 7, 0.2], + ["ACE_762x51_Ball_M118LR", [600, 800], [750, 795], 7, 0.243], + ["ACE_762x51_Ball_Mk316_Mod_0", [600, 800], [780, 810], 7, 0.243], + ["ACE_762x51_Ball_Mk319_Mod_0", [600, 800], [840, 910], 1, 0.377], + ["ACE_762x51_Ball_M993_AP", [600, 800], [875, 930], 1, 0.359], + ["ACE_30_06_M1_Ball", [600, 800, 900], [700, 800, 840], 1, 0.494], + ["ACE_7_Remington_Magnum_Ball", [600, 800, 1000], [720, 812, 830], 7, 0.345], + ["ACE_243_Winchester_Ball", [700, 900, 900], [830, 900, 920], 7, 0.278], + ["ACE_762x67_Ball_Mk248_Mod_0", [800, 900, 900], [865, 900, 924], 7, 0.268], + ["ACE_762x67_Ball_Mk248_Mod_1", [800, 900, 900], [847, 867, 877], 7, 0.310], + ["ACE_762x67_Ball_Berger_Hybrid_OTM", [1100, 1200, 1300], [800, 853, 884], 7, 0.368], + ["B_762x54_Ball", [500, 800, 800], [760, 835, 865], 1, 0.4], + ["ACE_762x35_Ball", [400, 500], [620, 675], 1, 0.330], + ["ACE_762x39_Ball", [400, 600], [650, 750], 1, 0.275], + ["ACE_762x54_Ball_7T2", [500, 800, 800], [735, 809, 838], 1, 0.395], + ["ACE_303_Ball", [900, 1000], [748, 765], 1, 0.493], + ["B_93x64_Ball", [900, 1000], [850, 880], 1, 0.368], + ["B_408_Ball", [1600,1600], [862, 872], 7, 0.434], + ["ACE_408_Ball", [1200,1200], [1057, 1067], 7, 0.279], + ["ACE_106x83mm_Ball", [1500, 1500], [955, 965], 1, 0.72], + ["B_338_Ball", [1100, 1300], [880, 925], 7, 0.322], + ["B_338_NM_Ball", [1100, 1300], [790, 820], 7, 0.381], + ["ACE_338_Ball", [1200, 1300], [800, 830], 7, 0.368], + ["ACE_338_Ball_API526", [1200, 1300], [880, 920], 7, 0.29], + ["B_50BW_Ball_F", [300, 400], [510, 596], 1, 0.21], + ["B_127x99_Ball", [1300, 1300], [895, 905], 1, 0.67], + ["ACE_127x99_Ball_AMAX", [1600, 1600], [855, 865], 1, 1.05], + ["B_127x108_Ball", [1300, 1300], [815, 825], 1, 0.63], + ["ACE_762x51_Ball_Subsonic", [200, 300], [305, 340], 7, 0.235], + ["B_9x21_Ball", [200, 300], [380, 420], 1, 0.165], + ["ACE_9x18_Ball_57N181S", [100, 200, 200], [298, 330, 350], 1, 0.125], + ["ACE_9x19_Ball", [100, 200, 200], [340, 370, 400], 1, 0.165], + ["ACE_10x25_Ball", [200, 300, 300], [360, 400, 430], 1, 0.189], + ["ACE_765x17_Ball", [100, 200, 200], [282, 300, 320], 1, 0.118], + ["B_127x54_Ball", [500, 500], [295, 305], 1, 1.050], + ["B_45ACP_Ball", [100, 200, 200], [230, 250, 285], 1, 0.195]] + +print ("Calculating ...") +print ("") + +open('../extras/airFrictionAnalysis.txt', 'w').close() + +for ammo in ammoList: + name = ammo[0] + maxRanges = ammo[1] + mvs = ammo[2] + dragModel = ammo[3] + BC = ammo[4] + + mv = round(sum(mvs) / len(mvs)) + bestA = calculateAirFriction(mv, dragModel, BC) + if (mv < 360): + bestA = predictAirFriction(mv, mv - 20, dragModel, BC) + else: + bestA = predictAirFriction(mv, 340, dragModel, BC) + minDropDiff = 100 + interval = 0.0003 + + while interval > 0.0000001: + low = bestA - interval + high = bestA + interval + a = low + while a < high: + dropDiff = maxDropDiffV(maxRanges, mvs, a, dragModel, BC) + if dropDiff < minDropDiff: + minDropDiff = dropDiff + bestA = a + a = a + interval / 10 + + interval = interval / 2 + + print (str(name) + " -> " + str(round(bestA, 8))) + with open('../extras/airFrictionAnalysis.txt', 'a') as f: + print ("##########################################", file=f) + print ("Ammo Class: " + name, file=f) + print ("MaxRanges (m): " + str(maxRanges), file=f) + print ("MuzzleVelocities (m/s): " + str(mvs), file=f) + print ("Max. Velocity diff (m/s): " + str(round(maxVelocityDiffV(maxRanges, mvs, bestA, dragModel, BC), 2)), file=f) + print ("Max. Drop diff (cm): " + str(round(minDropDiff * 100, 2)), file=f) + print ("Max. Tof diff (ms): " + str(maxTOFDiffV(maxRanges, mvs, bestA, dragModel, BC)), file=f) + print ("Optimal airFriction: " + str(round(bestA, 8)), file=f) + diff --git a/tools/publish.py b/tools/publish.py new file mode 100644 index 00000000..5ddc6980 --- /dev/null +++ b/tools/publish.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 + +# Author: PabstMirror + +# Uploads ace relases to workshop +# Will slice up compats to their own folders + +import sys + +if sys.version_info[0] == 2: + print("Python 3 is required.") + sys.exit(1) + +import os +import os.path +import shutil +import platform +import glob +import subprocess +import hashlib +import configparser +import json +import traceback +import time +import timeit +import re +import fnmatch + +if sys.platform == "win32": + import winreg + +def find_bi_tools(): + reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) + try: + k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") + arma3tools_path = winreg.QueryValueEx(k, "path")[0] + winreg.CloseKey(k) + except: + raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + + publisher_path = os.path.join(arma3tools_path, "Publisher", "PublisherCmd.exe") + + if os.path.isfile(publisher_path): + return publisher_path + else: + raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + + +def publishFolder(folder,modID,changeNotes): + cmd = [publisherTool_path, "update", "/id:{}".format(modID), "/changeNoteFile:{}".format(changeNotes), "/path:{}".format(folder)] + + print ("running: {}".format(cmd)) + + print("") + print("Publishing folder {} to workshop ID {}".format(folder,modID)) + print("") + if (not do_publish): + print("Just doing test build") + return + ret = subprocess.call(cmd) + if ret != 0: + print("publisher faild with code {}".format(ret)) + raise Exception("Publisher","Publisher had problems") + + +#GLOBALS +release_dir = "P:\\z\\ace\\release" +project = "@ace" +publisherTool_path = find_bi_tools() +changelog_path = os.path.join(release_dir,"changelog.txt") +ace_release_dir = os.path.join(release_dir, project) +ace_optionals_dir = os.path.join(ace_release_dir, "optionals") + +do_publish = True +# do_publish = False #will let you just build dirs and test without running publisher + + +def main(argv): + if not os.path.exists(ace_release_dir): + raise Exception("ace_release_dir not found","ACE not built or in wrong path") + if not os.path.exists(ace_optionals_dir): + raise Exception("ace_optionals_dir not found","ACE not built or in wrong path") + if not os.path.exists(publisherTool_path): + raise Exception("publisherTool_path not found","Arma Tools not found") + if not os.path.exists(changelog_path): + raise Exception("changelog_path not found","Requires changelog.txt be present in the release dir") + + if do_publish: + repl = input("\nThis will publish to steam, are you positive release dir has correct files? (y/n): ") + if repl.lower() != "y": + return 0 + + #ACE Main - http://steamcommunity.com/sharedfiles/filedetails/?id=463939057 + # Note: command line publisher doesn't like our file structure, just upload this one manually + + #noactionmenu: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202412030 + publishFolder(os.path.join(ace_optionals_dir,"@ace_noactionmenu"), "2202412030", changelog_path) + + #nocrosshair: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202412481 + publishFolder(os.path.join(ace_optionals_dir,"@ace_nocrosshair"), "2202412481", changelog_path) + + #nomedical: - https://steamcommunity.com/sharedfiles/filedetails/?id=3053169823 + publishFolder(os.path.join(ace_optionals_dir,"@ace_nomedical"), "3053169823", changelog_path) + + #norealisticnames: - https://steamcommunity.com/sharedfiles/filedetails/?id=3053177117 + publishFolder(os.path.join(ace_optionals_dir,"@ace_norealisticnames"), "3053177117", changelog_path) + + #nouniformrestrictions: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202413047 + publishFolder(os.path.join(ace_optionals_dir,"@ace_nouniformrestrictions"), "2202413047", changelog_path) + + #particles: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202413537 + publishFolder(os.path.join(ace_optionals_dir,"@ace_particles"), "2202413537", changelog_path) + + #realisticdispersion: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202414018 + publishFolder(os.path.join(ace_optionals_dir,"@ace_realisticdispersion"), "2202414018", changelog_path) + + #tracers: - https://steamcommunity.com/sharedfiles/filedetails/?id=2202414450 + publishFolder(os.path.join(ace_optionals_dir,"@ace_tracers"), "2202414450", changelog_path) + + +if __name__ == "__main__": + main(sys.argv) diff --git a/tools/search_undefinedFunctions.py b/tools/search_undefinedFunctions.py index 2c4fbeb5..6789bbe9 100644 --- a/tools/search_undefinedFunctions.py +++ b/tools/search_undefinedFunctions.py @@ -7,86 +7,104 @@ import sys import argparse +# handle x64 python clipboard, ref https://forums.autodesk.com/t5/maya-programming/ctypes-bug-cannot-copy-data-to-clipboard-via-python/m-p/9197068/highlight/true#M10992 import ctypes - -#from http://stackoverflow.com/a/3429034 -#Get required functions, strcpy.. -strcpy = ctypes.cdll.msvcrt.strcpy -ocb = ctypes.windll.user32.OpenClipboard #Basic Clipboard functions -ecb = ctypes.windll.user32.EmptyClipboard -gcd = ctypes.windll.user32.GetClipboardData -scd = ctypes.windll.user32.SetClipboardData -ccb = ctypes.windll.user32.CloseClipboard -ga = ctypes.windll.kernel32.GlobalAlloc # Global Memory allocation -gl = ctypes.windll.kernel32.GlobalLock # Global Memory Locking -gul = ctypes.windll.kernel32.GlobalUnlock -GMEM_DDESHARE = 0x2000 - -def Get( ): - ocb(None) # Open Clip, Default task - pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy ... - data = ctypes.c_char_p(pcontents).value - #gul(pcontents) ? - ccb() - return data +from ctypes import wintypes +CF_UNICODETEXT = 13 + + +user32 = ctypes.WinDLL('user32') +kernel32 = ctypes.WinDLL('kernel32') + +OpenClipboard = user32.OpenClipboard +OpenClipboard.argtypes = wintypes.HWND, +OpenClipboard.restype = wintypes.BOOL +CloseClipboard = user32.CloseClipboard +CloseClipboard.restype = wintypes.BOOL +EmptyClipboard = user32.EmptyClipboard +EmptyClipboard.restype = wintypes.BOOL +GetClipboardData = user32.GetClipboardData +GetClipboardData.argtypes = wintypes.UINT, +GetClipboardData.restype = wintypes.HANDLE +SetClipboardData = user32.SetClipboardData +SetClipboardData.argtypes = (wintypes.UINT, wintypes.HANDLE) +SetClipboardData.restype = wintypes.HANDLE +GlobalLock = kernel32.GlobalLock +GlobalLock.argtypes = wintypes.HGLOBAL, +GlobalLock.restype = wintypes.LPVOID +GlobalUnlock = kernel32.GlobalUnlock +GlobalUnlock.argtypes = wintypes.HGLOBAL, +GlobalUnlock.restype = wintypes.BOOL +GlobalAlloc = kernel32.GlobalAlloc +GlobalAlloc.argtypes = (wintypes.UINT, ctypes.c_size_t) +GlobalAlloc.restype = wintypes.HGLOBAL +GlobalSize = kernel32.GlobalSize +GlobalSize.argtypes = wintypes.HGLOBAL, +GlobalSize.restype = ctypes.c_size_t + +GMEM_MOVEABLE = 0x0002 +GMEM_ZEROINIT = 0x0040 def Paste( data ): - ocb(None) # Open Clip, Default task - ecb() - hCd = ga( GMEM_DDESHARE, len( bytes(data,"ascii") )+1 ) - pchData = gl(hCd) - strcpy(ctypes.c_char_p(pchData),bytes(data,"ascii")) - gul(hCd) - scd(1,hCd) - ccb() + data = data.encode('utf-16le') + OpenClipboard(None) + EmptyClipboard() + handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, len(data) + 2) + pcontents = GlobalLock(handle) + ctypes.memmove(pcontents, data, len(data)) + GlobalUnlock(handle) + SetClipboardData(CF_UNICODETEXT, handle) + CloseClipboard() def getFunctions(filepath): - selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + selfmodule = (re.search(r'addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) # print("Checking {0} from {1}".format(filepath,selfmodule)) + if (selfmodule.startswith("compat")): return [] with open(filepath, 'r') as file: content = file.read() - srch = re.compile('[^E]FUNC\(([_a-zA-Z0-9]*)\)') + srch = re.compile(r'[^E]FUNC\(([_a-zA-Z0-9]*)\)') modfuncs = srch.findall(content) modfuncs = sorted(set(modfuncs)) - srch = re.compile('EFUNC\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + srch = re.compile(r'EFUNC\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') exfuncs = srch.findall(content) exfuncs = sorted(set(exfuncs)) fileFuncs = [] for func in modfuncs: - fileFuncs.append("cav_{0}_fnc_{1}".format(selfmodule,func)) + fileFuncs.append("ace_{0}_fnc_{1}".format(selfmodule,func)) for exModule,func in exfuncs: - fileFuncs.append("cav_{0}_fnc_{1}".format(exModule, func)) + fileFuncs.append("ace_{0}_fnc_{1}".format(exModule, func)) return fileFuncs def getStrings(filepath): - selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + selfmodule = (re.search(r'addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) # print("Checking {0} from {1}".format(filepath,selfmodule)) + if (selfmodule.startswith("compat")): return [] with open(filepath, 'r') as file: content = file.read() - srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)') + srch = re.compile(r'[^E][CL]STRING\(([_a-zA-Z0-9]*)\)') modStrings = srch.findall(content) modStrings = sorted(set(modStrings)) - srch = re.compile('E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + srch = re.compile(r'E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') exStrings = srch.findall(content) exStrings = sorted(set(exStrings)) fileStrings = [] for localString in modStrings: - fileStrings.append("STR_CAV_{0}_{1}".format(selfmodule, localString)) + fileStrings.append("STR_ACE_{0}_{1}".format(selfmodule, localString)) for (exModule, exString) in exStrings: - fileStrings.append("STR_CAV_{0}_{1}".format(exModule, exString)) + fileStrings.append("STR_ACE_{0}_{1}".format(exModule, exString)) return fileStrings @@ -105,7 +123,8 @@ def main(): parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") args = parser.parse_args() - for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): + addon_base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + for root, dirnames, filenames in os.walk(addon_base_path +"/" + 'addons' + '/' + args.module): for filename in fnmatch.filter(filenames, '*.sqf'): sqf_list.append(os.path.join(root, filename)) for filename in fnmatch.filter(filenames, '*.cpp'): @@ -126,7 +145,7 @@ def main(): outputCode = "{0} allFunctions = {1}; allStrings = {2}; {3} {4}".format(codeHeader, list(set(allFunctions)), list(set(allStrings)), codeFuncCheck, codeStringCheck) print(outputCode) - Paste(outputCode); + Paste(outputCode) print ("") print ("Copied to clipboard, [funcs {0} / strings {1}]'".format(len(set(allFunctions)), len(set(allStrings)))) diff --git a/tools/setup.bat b/tools/setup.bat new file mode 100644 index 00000000..8d7245ab --- /dev/null +++ b/tools/setup.bat @@ -0,0 +1,16 @@ +;@Findstr -bv ;@F "%~f0" | powershell -Command - & pause & goto:eof + +Write-Output "=> Downloading ..." +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +$url = "https://github.com/BrettMayson/HEMTT/releases/latest/download/windows-x64.zip" +(New-Object Net.WebClient).DownloadFile($url, "hemtt.zip"); Write-Output "$url => hemtt.zip" + +Write-Output "`n=> Extracting ..." +Expand-Archive -Path "hemtt.zip" -DestinationPath "..\." -Force; Write-Output "hemtt.zip" +Remove-Item "hemtt.zip" + +Write-Output "`n=> Verifying ..." +Start-Process -FilePath ..\hemtt.exe -ArgumentList --version -NoNewWindow -Wait + +Write-Output "`nTools successfully installed to project!" diff --git a/tools/setupEditorPreviewImages.py b/tools/setupEditorPreviewImages.py deleted file mode 100644 index b659ad89..00000000 --- a/tools/setupEditorPreviewImages.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 - -# requires python-resize-image (PIL) -# pip install python-resize-image - -import os -import sys -from resizeimage import resizeimage -from PIL import Image - -__version__ = 0.1 - -######## GLOBALS ######### -DIRECTORY = "C:\\Users\\andre\\OneDrive\\Dokument\\Arma 3 - Other Profiles\\Camera\\Screenshots\\EditorPreviews\\@BlackOrder" -SIZE = [455,256] -########################## - -# Sets up arguments -PARAMS = sys.argv -paramsList = ["-config"] -param_config = [paramsList[0],"creates and add each object to a config file"] - -def main(): - print(""" -Editor Preview Image Creator {} -This script resize and convert the Arma 3 Snapshots to correct size and format. -Created by: Andreas Brostrom | Evul - """.format(__version__)) - - if "-h" in PARAMS or "--help" in PARAMS: - print("usage: {}".format(sys.argv[0]),end=' ') - for p in paramsList: - print("[{}]".format(p),end=' ') - print("[-h, --help]\n") - print("optional arguments:\n -h, --help show this help message and exit") - print(" {} {}".format(param_config[0],param_config[1])) - sys.exit() - - os.chdir(DIRECTORY) - imageList = [f for f in os.listdir(DIRECTORY) if os.path.isfile(os.path.join(DIRECTORY, f)) and ".png" in f] - - - if len(imageList) >= 1: - print("Found {} images".format(len(imageList))) - else: - sys.exit("No image files could be found in directory:\n\"{}\"\n\nPlease check the path or consult the BIS guide for how to set up Eden Preview images:\nhttps://community.bistudio.com/wiki/Eden_Editor:_Configuring_Asset_Previews".format(DIRECTORY)) - print("Prepering resize") - - for pic in imageList: - print ('resizing "{}" to {}x{}'.format(pic,SIZE[0],SIZE[1])) - - with open(pic, 'r+b') as f: - with Image.open(pic) as image: - # resizing - cover = resizeimage.resize_cover(image, [SIZE[0],SIZE[1]]) - cover.save(pic, image.format) - # converting image - with Image.open(pic) as image: - print("Converting and saving {} [{}] to jpg".format(pic[:-4],cover.mode)) - cover = image.convert('RGB') - cover.save('{}.jpg'.format(pic[:-4]), quality=95) - print("{}.jpg [{}] is converted and saved".format(pic[:-4],cover.mode)) - - # Remove png - for file in imageList: - print("Removing {}".format(file)) - os.remove(file) - print("All files are replaced with jpg") - - # Create config - if "-config" in PARAMS: - print("Creating config file") - configFile = open('EditorPreview.hpp', 'w') - configFile.write('class CfgVehicles'+' {\n') - for file in imageList: - print("Writing and adding class \"{}\" to config".format(file[:-4])) - configFile.write(' class {}'.format(file[:-4])+' {\n') - configFile.write(' QPATHTOF(EditorPreviews\\{}.jpg);\n'.format(file[:-4])) - configFile.write(' };\n') - configFile.write('};\n') - configFile.close() - print("Config created") -if __name__ == "__main__": - sys.exit(main()) diff --git a/tools/sqf_linter.py b/tools/sqf_linter.py index 79df3919..c71c7209 100644 --- a/tools/sqf_linter.py +++ b/tools/sqf_linter.py @@ -1,66 +1,83 @@ #!/usr/bin/env python3 - # Requires: https://github.com/LordGolias/sqf -import fnmatch import os import sys import argparse +import concurrent.futures from sqf.parser import parse import sqf.analyzer from sqf.exceptions import SQFParserError +addon_base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + + +def get_files_to_process(basePath): + arma_files = [] + for (root, _dirs, files) in os.walk(basePath): + for file in files: + if file.endswith(".sqf"): + if file.endswith(".inc.sqf"): + continue + filePath = os.path.join(root, file) + arma_files.append(filePath) + return arma_files -def analyze(filename, writer=sys.stdout): - warnings = 0 - errors = 0 - with open(filename, 'r') as file: - code = file.read() - try: - result = parse(code) - except SQFParserError as e: - print("{}:".format(filename)) - writer.write(' [%d,%d]:%s\n' % (e.position[0], e.position[1] - 1, e.message)) - return 0, 1 - exceptions = sqf.analyzer.analyze(result).exceptions +def process_file(filePath): + errors = [] + warnings = [] + try: + with open(filePath, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if "#ASC_ignoreFile" in content: + return (filePath, errors, warnings) + sqfLintParse = parse(content) + exceptions = sqf.analyzer.analyze(sqfLintParse).exceptions if (exceptions): - print("{}:".format(filename)) for e in exceptions: - if (e.message.startswith("error")): - errors += 1 - else: - warnings += 1 - writer.write(' [%d,%d]:%s\n' % (e.position[0], e.position[1] - 1, e.message)) + if ("assigned to an outer scope" in e.message): + warnings.append(f"[{e.position[0]},{e.position[1]}] {e.message}") + if ("is not from this scope" in e.message): + warnings.append(f"[{e.position[0]},{e.position[1]}] {e.message}") + if ("not used" in e.message): + warnings.append(f"[{e.position[0]},{e.position[1]}] {e.message}") - return warnings, errors + # most of this is just noise about macro parsing: + # if (e.message.startswith("error")): + # errors.append(f"[{e.position[0]},{e.position[1]}] {e.message}") + # else: + # warnings.append(f"[{e.position[0]},{e.position[1]}] {e.message}") + except Exception as e: + # errors.append(f"Exception {e}") + pass + return (filePath, errors, warnings) -def main(): - print("#########################") - print("# Lint Check #") - print("#########################") - sqf_list = [] - all_warnings = 0 - all_errors = 0 +def main(): parser = argparse.ArgumentParser() - parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") + parser.add_argument('-m', '--module', help='only search specified module addon folder', required=False, default=".") args = parser.parse_args() - for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): - for filename in fnmatch.filter(filenames, '*.sqf'): - sqf_list.append(os.path.join(root, filename)) - - for filename in sqf_list: - warnings, errors = analyze(filename) - all_warnings += warnings - all_errors += errors + error_count = 0 + addon_base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + if (args.module): addon_base_path = os.path.join(addon_base_path, "addons", args.module) + arma_files = get_files_to_process(addon_base_path) + print(f"Checking {len(arma_files)} files from {addon_base_path}") + with concurrent.futures.ThreadPoolExecutor(max_workers=12) as executor: + for (filePath, errors, warnings) in executor.map(process_file, arma_files): + if errors or warnings: + error_count += 1 + print(f"{filePath}") + for e in errors: + print(f" {e}") + for e in warnings: + print(f" {e}") - print ("Parse Errors {0} - Warnings {1}".format(all_errors,all_warnings)) + print("Errors: {}".format(error_count)) + return error_count - # return (all_errors + all_warnings) - return all_errors if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/tools/sqf_validator.py b/tools/sqf_validator.py index 6686004a..facdb114 100644 --- a/tools/sqf_validator.py +++ b/tools/sqf_validator.py @@ -149,6 +149,10 @@ def popClosing(): if pattern.match(content): print("ERROR: A found #include after block comment in file {0}".format(filepath)) bad_count_file += 1 + if ("functions" in filepath): + if (content.startswith("#include \"script_component.hpp\"")): + print(f"ERROR: Using old script_component.hpp in {filepath}") + bad_count_file += 1 @@ -165,14 +169,15 @@ def main(): parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") args = parser.parse_args() - # Allow running from root directory as well as from inside the tools directory - rootDir = "../addons" - if (os.path.exists("addons")): - rootDir = "addons" + for folder in ['addons', 'optionals']: + # Allow running from root directory as well as from inside the tools directory + rootDir = "../" + folder + if (os.path.exists(folder)): + rootDir = folder - for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): - for filename in fnmatch.filter(filenames, '*.sqf'): - sqf_list.append(os.path.join(root, filename)) + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) for filename in sqf_list: bad_count = bad_count + check_sqf_syntax(filename) diff --git a/tools/sqfvmChecker.py b/tools/sqfvmChecker.py new file mode 100644 index 00000000..69d75661 --- /dev/null +++ b/tools/sqfvmChecker.py @@ -0,0 +1,96 @@ +import os +import sys +import subprocess +import concurrent.futures +import tomllib + +addon_base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + +sqfvm_exe = os.path.join(addon_base_path, "sqfvm.exe") +virtual_paths = [ + # would need to add more even more to /include to use it + "P:/a3|/a3", # "{}|/a3".format(os.path.join(addon_base_path, "include", "a3")), + "P:/a3|/A3", + "P:/x/cba|/x/cba", + "{}|/z/ace".format(addon_base_path), +] + + +def get_files_to_process(basePath): + arma_files = [] + for root, _dirs, files in os.walk(os.path.join(addon_base_path, "addons")): + for file in files: + if file.endswith(".sqf") or file == "config.cpp": + if file.endswith(".inc.sqf"): + continue + skipPreprocessing = False + for addonTomlPath in [os.path.join(root, "addon.toml"), os.path.join(os.path.dirname(root), "addon.toml")]: + if os.path.isfile(addonTomlPath): + with open(addonTomlPath, "rb") as f: + tomlFile = tomllib.load(f) + try: + skipPreprocessing = tomlFile.get('tools')['sqfvm_skipConfigChecks'] + except: + pass + if file == "config.cpp" and skipPreprocessing: + continue # ignore configs with __has_include + filePath = os.path.join(root, file) + arma_files.append(filePath) + return arma_files + + +def process_file(filePath, skipA3Warnings=True, skipPragmaHemtt=True): + with open(filePath, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if content.startswith("//pragma SKIP_COMPILE"): + return False + cmd = [sqfvm_exe, "--input", filePath, "--parse-only", "--automated"] + for v in virtual_paths: + cmd.append("-v") + cmd.append(v) + # cmd.append("-V") + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) + try: + ret = proc.wait(12) # max wait - seconds + except Exception as _e: + print("sqfvm timed out: {}".format(filePath)) + return True + # print("{} = {}".format(filePath, ret)) + + fileHasError = False + keepReadingLines = True + while keepReadingLines: + line = proc.stdout.readline() + if not line: + keepReadingLines = False + else: + line = line.rstrip() + if line.startswith("[ERR]"): + fileHasError = True + if not ( + (skipA3Warnings and line.startswith("[WRN]") and ("a3/" in line) and (("Unexpected IFDEF" in line) or ("defined twice" in line))) + or (skipPragmaHemtt and line.startswith("[WRN]") and ("Unknown pragma instruction 'hemtt'" in line)) + ): + print(" {}".format(line)) + return fileHasError + + +def main(): + if not os.path.isfile(sqfvm_exe): + print("Error: sqfvm.exe not found in base folder [{}]".format(sqfvm_exe)) + return 1 + + error_count = 0 + arma_files = get_files_to_process(addon_base_path) + print("Checking {} files".format(len(arma_files))) + with concurrent.futures.ThreadPoolExecutor(max_workers=12) as executor: + for fileError in executor.map(process_file, arma_files): + if fileError: + error_count += 1 + + print("Errors: {}".format(error_count)) + return error_count + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/stringtable_validator.py b/tools/stringtable_validator.py index d86bbd96..8cd00014 100644 --- a/tools/stringtable_validator.py +++ b/tools/stringtable_validator.py @@ -16,15 +16,15 @@ ######## GLOBALS ######### -PROJECT_NAME = "cav" +PROJECT_NAME = "CAV" ########################## def check_stringtable(filepath): try: tree = ET.parse(filepath) - except: - print(" ERROR: Failed to parse file.") + except Exception as e: + print(" ERROR: Failed to parse file. {}".format(e)) return 1 errors = 0 @@ -53,7 +53,8 @@ def check_stringtable(filepath): print(" ERROR: Package name attribute '{}' is all lowercase, should be in titlecase.".format(package_name)) errors += 1 - if package_name.lower() != os.path.basename(os.path.dirname(filepath)): + component_folder = os.path.basename(os.path.dirname(filepath)) + if package_name.lower() != component_folder: print(" ERROR: Package name attribute '{}' does not match the component folder name.".format(package_name)) errors += 1 @@ -115,6 +116,29 @@ def check_stringtable(filepath): print(" ERROR: Key '{}' is defined {} times.".format(id, count)) errors += 1 + # Check whitespace for tabs and correct number of indenting spaces + with open(filepath, "r", encoding = "utf-8") as file: + spacing_depth = 0 + + for line_number, line in enumerate(file, 1): + if "\t" in line: + print(" ERROR: Found a tab on line {}.".format(line_number)) + errors += 1 + + line_clean = line.lstrip().lower() + + if line_clean.startswith(" Date: Mon, 29 Jul 2024 11:38:00 +0200 Subject: [PATCH 02/16] Updated tools (#256) * Updated tools and workflows * Fixed script_component.hpp * Run all validations always * Arma is now testing in action caption * Added manual deploy * Updated * updated script --- .github/workflows/hemtt-deploy.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/workflows/hemtt-deploy.yml b/.github/workflows/hemtt-deploy.yml index bf11e3f7..b4c7127f 100644 --- a/.github/workflows/hemtt-deploy.yml +++ b/.github/workflows/hemtt-deploy.yml @@ -12,7 +12,7 @@ on: - dev - live jobs: - windows: + deploy: runs-on: windows-latest steps: - name: Checkout the source code @@ -23,17 +23,9 @@ jobs: uses: actions/checkout@v4 - name: Run HEMTT release run: hemtt release - #- name: Rename build folder - # run: mv .hemttout/build .hemttout/@cav - name: DEBUG ending... run: | Write-Host "Environment: $ENVIRONMENT" - Get-Content -Path .hemttout + Get-Content -Path .hemttout\ env: - ENVIRONMENT: ${{ inputs.environment }} - shell: pwsh - #- name: Upload Artifact - # uses: actions/upload-artifact@v4 - # with: - # name: cav-${{ github.sha }} - # path: .hemttout/@* \ No newline at end of file + ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file From 9f4507c1730f85e78fd2bf68241daefa248cc576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 11:43:17 +0200 Subject: [PATCH 03/16] Updated naming of workflow (#257) --- .github/workflows/build.yml | 48 +++++++++++++------ .../{hemtt-deploy.yml => deploy.yml} | 0 .github/workflows/hemtt.yml | 38 --------------- 3 files changed, 33 insertions(+), 53 deletions(-) rename .github/workflows/{hemtt-deploy.yml => deploy.yml} (100%) delete mode 100644 .github/workflows/hemtt.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 76efc176..cdd9d67e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,20 +1,38 @@ name: Build + on: - release: - types: [ published ] + push: + branches: + - main + pull_request_target: + jobs: build: - runs-on: ubuntu-latest + runs-on: windows-latest steps: - - uses: actions/checkout@v2 - - name: Setup HEMTT - uses: arma-actions/hemtt@v1 - - name: Run HEMTT build - run: ./tools/deploy.sh ${{ github.ref_name }} - - name: Upload release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref_name }} - file: release/7CavAddon_${{ github.ref_name }}-hemtt.zip - overwrite: true + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Checkout pull request + uses: actions/checkout@v4 + if: ${{ github.event_name == 'pull_request_target' }} + with: + path: pullrequest + ref: 'refs/pull/${{ github.event.number }}/merge' + - name: Replace addons with pull request addons + if: ${{ github.event_name == 'pull_request_target' }} + run: | + rm -r addons\ + rm -r include\ + xcopy /e /h /q pullrequest\addons addons\ + xcopy /e /h /q pullrequest\include include\ + - name: Run HEMTT build + run: hemtt build + - name: Rename build folder + run: mv .hemttout/build .hemttout/@cav + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: cav-${{ github.sha }} + path: .hemttout/@* \ No newline at end of file diff --git a/.github/workflows/hemtt-deploy.yml b/.github/workflows/deploy.yml similarity index 100% rename from .github/workflows/hemtt-deploy.yml rename to .github/workflows/deploy.yml diff --git a/.github/workflows/hemtt.yml b/.github/workflows/hemtt.yml deleted file mode 100644 index 3ca73d8e..00000000 --- a/.github/workflows/hemtt.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: HEMTT - -on: - push: - branches: - - main - pull_request_target: - -jobs: - windows: - runs-on: windows-latest - steps: - - name: Checkout the source code - uses: actions/checkout@v4 - - name: Setup HEMTT - uses: arma-actions/hemtt@v1 - - name: Checkout pull request - uses: actions/checkout@v4 - if: ${{ github.event_name == 'pull_request_target' }} - with: - path: pullrequest - ref: 'refs/pull/${{ github.event.number }}/merge' - - name: Replace addons with pull request addons - if: ${{ github.event_name == 'pull_request_target' }} - run: | - rm -r addons\ - rm -r include\ - xcopy /e /h /q pullrequest\addons addons\ - xcopy /e /h /q pullrequest\include include\ - - name: Run HEMTT build - run: hemtt build - - name: Rename build folder - run: mv .hemttout/build .hemttout/@cav - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: cav-${{ github.sha }} - path: .hemttout/@* \ No newline at end of file From cc3bd5cff3631c55ba5253d57a5ec0cd05694870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 12:13:58 +0200 Subject: [PATCH 04/16] testpath (#258) --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b4c7127f..c951c9e8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout pull request uses: actions/checkout@v4 - name: Run HEMTT release - run: hemtt release + run: D:\\a\\7CavAddon\\7CavAddon\\hemtt\\hemtt.exe release - name: DEBUG ending... run: | Write-Host "Environment: $ENVIRONMENT" From 7de40f6f08ac7dd6fd66290b2b2975202bbd3727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 12:17:44 +0200 Subject: [PATCH 05/16] fixed dubble checkout (#259) --- .github/workflows/deploy.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c951c9e8..98dd73af 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,10 +19,8 @@ jobs: uses: actions/checkout@v4 - name: Setup HEMTT uses: arma-actions/hemtt@v1 - - name: Checkout pull request - uses: actions/checkout@v4 - name: Run HEMTT release - run: D:\\a\\7CavAddon\\7CavAddon\\hemtt\\hemtt.exe release + run: hemtt release - name: DEBUG ending... run: | Write-Host "Environment: $ENVIRONMENT" From 44ef144cd294ab7c43e3f31dc485cfae916b5bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 12:28:38 +0200 Subject: [PATCH 06/16] Advanced deploy (#260) * Advanced deploy * fidxed missing env --- .github/workflows/deploy.yml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 98dd73af..034c1c89 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,10 +20,17 @@ jobs: - name: Setup HEMTT uses: arma-actions/hemtt@v1 - name: Run HEMTT release - run: hemtt release - - name: DEBUG ending... + if: ${{ inputs.environment == 'live' }} run: | - Write-Host "Environment: $ENVIRONMENT" - Get-Content -Path .hemttout\ + hemtt release + Get-ChildItem -Path .hemttout\ env: - ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file + ENVIRONMENT: ${{ inputs.environment }} + + - name: Run HEMTT build + if: ${{ inputs.environment == 'dev' }} + run: | + hemtt release + Get-ChildItem -Path .hemttout\ + env: + ENVIRONMENT: ${{ inputs.environment }} From 07ab7295f7ffedb0ca4063d06fd1f7c342b1b2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 12:36:58 +0200 Subject: [PATCH 07/16] Advanced deploy (#261) * Advanced deploy * fidxed missing env * test dynamic name --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 034c1c89..34bec252 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,4 +1,5 @@ name: Deploy +run-name: Deploying to ${{ inputs.environment }} on: workflow_dispatch: From c0f2b2170e8c2e44615bc84cfc7fd45631bb5329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 12:45:56 +0200 Subject: [PATCH 08/16] Advanced deploy (#262) * Advanced deploy * fidxed missing env * test dynamic name * list files and content * more description --- .github/workflows/deploy.yml | 48 +++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 34bec252..3b323870 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,37 +1,39 @@ name: Deploy -run-name: Deploying to ${{ inputs.environment }} +run-name: Deploying ${{ inputs.environment }} build from ${{github.ref_name}} on: workflow_dispatch: inputs: environment: - description: 'Selected deploy enviroment' + description: "Selected deploy enviroment" required: true - default: 'dev' + default: "dev" type: choice options: - - dev - - live + - dev + - live jobs: deploy: runs-on: windows-latest steps: - - name: Checkout the source code - uses: actions/checkout@v4 - - name: Setup HEMTT - uses: arma-actions/hemtt@v1 - - name: Run HEMTT release - if: ${{ inputs.environment == 'live' }} - run: | - hemtt release - Get-ChildItem -Path .hemttout\ - env: - ENVIRONMENT: ${{ inputs.environment }} + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT release + if: ${{ inputs.environment == 'live' }} + run: | + hemtt release + Get-ChildItem -Path .hemttout\ + Get-ChildItem -Path releases\ + env: + ENVIRONMENT: ${{ inputs.environment }} - - name: Run HEMTT build - if: ${{ inputs.environment == 'dev' }} - run: | - hemtt release - Get-ChildItem -Path .hemttout\ - env: - ENVIRONMENT: ${{ inputs.environment }} + - name: Run HEMTT build + if: ${{ inputs.environment == 'dev' }} + run: | + hemtt build + Get-ChildItem -Path .hemttout\ + Get-ChildItem -Path releases\ + env: + ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file From b4bf2af0f4630f158951cd7ac314a5303186676c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 13:21:42 +0200 Subject: [PATCH 09/16] added tag release deploy (#263) --- .github/workflows/deploy-release.yml | 24 ++++++++++++++++++++++++ .github/workflows/deploy.yml | 12 +++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/deploy-release.yml diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml new file mode 100644 index 00000000..0e04b451 --- /dev/null +++ b/.github/workflows/deploy-release.yml @@ -0,0 +1,24 @@ +name: Deploy Release +on: + release: + types: [published] + +jobs: + release: + runs-on: windows-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT release + run: | + hemtt release + Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip + - name: Upload release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} + asset_name: 7CavAddon-${{github.ref_name}}.zip + file: release/7CavAddon-${{github.ref_name}}.zip diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3b323870..6d0a9cc0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,8 +24,10 @@ jobs: if: ${{ inputs.environment == 'live' }} run: | hemtt release - Get-ChildItem -Path .hemttout\ - Get-ChildItem -Path releases\ + Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue + Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue + Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip + Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue env: ENVIRONMENT: ${{ inputs.environment }} @@ -33,7 +35,7 @@ jobs: if: ${{ inputs.environment == 'dev' }} run: | hemtt build - Get-ChildItem -Path .hemttout\ - Get-ChildItem -Path releases\ + Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue + Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue env: - ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file + ENVIRONMENT: ${{ inputs.environment }} From 249582adccfb7596a662422bb40d8795eb5e3bb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 13:31:17 +0200 Subject: [PATCH 10/16] Fixed indent (#264) --- .github/workflows/deploy-release.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 0e04b451..209ed844 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -16,9 +16,9 @@ jobs: hemtt release Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip - name: Upload release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - asset_name: 7CavAddon-${{github.ref_name}}.zip - file: release/7CavAddon-${{github.ref_name}}.zip + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} + asset_name: 7CavAddon-${{github.ref_name}}.zip + file: release/7CavAddon-${{github.ref_name}}.zip From 24748a429585e182e8ca8e062d828d31559a7d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 13:57:20 +0200 Subject: [PATCH 11/16] Updated code for tools again (#265) * Fixed indent * updated stuff --- .github/workflows/deploy-release.yml | 1 + tools/generate_airfriction_config.py | 555 --------------------------- tools/getTagVersion.ps1 | 19 + 3 files changed, 20 insertions(+), 555 deletions(-) delete mode 100644 tools/generate_airfriction_config.py create mode 100644 tools/getTagVersion.ps1 diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 209ed844..82518ffe 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -13,6 +13,7 @@ jobs: uses: arma-actions/hemtt@v1 - name: Run HEMTT release run: | + .\tools\getTagVersion.ps1 hemtt release Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip - name: Upload release diff --git a/tools/generate_airfriction_config.py b/tools/generate_airfriction_config.py deleted file mode 100644 index 70f87a22..00000000 --- a/tools/generate_airfriction_config.py +++ /dev/null @@ -1,555 +0,0 @@ -import math - -def retard(dm, bc, v): - mach = v / 340.276 - CDs = [] - Ms = [] - if (dm) == 1: - CDs = [0.2629, 0.2558, 0.2487, 0.2413, 0.2344, 0.2278, 0.2214, 0.2155, 0.2104, 0.2061, 0.2032, 0.2020, 0.2034, 0.2165, 0.2230, 0.2313, 0.2417, 0.2546, 0.2706, 0.2901, 0.3136, 0.3415, 0.3734, 0.4084, 0.4448, 0.4805, 0.5136, 0.5427, 0.5677, 0.5883, 0.6053, 0.6191, 0.6393, 0.6518, 0.6589, 0.6621, 0.6625, 0.6607, 0.6573, 0.6528, 0.6474, 0.6413, 0.6347, 0.6280, 0.6210, 0.6141, 0.6072, 0.6003, 0.5934, 0.5867, 0.5804, 0.5743, 0.5685, 0.5630, 0.5577, 0.5527, 0.5481, 0.5438, 0.5397, 0.5325, 0.5264, 0.5211, 0.5168, 0.5133, 0.5105, 0.5084, 0.5067, 0.5054, 0.5040, 0.5030, 0.5022, 0.5016, 0.5010, 0.5006, 0.4998, 0.4995, 0.4992, 0.4990, 0.4988] - Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.70, 0.725, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - elif (dm) == 2: - CDs = [0.2303, 0.2298, 0.2287, 0.2271, 0.2251, 0.2227, 0.2196, 0.2156, 0.2107, 0.2048, 0.1980, 0.1905, 0.1828, 0.1758, 0.1702, 0.1669, 0.1664, 0.1667, 0.1682, 0.1711, 0.1761, 0.1831, 0.2004, 0.2589, 0.3492, 0.3983, 0.4075, 0.4103, 0.4114, 0.4106, 0.4089, 0.4068, 0.4046, 0.4021, 0.3966, 0.3904, 0.3835, 0.3759, 0.3678, 0.3594, 0.3512, 0.3432, 0.3356, 0.3282, 0.3213, 0.3149, 0.3089, 0.3033, 0.2982, 0.2933, 0.2889, 0.2846, 0.2806, 0.2768, 0.2731, 0.2696, 0.2663, 0.2632, 0.2602, 0.2572, 0.2543, 0.2515, 0.2487, 0.2460, 0.2433, 0.2408, 0.2382, 0.2357, 0.2333, 0.2309, 0.2262, 0.2217, 0.2173, 0.2132, 0.2091, 0.2052, 0.2014, 0.1978, 0.1944, 0.1912, 0.1851, 0.1794, 0.1741, 0.1693, 0.1648] - Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.175, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - elif (dm) == 5: - CDs = [0.1710, 0.1719, 0.1727, 0.1732, 0.1734, 0.1730, 0.1718, 0.1696, 0.1668, 0.1637, 0.1603, 0.1566, 0.1529, 0.1497, 0.1473, 0.1463, 0.1489, 0.1583, 0.1672, 0.1815, 0.2051, 0.2413, 0.2884, 0.3379, 0.3785, 0.4032, 0.4147, 0.4201, 0.4278, 0.4338, 0.4373, 0.4392, 0.4403, 0.4406, 0.4401, 0.4386, 0.4362, 0.4328, 0.4286, 0.4237, 0.4182, 0.4121, 0.4057, 0.3991, 0.3926, 0.3861, 0.3800, 0.3741, 0.3684, 0.3630, 0.3578, 0.3529, 0.3481, 0.3435, 0.3391, 0.3349, 0.3269, 0.3194, 0.3125, 0.3060, 0.2999, 0.2942, 0.2889, 0.2838, 0.2790, 0.2745, 0.2703, 0.2662, 0.2624, 0.2588, 0.2553, 0.2488, 0.2429, 0.2376, 0.2326, 0.2280] - Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - elif (dm) == 6: - CDs = [0.2617, 0.2553, 0.2491, 0.2432, 0.2376, 0.2324, 0.2278, 0.2238, 0.2205, 0.2177, 0.2155, 0.2138, 0.2126, 0.2121, 0.2122, 0.2132, 0.2154, 0.2194, 0.2229, 0.2297, 0.2449, 0.2732, 0.3141, 0.3597, 0.3994, 0.4261, 0.4402, 0.4465, 0.4490, 0.4497, 0.4494, 0.4482, 0.4464, 0.4441, 0.4390, 0.4336, 0.4279, 0.4221, 0.4162, 0.4102, 0.4042, 0.3981, 0.3919, 0.3855, 0.3788, 0.3721, 0.3652, 0.3583, 0.3515, 0.3447, 0.3381, 0.3314, 0.3249, 0.3185, 0.3122, 0.3060, 0.3000, 0.2941, 0.2883, 0.2772, 0.2668, 0.2574, 0.2487, 0.2407, 0.2333, 0.2265, 0.2202, 0.2144, 0.2089, 0.2039, 0.1991, 0.1947, 0.1905, 0.1866, 0.1794, 0.1730, 0.1673, 0.1621, 0.1574] - Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.175, 1.20, 1.225, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - elif (dm) == 7: - CDs = [0.1198, 0.1197, 0.1196, 0.1194, 0.1193, 0.1194, 0.1194, 0.1194, 0.1193, 0.1193, 0.1194, 0.1193, 0.1194, 0.1197, 0.1202, 0.1207, 0.1215, 0.1226, 0.1242, 0.1266, 0.1306, 0.1368, 0.1464, 0.1660, 0.2054, 0.2993, 0.3803, 0.4015, 0.4043, 0.4034, 0.4014, 0.3987, 0.3955, 0.3884, 0.3810, 0.3732, 0.3657, 0.3580, 0.3440, 0.3376, 0.3315, 0.3260, 0.3209, 0.3160, 0.3117, 0.3078, 0.3042, 0.3010, 0.2980, 0.2951, 0.2922, 0.2892, 0.2864, 0.2835, 0.2807, 0.2779, 0.2752, 0.2725, 0.2697, 0.2670, 0.2643, 0.2615, 0.2588, 0.2561, 0.2533, 0.2506, 0.2479, 0.2451, 0.2424, 0.2368, 0.2313, 0.2258, 0.2205, 0.2154, 0.2106, 0.2060, 0.2017, 0.1975, 0.1935, 0.1861, 0.1793, 0.1730, 0.1672, 0.1618] - Ms = [0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.725, 0.75, 0.775, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - elif (dm) == 8: - CDs = [0.2105, 0.2105, 0.2104, 0.2104, 0.2103, 0.2103, 0.2103, 0.2103, 0.2103, 0.2102, 0.2102, 0.2102, 0.2102, 0.2102, 0.2103, 0.2103, 0.2104, 0.2104, 0.2105, 0.2106, 0.2109, 0.2183, 0.2571, 0.3358, 0.4068, 0.4378, 0.4476, 0.4493, 0.4477, 0.4450, 0.4419, 0.4353, 0.4283, 0.4208, 0.4133, 0.4059, 0.3986, 0.3915, 0.3845, 0.3777, 0.3710, 0.3645, 0.3581, 0.3519, 0.3458, 0.3400, 0.3343, 0.3288, 0.3234, 0.3182, 0.3131, 0.3081, 0.3032, 0.2983, 0.2937, 0.2891, 0.2845, 0.2802, 0.2720, 0.2642, 0.2569, 0.2499, 0.2432, 0.2368, 0.2308, 0.2251, 0.2197, 0.2147, 0.2101, 0.2058, 0.2019, 0.1983, 0.1950, 0.1890, 0.1837, 0.1791, 0.1750, 0.1713] - Ms = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.825, 0.85, 0.875, 0.90, 0.925, 0.95, 0.975, 1.0, 1.025, 1.05, 1.075, 1.10, 1.125, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00] - for i in range(len(Ms)): - if Ms[i] >= mach: - previousIdx = max(0, i - 1); - lc = CDs[previousIdx]; - lm = Ms[previousIdx]; - tc = lc + (CDs[i] - lc) * (mach - lm) / (Ms[i] - lm) - return 0.00068418 * (tc / bc) * pow(v, 2) - return 0 - -def distanceAtTOF2(tof, v, dM, bc): - lx = 0 - lt = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - t = 0 - while t <= tof: - lx = dx - lt = t - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - t = t+1/2 - return lx + (tof - lt) * (dx - lx) / (t - lt) - -def velocityAtM(m, v, a): - lx = 0 - lv = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - lx = dx - lv = v - drag = a*pow(v,2) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - return lv + (m - lx) * (v - lv) / (dx - lx) - -def velocityAtM2(m, v, dM, bc): - lx = 0 - lv = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - lx = dx - lv = v - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - return lv + (m - lx) * (v - lv) / (dx - lx) - -def velocityTillM(m, v, a, g): - velocities = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - velocities[round(dx)] = v - drag = a*pow(v,2) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * g - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - - return velocities - -def velocityTillM2(m, v, dM, bc): - velocities = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - velocities[round(dx)] = v - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - - return velocities - -def tofAtM(m, v, a): - lx = 0 - lt = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - t = 0 - while dx <= m: - lx = dx - lt = t - drag = a*pow(v,2) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - t = t+1/2 - return lt + (m - lx) * (t - lt) / (dx - lx) - -def tofAtM2(m, v, dM, bc): - lx = 0 - lt = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - t = 0 - while dx <= m: - lx = dx - lt = t - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - t = t+1/2 - return lt + (m - lx) * (t - lt) / (dx - lx) - -def tofTillM(m, v, a, g): - times = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - t = 0 - while dx <= m: - times[round(dx)] = t - drag = a*pow(v,2) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * g - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - t = t+1/2 - return times - -def tofTillM2(m, v, dM, bc): - times = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - t = 0 - while dx <= m: - times[round(dx)] = t - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - t = t+1/2 - return times - -def dropAtM(m, v, a): - lx = 0 - ly = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - lx = dx - ly = dy - drag = a*pow(v,2) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - return ly + (m - lx) * (dy - ly) / (dx - lx) - -def dropAtM2(m, v, dM, bc): - lx = 0 - ly = 0 - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx <= m: - lx = dx - ly = dy - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - return ly + (m - lx) * (dy - ly) / (dx - lx) - -def dropTillM(m, v, a, g): - drops = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx < m: - drops[round(dx)] = dy - drag = a*v*v - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * g - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - - return drops - -def dropTillM2(m, v, dM, bc): - drops = [0] * round(m + 1) - dx = 0 - dy = 0 - vx = v - vy = 0 - drag = 0 - while dx < m: - drops[round(dx)] = dy - drag = retard(dM, bc, v) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - vx = vx - (1/2000) * (vx/v) * drag - vy = vy - (1/2000) * (vy/v) * drag - vy = vy + (1/2000) * 9.8066 - v = math.sqrt(vx*vx+vy*vy) - dx = dx+(1/2000)*vx*0.5 - dy = dy+(1/2000)*vy*0.5 - - return drops - -def tofAtMDiff(m, v, a, d, bc): - return tofAtM2(m, v, d, bc)-tofAtM(m, v, a) - -def tofAtMDiffBC(m, v, dM1, bc1, dM2, bc2): - return tofAtM2(m, v, dM1, bc1)-tofAtM2(m, v, dM2, bc2) - -def velocityAtMDiff(m, v, a, d, bc): - return velocityAtM2(m, v, d, bc)-velocityAtM(m, v, a) - -def velocityAtMDiffBC(m, v, dM1, bc1, dM2, bc2): - return velocityAtM2(m, v, dM1, bc1)-velocityAtM2(m, v, dM2, bc2) - -def dragAtV(v, a): - return a*v^2 - -def dragAtV2(v, d, bc): - return retard(d, bc, v) - -def dragAtVDiff(v, a, d, bc): - return retard(d, bc, v)-a*pow(v,2) - -def dropAtMDiff(m, v, a, d, bc): - return dropAtM2(m, v, d, bc)-dropAtM(m, v, a) - -def dropAtMDiffBC(m, v, dM1, bc1, dM2, bc2): - return dropAtM2(m, v, dM1, bc1)-dropAtM2(m, v, dM2, bc2) - -def airFrictionAtV(v, d, bc): - return retard(d, bc, v)/pow(v,2) - -def maxDropDiff(m, v, a, dM, bc): - maxDiff = 0 - drops1 = dropTillM(m, v, a, 9.8066) - drops2 = dropTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) - return maxDiff - -def maxDropDiffG(m, v, a, dM, bc, g): - maxDiff = 0 - drops1 = dropTillM(m, v, a, g) - drops2 = dropTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) - return maxDiff - -def maxDropDiffV(distances, velocities, a, dM, bc): - maxDiff = 0 - for m, v in zip(distances, velocities): - drops1 = dropTillM(m, v, a, 9.8066) - drops2 = dropTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) - return maxDiff - -def maxDropDiffBC(m, v, dM1, bc1, dM2, bc2): - maxDiff = 0 - drops1 = dropTillM2(m, v, dM1, bc1) - drops2 = dropTillM2(m, v, dM2, bc2) - for d in range(0, m): - maxDiff = max(maxDiff, abs(drops2[d] - drops1[d])) - return maxDiff - -def maxVelocityDiff(m, v, a, dM, bc): - maxDiff = 0 - velocities1 = velocityTillM(m, v, a, 9.8066) - velocities2 = velocityTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) - return maxDiff - -def maxVelocityDiffG(m, v, a, dM, bc, g): - maxDiff = 0 - velocities1 = velocityTillM(m, v, a, g) - velocities2 = velocityTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) - return maxDiff - -def maxVelocityDiffV(distances, velocities, a, dM, bc): - maxDiff = 0 - for m, v in zip(distances, velocities): - velocities1 = velocityTillM(m, v, a, 9.8066) - velocities2 = velocityTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) - return maxDiff - -def maxVelocityDiffBC(m, v, dM1, bc1, dM2, bc2): - maxDiff = 0 - velocities1 = velocityTillM2(m, v, dM1, bc1) - velocities2 = velocityTillM2(m, v, dM2, bc2) - for d in range(0, m): - maxDiff = max(maxDiff, abs(velocities2[d] - velocities1[d])) - return maxDiff - -def maxTOFDiff(m, v, a, dM, bc): - maxDiff = 0 - times1 = tofTillM(m, v, a, 9.8066) - times2 = tofTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(times2[d] - times1[d])) - return maxDiff - -def maxTOFDiffG(m, v, a, dM, bc, g): - maxDiff = 0 - times1 = tofTillM(m, v, a, g) - times2 = tofTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(times2[d] - times1[d])) - return maxDiff - -def maxTOFDiffV(distances, velocities, a, dM, bc): - maxDiff = 0 - for m, v in zip(distances, velocities): - times1 = tofTillM(m, v, a, 9.8066) - times2 = tofTillM2(m, v, dM, bc) - for d in range(0, m): - maxDiff = max(maxDiff, abs(times2[d] - times1[d])) - return maxDiff - -def maxTOFDiffBC(m, v, dM1, bc1, dM2, bc2): - maxDiff = 0 - times1 = tofTillM2(m, v, dM1, bc1) - times2 = tofTillM2(m, v, dM2, bc2) - for d in range(0, m): - maxDiff = max(maxDiff, abs(times2[d] - times1[d])) - return maxDiff - -def predictAirFriction(mv, thresholdVelocity, dragModel, bc): - airFrictions = [] - for v in range(1,1000): - airFrictions.append(retard(dragModel, bc, v) / pow(v, 2)) - - arr = airFrictions[thresholdVelocity:mv] - return sum(arr)/len(arr) - -def calculateAirFriction(v, dragModel, bc): - return retard(dragModel, bc, v) / pow(v, 2) - -# Each list entry needs to be in the following form: -# [ammo name, list of engagement ranges, list of muzzle velocities, drag model, ballistic coefficient] -ammoList = [["B_556x45_Ball", [300, 500, 500], [750, 870, 910], 7, 0.151], - ["ACE_556x45_Ball_Mk262", [600, 600], [810, 840], 1, 0.361], - ["ACE_556x45_Ball_Mk318", [300, 500, 500], [780, 880, 950], 1, 0.307], - ["ACE_556x45_Ball_M995_AP", [400, 500], [820, 880], 1, 0.310], - ["B_545x39_Ball_F", [400, 500], [735, 892], 7, 0.168], - ["B_580x42_Ball_F", [500, 500], [930, 970], 7, 0.156], - ["ACE_580x42_DBP88_Ball", [950, 950], [890, 900], 7, 0.21], - ["B_65x39_Caseless", [400, 800, 800], [730, 800, 830], 7, 0.263], - ["ACE_65x47_Ball_Scenar", [500, 800], [730, 830], 7, 0.290], - ["ACE_65_Creedmor_Ball", [600, 1000], [750, 860], 7, 0.317], - ["B_762x51_Ball", [500, 800], [700, 833], 7, 0.2], - ["ACE_762x51_Ball_M118LR", [600, 800], [750, 795], 7, 0.243], - ["ACE_762x51_Ball_Mk316_Mod_0", [600, 800], [780, 810], 7, 0.243], - ["ACE_762x51_Ball_Mk319_Mod_0", [600, 800], [840, 910], 1, 0.377], - ["ACE_762x51_Ball_M993_AP", [600, 800], [875, 930], 1, 0.359], - ["ACE_30_06_M1_Ball", [600, 800, 900], [700, 800, 840], 1, 0.494], - ["ACE_7_Remington_Magnum_Ball", [600, 800, 1000], [720, 812, 830], 7, 0.345], - ["ACE_243_Winchester_Ball", [700, 900, 900], [830, 900, 920], 7, 0.278], - ["ACE_762x67_Ball_Mk248_Mod_0", [800, 900, 900], [865, 900, 924], 7, 0.268], - ["ACE_762x67_Ball_Mk248_Mod_1", [800, 900, 900], [847, 867, 877], 7, 0.310], - ["ACE_762x67_Ball_Berger_Hybrid_OTM", [1100, 1200, 1300], [800, 853, 884], 7, 0.368], - ["B_762x54_Ball", [500, 800, 800], [760, 835, 865], 1, 0.4], - ["ACE_762x35_Ball", [400, 500], [620, 675], 1, 0.330], - ["ACE_762x39_Ball", [400, 600], [650, 750], 1, 0.275], - ["ACE_762x54_Ball_7T2", [500, 800, 800], [735, 809, 838], 1, 0.395], - ["ACE_303_Ball", [900, 1000], [748, 765], 1, 0.493], - ["B_93x64_Ball", [900, 1000], [850, 880], 1, 0.368], - ["B_408_Ball", [1600,1600], [862, 872], 7, 0.434], - ["ACE_408_Ball", [1200,1200], [1057, 1067], 7, 0.279], - ["ACE_106x83mm_Ball", [1500, 1500], [955, 965], 1, 0.72], - ["B_338_Ball", [1100, 1300], [880, 925], 7, 0.322], - ["B_338_NM_Ball", [1100, 1300], [790, 820], 7, 0.381], - ["ACE_338_Ball", [1200, 1300], [800, 830], 7, 0.368], - ["ACE_338_Ball_API526", [1200, 1300], [880, 920], 7, 0.29], - ["B_50BW_Ball_F", [300, 400], [510, 596], 1, 0.21], - ["B_127x99_Ball", [1300, 1300], [895, 905], 1, 0.67], - ["ACE_127x99_Ball_AMAX", [1600, 1600], [855, 865], 1, 1.05], - ["B_127x108_Ball", [1300, 1300], [815, 825], 1, 0.63], - ["ACE_762x51_Ball_Subsonic", [200, 300], [305, 340], 7, 0.235], - ["B_9x21_Ball", [200, 300], [380, 420], 1, 0.165], - ["ACE_9x18_Ball_57N181S", [100, 200, 200], [298, 330, 350], 1, 0.125], - ["ACE_9x19_Ball", [100, 200, 200], [340, 370, 400], 1, 0.165], - ["ACE_10x25_Ball", [200, 300, 300], [360, 400, 430], 1, 0.189], - ["ACE_765x17_Ball", [100, 200, 200], [282, 300, 320], 1, 0.118], - ["B_127x54_Ball", [500, 500], [295, 305], 1, 1.050], - ["B_45ACP_Ball", [100, 200, 200], [230, 250, 285], 1, 0.195]] - -print ("Calculating ...") -print ("") - -open('../extras/airFrictionAnalysis.txt', 'w').close() - -for ammo in ammoList: - name = ammo[0] - maxRanges = ammo[1] - mvs = ammo[2] - dragModel = ammo[3] - BC = ammo[4] - - mv = round(sum(mvs) / len(mvs)) - bestA = calculateAirFriction(mv, dragModel, BC) - if (mv < 360): - bestA = predictAirFriction(mv, mv - 20, dragModel, BC) - else: - bestA = predictAirFriction(mv, 340, dragModel, BC) - minDropDiff = 100 - interval = 0.0003 - - while interval > 0.0000001: - low = bestA - interval - high = bestA + interval - a = low - while a < high: - dropDiff = maxDropDiffV(maxRanges, mvs, a, dragModel, BC) - if dropDiff < minDropDiff: - minDropDiff = dropDiff - bestA = a - a = a + interval / 10 - - interval = interval / 2 - - print (str(name) + " -> " + str(round(bestA, 8))) - with open('../extras/airFrictionAnalysis.txt', 'a') as f: - print ("##########################################", file=f) - print ("Ammo Class: " + name, file=f) - print ("MaxRanges (m): " + str(maxRanges), file=f) - print ("MuzzleVelocities (m/s): " + str(mvs), file=f) - print ("Max. Velocity diff (m/s): " + str(round(maxVelocityDiffV(maxRanges, mvs, bestA, dragModel, BC), 2)), file=f) - print ("Max. Drop diff (cm): " + str(round(minDropDiff * 100, 2)), file=f) - print ("Max. Tof diff (ms): " + str(maxTOFDiffV(maxRanges, mvs, bestA, dragModel, BC)), file=f) - print ("Optimal airFriction: " + str(round(bestA, 8)), file=f) - diff --git a/tools/getTagVersion.ps1 b/tools/getTagVersion.ps1 new file mode 100644 index 00000000..790efb55 --- /dev/null +++ b/tools/getTagVersion.ps1 @@ -0,0 +1,19 @@ +cd $PSScriptRoot +cd .. + +# Set version +$tagVersion = git describe --tags --abbrev=0 +Write-Host "Build version $tagVersion" -ForegroundColor yellow + +$version = $tagVersion.Split(".") +$versionMajor = $version[0] +$versionMinor = $version[1] +$versionPatch = $version[2] +$versionBuild = 0 + +sed -e "s/DevBuild/$tagVersion/g" "mod.cpp" | Set-Content "mod.cpp" + +sed -e "s/major = 0/major = $versionMajor/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" +sed -e "s/minor = 0/minor = $versionMinor/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" +sed -e "s/patch = 0/patch = $versionPatch/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" +sed -e "s/build = 0/build = $versionBuild/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" From 75c9e25fb43aae334f3528ba29816b99e34c0873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 14:45:42 +0200 Subject: [PATCH 12/16] Updated release mroe (#266) --- .github/workflows/deploy-publish.yml | 34 +++++++++++++++ .github/workflows/deploy-release.yml | 25 ----------- .github/workflows/deploy.yml | 42 ++++++------------- tools/deploy-getRelease.ps1 | 39 +++++++++++++++++ ...etTagVersion.ps1 => deploy-setVersion.ps1} | 2 + 5 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 .github/workflows/deploy-publish.yml delete mode 100644 .github/workflows/deploy-release.yml create mode 100644 tools/deploy-getRelease.ps1 rename tools/{getTagVersion.ps1 => deploy-setVersion.ps1} (97%) diff --git a/.github/workflows/deploy-publish.yml b/.github/workflows/deploy-publish.yml new file mode 100644 index 00000000..cf9860e6 --- /dev/null +++ b/.github/workflows/deploy-publish.yml @@ -0,0 +1,34 @@ +name: Publish +run-name: Publishing ${{github.ref_name}} to ${{ inputs.environment }} + +on: + workflow_dispatch: + inputs: + environment: + description: "Selected deploy enviroment" + required: true + default: "dev" + type: choice + options: + - dev + - release +jobs: + publish: + runs-on: windows-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Setup HEMTT + uses: arma-actions/hemtt@v1 + - name: Run HEMTT release + if: ${{ inputs.environment == 'live' }} + run: | + .\tools\deploy-getRelease.ps1 + - name: Run HEMTT build + if: ${{ inputs.environment == 'dev' }} + run: | + hemtt build + Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue + Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue + env: + ENVIRONMENT: ${{ inputs.environment }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml deleted file mode 100644 index 82518ffe..00000000 --- a/.github/workflows/deploy-release.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Deploy Release -on: - release: - types: [published] - -jobs: - release: - runs-on: windows-latest - steps: - - name: Checkout the source code - uses: actions/checkout@v4 - - name: Setup HEMTT - uses: arma-actions/hemtt@v1 - - name: Run HEMTT release - run: | - .\tools\getTagVersion.ps1 - hemtt release - Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip - - name: Upload release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - asset_name: 7CavAddon-${{github.ref_name}}.zip - file: release/7CavAddon-${{github.ref_name}}.zip diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6d0a9cc0..2ff57fb5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,19 +1,10 @@ -name: Deploy -run-name: Deploying ${{ inputs.environment }} build from ${{github.ref_name}} - +name: Deploy Release on: - workflow_dispatch: - inputs: - environment: - description: "Selected deploy enviroment" - required: true - default: "dev" - type: choice - options: - - dev - - live + release: + types: [published] + jobs: - deploy: + release: runs-on: windows-latest steps: - name: Checkout the source code @@ -21,21 +12,14 @@ jobs: - name: Setup HEMTT uses: arma-actions/hemtt@v1 - name: Run HEMTT release - if: ${{ inputs.environment == 'live' }} run: | + .\tools\deploy-setVersion.ps1 hemtt release - Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue - Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue Rename-Item release\cav-latest.zip 7CavAddon-${{github.ref_name}}.zip - Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue - env: - ENVIRONMENT: ${{ inputs.environment }} - - - name: Run HEMTT build - if: ${{ inputs.environment == 'dev' }} - run: | - hemtt build - Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue - Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue - env: - ENVIRONMENT: ${{ inputs.environment }} + - name: Upload release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} + asset_name: 7CavAddon-${{github.ref_name}}.zip + file: release/7CavAddon-${{github.ref_name}}.zip diff --git a/tools/deploy-getRelease.ps1 b/tools/deploy-getRelease.ps1 new file mode 100644 index 00000000..4c797d0e --- /dev/null +++ b/tools/deploy-getRelease.ps1 @@ -0,0 +1,39 @@ +# Download latest dotnet/codeformatter release from github +# https://gist.github.com/MarkTiedemann/c0adc1701f3f5c215fc2c2d5b1d5efd3 + +$version = $args[0] + +$repo = "7Cav/7CavAddon" +$file = "7CavAddon-$version.zip" + +$releases = "https://api.github.com/repos/$repo/releases" + +Write-Host "Looking for $version..." +$releases = (Invoke-WebRequest $releases | ConvertFrom-Json) +forEach ($tagName in $releases ) { + $tagName = $tagName[0].tag_name + $tag = if ( "$version" -eq "$tagName" ) { + return "$tagName" + } else { + "false" + } +} +if ( "$tag" -eq "false") { + Write-Error "No release tag $version detected" + exit 1 +} +Write-Host "Release $tag found..." + +download = "https://github.com/$repo/releases/download/$tag/$file" +name = $file.Split(".")[0] +zip = "$name-$tag.zip" +dir = "$name-$tag" + +#Write-Host Dowloading latest release +Invoke-WebRequest $download -Out $zip +# +#Write-Host Extracting release files +Expand-Archive $zip -Force + +Get-ChildItem -Path . -ErrorAction SilentlyContinue +Get-ChildItem -Path $dir -ErrorAction SilentlyContinue diff --git a/tools/getTagVersion.ps1 b/tools/deploy-setVersion.ps1 similarity index 97% rename from tools/getTagVersion.ps1 rename to tools/deploy-setVersion.ps1 index 790efb55..17577e10 100644 --- a/tools/getTagVersion.ps1 +++ b/tools/deploy-setVersion.ps1 @@ -17,3 +17,5 @@ sed -e "s/major = 0/major = $versionMajor/g" ".hemtt/project.toml" | Set-Conten sed -e "s/minor = 0/minor = $versionMinor/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" sed -e "s/patch = 0/patch = $versionPatch/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" sed -e "s/build = 0/build = $versionBuild/g" ".hemtt/project.toml" | Set-Content ".hemtt/project.toml" + +return $tagVersion \ No newline at end of file From c3b1146d871f82e97773752b0bf03c4c078af60f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 14:53:18 +0200 Subject: [PATCH 13/16] Relase updates (#267) * Updated release mroe * Deploy fixes --- .github/workflows/deploy-publish.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-publish.yml b/.github/workflows/deploy-publish.yml index cf9860e6..bedaad1d 100644 --- a/.github/workflows/deploy-publish.yml +++ b/.github/workflows/deploy-publish.yml @@ -11,7 +11,7 @@ on: type: choice options: - dev - - release + - live jobs: publish: runs-on: windows-latest @@ -20,10 +20,18 @@ jobs: uses: actions/checkout@v4 - name: Setup HEMTT uses: arma-actions/hemtt@v1 - - name: Run HEMTT release + - name: Obtaining release if: ${{ inputs.environment == 'live' }} run: | .\tools\deploy-getRelease.ps1 + Get-ChildItem -Path . -ErrorAction SilentlyContinue + - name: Deploy release build to workshop + if: ${{ inputs.environment == 'live' }} + run: | + Write-Host "Yey i did it!" + env: + ENVIRONMENT: ${{ inputs.environment }} + - name: Run HEMTT build if: ${{ inputs.environment == 'dev' }} run: | @@ -32,3 +40,9 @@ jobs: Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue env: ENVIRONMENT: ${{ inputs.environment }} + - name: Deploy dev build to workshop + if: ${{ inputs.environment == 'dev' }} + run: | + Write-Host "Yey i did it!" + env: + ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file From b2b7da85269236a5ea26186df177ebfd8e5da230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Mon, 29 Jul 2024 15:01:43 +0200 Subject: [PATCH 14/16] Relase updates (#268) * Updated release mroe * Deploy fixes * Dont do hemtt when we doing live --- .github/workflows/deploy-publish.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-publish.yml b/.github/workflows/deploy-publish.yml index bedaad1d..2a4d9d8c 100644 --- a/.github/workflows/deploy-publish.yml +++ b/.github/workflows/deploy-publish.yml @@ -19,11 +19,13 @@ jobs: - name: Checkout the source code uses: actions/checkout@v4 - name: Setup HEMTT + if: ${{ inputs.environment == 'dev' }} uses: arma-actions/hemtt@v1 + - name: Obtaining release if: ${{ inputs.environment == 'live' }} run: | - .\tools\deploy-getRelease.ps1 + .\tools\deploy-getRelease.ps1 ${{github.ref_name}} Get-ChildItem -Path . -ErrorAction SilentlyContinue - name: Deploy release build to workshop if: ${{ inputs.environment == 'live' }} @@ -45,4 +47,5 @@ jobs: run: | Write-Host "Yey i did it!" env: - ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file + ENVIRONMENT: ${{ inputs.environment }} + \ No newline at end of file From 65d7fa18cdca22e19912903b045fd6520e70a38b Mon Sep 17 00:00:00 2001 From: Zarenx <111392464+Zarenx@users.noreply.github.com> Date: Wed, 28 Aug 2024 16:13:16 +0200 Subject: [PATCH 15/16] Updated Viking Platoon HQ patch (#269) * Updated Viking Platoon HQ patch Updated Viking Platoon HQ patch * Create Bravo_2.paa --- addons/insignia/data/Bravo_2.paa | Bin 86227 -> 162374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/addons/insignia/data/Bravo_2.paa b/addons/insignia/data/Bravo_2.paa index f0e24db35062a85e5e18fc30c288f9bb62ada127..a2e4bfe6412600dd81425d264b92ee96b681df97 100644 GIT binary patch literal 162374 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

7~5Xrbm-@7B6)Sv=tR_7 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

obn&n_WX}(OzmA{|6 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 literal 86227 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 U(jHhd^tg>-Tpb-Q;2J;w8{sX5LI3~& From 187ba093d5e00d86f40358e1caddbb4a6afadb0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Sat, 31 Aug 2024 12:23:54 +0200 Subject: [PATCH 16/16] Added workflow for deploying on steamworkshop (#271) * Added workflow for deploying on dev steam * renamed and added names --- .github/workflows/arma.yml | 10 ++++++---- .github/workflows/build.yml | 3 ++- .github/workflows/{deploy-publish.yml => publish.yml} | 10 +++++----- resources/dev-description.txt | 4 ++++ resources/dev-payload.vdf | 10 ++++++++++ 5 files changed, 27 insertions(+), 10 deletions(-) rename .github/workflows/{deploy-publish.yml => publish.yml} (81%) create mode 100644 resources/dev-description.txt create mode 100644 resources/dev-payload.vdf diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml index ffc15edf..613fb1e8 100644 --- a/.github/workflows/arma.yml +++ b/.github/workflows/arma.yml @@ -1,13 +1,13 @@ name: Testing - on: - push: - branches: - - main pull_request: + types: [opened, synchronize, ready_for_review] + push: + branches: main jobs: validate: + name: Validation runs-on: ubuntu-latest steps: - name: Checkout the source code @@ -29,6 +29,7 @@ jobs: # uses: arma-actions/bom-check@master lint: + name: Linting runs-on: ubuntu-latest steps: - name: Checkout the source code @@ -38,6 +39,7 @@ jobs: continue-on-error: true # No failure due to many false-positives hemtt: + name: HEMTT Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cdd9d67e..35ac7944 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build +name: Build and upload artifacts on: push: @@ -8,6 +8,7 @@ on: jobs: build: + name: Build runs-on: windows-latest steps: - name: Checkout the source code diff --git a/.github/workflows/deploy-publish.yml b/.github/workflows/publish.yml similarity index 81% rename from .github/workflows/deploy-publish.yml rename to .github/workflows/publish.yml index 2a4d9d8c..a6e3392c 100644 --- a/.github/workflows/deploy-publish.yml +++ b/.github/workflows/publish.yml @@ -5,7 +5,7 @@ on: workflow_dispatch: inputs: environment: - description: "Selected deploy enviroment" + description: "Selected deploy environment" required: true default: "dev" type: choice @@ -14,13 +14,15 @@ on: - live jobs: publish: + name: Publish to steam workshop runs-on: windows-latest steps: - name: Checkout the source code uses: actions/checkout@v4 - name: Setup HEMTT - if: ${{ inputs.environment == 'dev' }} uses: arma-actions/hemtt@v1 + - name: Setup steamcmd + uses: CyberAndrii/setup-steamcmd@v1 - name: Obtaining release if: ${{ inputs.environment == 'live' }} @@ -38,14 +40,12 @@ jobs: if: ${{ inputs.environment == 'dev' }} run: | hemtt build - Get-ChildItem -Path .hemttout\ -ErrorAction SilentlyContinue - Get-ChildItem -Path .release\ -ErrorAction SilentlyContinue env: ENVIRONMENT: ${{ inputs.environment }} - name: Deploy dev build to workshop if: ${{ inputs.environment == 'dev' }} run: | - Write-Host "Yey i did it!" + steamcmd.exe +login $env:STEAM_USERNAME $env:STEAM_PASSWORD +workshop_build_item resources\dev-payload.vdf +quit env: ENVIRONMENT: ${{ inputs.environment }} \ No newline at end of file diff --git a/resources/dev-description.txt b/resources/dev-description.txt new file mode 100644 index 00000000..1753f4e4 --- /dev/null +++ b/resources/dev-description.txt @@ -0,0 +1,4 @@ +[h1]7th Cavalry Gaming Community Addon Development Build[/h1] +This is the development and experimental build of the 7th Cavalry Gaming Community Addon or 7CavAddon for short. This build contain experimental features and or items and is not recomended to be used unless you know what your doing. + +To get the regular build go [url=https://steamcommunity.com/sharedfiles/filedetails/?id=3298466460]here[/url]. \ No newline at end of file diff --git a/resources/dev-payload.vdf b/resources/dev-payload.vdf new file mode 100644 index 00000000..772bbe23 --- /dev/null +++ b/resources/dev-payload.vdf @@ -0,0 +1,10 @@ +"workshopitem" +{ + "appid" "107410" + "publishedfileid" "3298481411" + "contentfolder" "D:\\a\\7CavAddon\\7CavAddon\\.hemttout\\build" + "previewfile" "D:\\a\\7CavAddon\\7CavAddon\\resources\\steam_preview-dev.jpg" + "title" "7CavAddon DevBuild [7CAV]" + "description" "" + "changenote" "" +} \ No newline at end of file