From a43d65fe06ed3ca269bceaf8eacb6eb35c1974dd Mon Sep 17 00:00:00 2001 From: penev92 Date: Mon, 19 Jul 2021 03:43:48 +0300 Subject: [PATCH 1/3] Updated ModSDK scripts from various old versions to release-20200503 Updated `launch-dedicated.cmd` and `launch-dedicated.sh` based on: - ModSDK PR 145 - "Update engine for playtest-2020030" ("Add missing launch arguments to launch-dedicated scripts."). - ModSDK PR 155 - "Update for playtest-20200418". Updated `mod.config` based on ModSDK PR 150 - "Update to playtest-20200329". Updated `buildpackage.nsi` based on ModSDK PR 155 - "Update for playtest-20200418". Removed spurious *.dll.config files from `packaging/linux/include` based on ModSDK PR 117 - "Update scripts to work with the new engine toolchain.". --- launch-dedicated.cmd | 14 ++++++++++--- launch-dedicated.sh | 22 ++++++++++++++++++-- mod.config | 2 +- packaging/linux/include/Eluant.dll.config | 3 --- packaging/linux/include/OpenAL-CS.dll.config | 4 ---- packaging/linux/include/SDL2-CS.dll.config | 4 ---- packaging/windows/buildpackage.nsi | 8 +++---- 7 files changed, 36 insertions(+), 21 deletions(-) delete mode 100644 packaging/linux/include/Eluant.dll.config delete mode 100644 packaging/linux/include/OpenAL-CS.dll.config delete mode 100644 packaging/linux/include/SDL2-CS.dll.config diff --git a/launch-dedicated.cmd b/launch-dedicated.cmd index cb3d7a8f4..694d1b410 100644 --- a/launch-dedicated.cmd +++ b/launch-dedicated.cmd @@ -5,9 +5,17 @@ set Name="Dedicated Server" set ListenPort=1234 set AdvertiseOnline=True -set EnableSingleplayer=False set Password="" +set RequireAuthentication=False +set ProfileIDBlacklist="" +set ProfileIDWhitelist="" + +set EnableSingleplayer=False +set EnableSyncReports=False +set EnableGeoIP=True +set ShareAnonymizedIPs=True + @echo off setlocal EnableDelayedExpansion @@ -25,7 +33,7 @@ if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine cd %ENGINE_DIRECTORY% :loop -OpenRA.Server.exe Game.Mod=%MOD_ID% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% +OpenRA.Server.exe Game.Mod=%MOD_ID% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Engine.SupportDir=%SupportDir% goto loop :noengine @@ -39,4 +47,4 @@ echo Required mod.config variables are missing. echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are echo defined in your mod.config (or user.config) and try again. pause -exit /b \ No newline at end of file +exit /b diff --git a/launch-dedicated.sh b/launch-dedicated.sh index 215869603..5eff0088e 100755 --- a/launch-dedicated.sh +++ b/launch-dedicated.sh @@ -38,9 +38,19 @@ NAME="${Name:-"Dedicated Server"}" LAUNCH_MOD="${Mod:-"${MOD_ID}"}" LISTEN_PORT="${ListenPort:-"1234"}" ADVERTISE_ONLINE="${AdvertiseOnline:-"True"}" -ENABLE_SINGLE_PLAYER="${EnableSingleplayer:-"False"}" PASSWORD="${Password:-""}" +REQUIRE_AUTHENTICATION="${RequireAuthentication:-"False"}" +PROFILE_ID_BLACKLIST="${ProfileIDBlacklist:-""}" +PROFILE_ID_WHITELIST="${ProfileIDWhitelist:-""}" + +ENABLE_SINGLE_PLAYER="${EnableSingleplayer:-"False"}" +ENABLE_SYNC_REPORTS="${EnableSyncReports:-"False"}" +ENABLE_GEOIP="${EnableGeoIP:-"True"}" +SHARE_ANONYMISED_IPS="${ShareAnonymizedIPs:-"True"}" + +SUPPORT_DIR="${SupportDir:-""}" + cd "${TEMPLATE_ROOT}" if [ ! -f "${ENGINE_DIRECTORY}/OpenRA.Game.exe" ] || [ "$(cat "${ENGINE_DIRECTORY}/VERSION")" != "${ENGINE_VERSION}" ]; then echo "Required engine files not found." @@ -54,5 +64,13 @@ while true; do MOD_SEARCH_PATHS="${MOD_SEARCH_PATHS}" mono --debug OpenRA.Server.exe Game.Mod="${LAUNCH_MOD}" \ Server.Name="${NAME}" Server.ListenPort="${LISTEN_PORT}" \ Server.AdvertiseOnline="${ADVERTISE_ONLINE}" \ - Server.EnableSingleplayer="${ENABLE_SINGLE_PLAYER}" Server.Password="${PASSWORD}" + Server.Password="${PASSWORD}" \ + Server.RequireAuthentication="${REQUIRE_AUTHENTICATION}" \ + Server.ProfileIDBlacklist="${PROFILE_ID_BLACKLIST}" \ + Server.ProfileIDWhitelist="${PROFILE_ID_WHITELIST}" \ + Server.EnableSingleplayer="${ENABLE_SINGLE_PLAYER}" \ + Server.EnableSyncReports="${ENABLE_SYNC_REPORTS}" \ + Server.EnableGeoIP="${ENABLE_GEOIP}" \ + Server.ShareAnonymizedIPs="${SHARE_ANONYMISED_IPS}" \ + Engine.SupportDir="${SUPPORT_DIR}" done diff --git a/mod.config b/mod.config index 5f5d546da..ff53fddac 100644 --- a/mod.config +++ b/mod.config @@ -30,7 +30,7 @@ PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" PACKAGING_AUTHORS="The Red Alert 2 Mod authors" -PACKAGING_OSX_LAUNCHER_TAG="osx-launcher-20200209" +PACKAGING_OSX_LAUNCHER_TAG="osx-launcher-20200316" # The macOS disk image icon positions, matched to the background artwork PACKAGING_OSX_DMG_MOD_ICON_POSITION="190, 210" diff --git a/packaging/linux/include/Eluant.dll.config b/packaging/linux/include/Eluant.dll.config deleted file mode 100644 index 561d8e90d..000000000 --- a/packaging/linux/include/Eluant.dll.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packaging/linux/include/OpenAL-CS.dll.config b/packaging/linux/include/OpenAL-CS.dll.config deleted file mode 100644 index 43cedc79c..000000000 --- a/packaging/linux/include/OpenAL-CS.dll.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packaging/linux/include/SDL2-CS.dll.config b/packaging/linux/include/SDL2-CS.dll.config deleted file mode 100644 index a2aa92848..000000000 --- a/packaging/linux/include/SDL2-CS.dll.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packaging/windows/buildpackage.nsi b/packaging/windows/buildpackage.nsi index 1b8176785..e8dd8b161 100644 --- a/packaging/windows/buildpackage.nsi +++ b/packaging/windows/buildpackage.nsi @@ -1,4 +1,4 @@ -; Copyright 2007-2020 OpenRA developers (see AUTHORS) +; Copyright 2007-2021 OpenRA developers (see AUTHORS) ; This file is part of OpenRA. ; ; OpenRA is free software: you can redistribute it and/or modify @@ -14,6 +14,7 @@ ; You should have received a copy of the GNU General Public License ; along with OpenRA. If not, see . + !include "MUI2.nsh" !include "FileFunc.nsh" !include "WordFunc.nsh" @@ -85,7 +86,7 @@ Section "Game" GAME File "${SRCDIR}\SDL2-CS.dll" File "${SRCDIR}\OpenAL-CS.dll" File "${SRCDIR}\global mix database.dat" - File "${SRCDIR}\MaxMind.Db.dll" + File "${SRCDIR}\IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP" File "${SRCDIR}\eluant.dll" File "${SRCDIR}\rix0rrr.BeaconLib.dll" File "${DEPSDIR}\soft_oal.dll" @@ -179,8 +180,7 @@ Function ${UN}Clean Delete $INSTDIR\COPYING Delete $INSTDIR\${MOD_ID}.ico Delete "$INSTDIR\global mix database.dat" - Delete $INSTDIR\MaxMind.Db.dll - Delete $INSTDIR\KopiLua.dll + Delete $INSTDIR\IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP Delete $INSTDIR\soft_oal.dll Delete $INSTDIR\SDL2.dll Delete $INSTDIR\lua51.dll From c2d4228f91a186eaa50bd4e0ccdc2ff12e53f34a Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 20 Jul 2021 12:11:17 +0100 Subject: [PATCH 2/3] Fix line endings and byte order marks. --- OpenRA.Mods.RA2.sln | 2 +- .../Activities/EnterCarrierParent.cs | 2 +- .../Graphics/ElectricBoltRenderable.cs | 2 +- OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs | 2 +- OpenRA.Mods.RA2/Graphics/TintedCell.cs | 2 +- OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj | 90 +- OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs | 2 +- OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs | 2 +- OpenRA.Mods.RA2/Projectiles/RadBeam.cs | 4 +- OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs | 2 +- OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs | 2 +- OpenRA.Mods.RA2/Traits/CarrierChild.cs | 2 +- OpenRA.Mods.RA2/Traits/CarrierParent.cs | 2 +- .../Traits/ChronoResourceDelivery.cs | 2 +- .../Traits/DamagedByTintedCells.cs | 2 +- OpenRA.Mods.RA2/Traits/PeriodicExplosion.cs | 22 +- .../Traits/Render/WithExitOverlay.cs | 8 +- .../Render/WithTurretDeployAnimation.cs | 2 +- .../Traits/Render/WithVoxelHelicopterBody.cs | 4 +- OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs | 4 +- .../Traits/WeatherControlSupportPower.cs | 22 +- .../Traits/World/TintedCellsLayer.cs | 2 +- .../Warheads/CreateTintedCellsWarhead.cs | 2 +- launch-dedicated.cmd | 100 +-- launch-game.cmd | 90 +- make.cmd | 2 +- make.ps1 | 824 +++++++++--------- utility.cmd | 92 +- 28 files changed, 647 insertions(+), 647 deletions(-) diff --git a/OpenRA.Mods.RA2.sln b/OpenRA.Mods.RA2.sln index 347a8c4a5..81bcf47ff 100644 --- a/OpenRA.Mods.RA2.sln +++ b/OpenRA.Mods.RA2.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29613.14 diff --git a/OpenRA.Mods.RA2/Activities/EnterCarrierParent.cs b/OpenRA.Mods.RA2/Activities/EnterCarrierParent.cs index 04b4905a5..4f4106aec 100644 --- a/OpenRA.Mods.RA2/Activities/EnterCarrierParent.cs +++ b/OpenRA.Mods.RA2/Activities/EnterCarrierParent.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Graphics/ElectricBoltRenderable.cs b/OpenRA.Mods.RA2/Graphics/ElectricBoltRenderable.cs index 4623f711e..071d683c0 100644 --- a/OpenRA.Mods.RA2/Graphics/ElectricBoltRenderable.cs +++ b/OpenRA.Mods.RA2/Graphics/ElectricBoltRenderable.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs b/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs index aff4c1683..0141df3d1 100644 --- a/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs +++ b/OpenRA.Mods.RA2/Graphics/RadBeamRenderable.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Graphics/TintedCell.cs b/OpenRA.Mods.RA2/Graphics/TintedCell.cs index 1ecec0ea8..cdfedf25b 100644 --- a/OpenRA.Mods.RA2/Graphics/TintedCell.cs +++ b/OpenRA.Mods.RA2/Graphics/TintedCell.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj b/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj index 947023208..d6dafee7a 100644 --- a/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj +++ b/OpenRA.Mods.RA2/OpenRA.Mods.RA2.csproj @@ -1,45 +1,45 @@ - - - - net461 - true - 5 - true - ../mods/ra2 - false - AnyCPU - false - ..\engine\OpenRA.ruleset - - - - - - - - - DEBUG;TRACE - false - - - - - ../engine/thirdparty/download/Eluant.dll - False - - - - - - - - - - - - - - - - - + + + + net461 + true + 5 + true + ../mods/ra2 + false + AnyCPU + false + ..\engine\OpenRA.ruleset + + + + + + + + + DEBUG;TRACE + false + + + + + ../engine/thirdparty/download/Eluant.dll + False + + + + + + + + + + + + + + + + + diff --git a/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs b/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs index f7a4f1fd0..62a9f2df6 100644 --- a/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs +++ b/OpenRA.Mods.RA2/Projectiles/ArcLaserZap.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs b/OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs index 8b31522ca..edbaf90aa 100644 --- a/OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs +++ b/OpenRA.Mods.RA2/Projectiles/ElectricBolt.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Projectiles/RadBeam.cs b/OpenRA.Mods.RA2/Projectiles/RadBeam.cs index 605ba2e6d..5c7242b2c 100644 --- a/OpenRA.Mods.RA2/Projectiles/RadBeam.cs +++ b/OpenRA.Mods.RA2/Projectiles/RadBeam.cs @@ -94,8 +94,8 @@ public void Tick(World world) if (hitanim != null) hitanim.PlayThen(info.HitAnimSequence, () => animationComplete = true); else - animationComplete = true; - + animationComplete = true; + args.Weapon.Impact(Target.FromPos(target), new WarheadArgs(args)); doneDamage = true; } diff --git a/OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs b/OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs index b9c3498ea..10683eadb 100644 --- a/OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs +++ b/OpenRA.Mods.RA2/Traits/BaseSpawnerChild.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs b/OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs index 2539d209e..d07da7ada 100644 --- a/OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs +++ b/OpenRA.Mods.RA2/Traits/BaseSpawnerParent.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/CarrierChild.cs b/OpenRA.Mods.RA2/Traits/CarrierChild.cs index accde5325..d9cd50290 100644 --- a/OpenRA.Mods.RA2/Traits/CarrierChild.cs +++ b/OpenRA.Mods.RA2/Traits/CarrierChild.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/CarrierParent.cs b/OpenRA.Mods.RA2/Traits/CarrierParent.cs index c8badd203..9f0efdb1e 100644 --- a/OpenRA.Mods.RA2/Traits/CarrierParent.cs +++ b/OpenRA.Mods.RA2/Traits/CarrierParent.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs index a17dec0fb..f489243c6 100644 --- a/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs +++ b/OpenRA.Mods.RA2/Traits/ChronoResourceDelivery.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/DamagedByTintedCells.cs b/OpenRA.Mods.RA2/Traits/DamagedByTintedCells.cs index 4765e7d89..243aeb786 100644 --- a/OpenRA.Mods.RA2/Traits/DamagedByTintedCells.cs +++ b/OpenRA.Mods.RA2/Traits/DamagedByTintedCells.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/PeriodicExplosion.cs b/OpenRA.Mods.RA2/Traits/PeriodicExplosion.cs index c6ee572db..d01f2a308 100644 --- a/OpenRA.Mods.RA2/Traits/PeriodicExplosion.cs +++ b/OpenRA.Mods.RA2/Traits/PeriodicExplosion.cs @@ -103,17 +103,17 @@ void ITick.Tick(Actor self) var localoffset = body != null ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))) : info.LocalOffset; - - var args = new WarheadArgs - { - Weapon = weapon, - DamageModifiers = self.TraitsImplementing().Select(a => a.GetFirepowerModifier()).ToArray(), - Source = self.CenterPosition, - SourceActor = self, - WeaponTarget = Target.FromPos(self.CenterPosition + localoffset) - }; - - weapon.Impact(args.WeaponTarget, args); + + var args = new WarheadArgs + { + Weapon = weapon, + DamageModifiers = self.TraitsImplementing().Select(a => a.GetFirepowerModifier()).ToArray(), + Source = self.CenterPosition, + SourceActor = self, + WeaponTarget = Target.FromPos(self.CenterPosition + localoffset) + }; + + weapon.Impact(args.WeaponTarget, args); if (weapon.Report != null && weapon.Report.Any()) Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); diff --git a/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs b/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs index 58cd6a7c7..496fad0b0 100644 --- a/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs +++ b/OpenRA.Mods.RA2/Traits/Render/WithExitOverlay.cs @@ -79,9 +79,9 @@ void ITick.Tick(Actor self) enable = self.World.ActorMap.GetActorsAt(exit).Any(a => a != self); } - protected override void TraitDisabled(Actor self) - { - enable = false; - } + protected override void TraitDisabled(Actor self) + { + enable = false; + } } } diff --git a/OpenRA.Mods.RA2/Traits/Render/WithTurretDeployAnimation.cs b/OpenRA.Mods.RA2/Traits/Render/WithTurretDeployAnimation.cs index d8867acc2..a41961cbd 100644 --- a/OpenRA.Mods.RA2/Traits/Render/WithTurretDeployAnimation.cs +++ b/OpenRA.Mods.RA2/Traits/Render/WithTurretDeployAnimation.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2019 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs b/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs index 0263dd6cb..14fb1c4ee 100644 --- a/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs +++ b/OpenRA.Mods.RA2/Traits/Render/WithVoxelHelicopterBody.cs @@ -6,9 +6,9 @@ * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. - */ + */ #endregion - + using System; using System.Collections.Generic; using OpenRA.Graphics; diff --git a/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs b/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs index eba188a19..58804adf1 100644 --- a/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs +++ b/OpenRA.Mods.RA2/Traits/SpawnSurvivors.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made @@ -65,7 +65,7 @@ void Spawn(Actor self) var unit = w.CreateActor(true, actorType.ToLowerInvariant(), td); var mobile = unit.TraitOrDefault(); - if (mobile != null) + if (mobile != null) mobile.Nudge(unit); } }); diff --git a/OpenRA.Mods.RA2/Traits/WeatherControlSupportPower.cs b/OpenRA.Mods.RA2/Traits/WeatherControlSupportPower.cs index 91d25316a..4ef61bc8b 100644 --- a/OpenRA.Mods.RA2/Traits/WeatherControlSupportPower.cs +++ b/OpenRA.Mods.RA2/Traits/WeatherControlSupportPower.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made @@ -121,11 +121,11 @@ void ITick.Tick(Actor self) if (--hitDelay < 0) { - hitDelay = info.HitDelay; - - var warheadArgs = new WarheadArgs() - { - SourceActor = self + hitDelay = info.HitDelay; + + var warheadArgs = new WarheadArgs() + { + SourceActor = self }; info.WeaponInfo.Impact(Target.FromPos(targetPos), warheadArgs); @@ -139,11 +139,11 @@ void ITick.Tick(Actor self) { var offset = RandomOffset(self.World); var newPos = targetPos + offset; - var scatterTarget = Target.FromPos(newPos); - - var warheadArgs = new WarheadArgs() - { - SourceActor = self + var scatterTarget = Target.FromPos(newPos); + + var warheadArgs = new WarheadArgs() + { + SourceActor = self }; info.WeaponInfo.Impact(scatterTarget, warheadArgs); diff --git a/OpenRA.Mods.RA2/Traits/World/TintedCellsLayer.cs b/OpenRA.Mods.RA2/Traits/World/TintedCellsLayer.cs index 7da8cb71f..41763063a 100644 --- a/OpenRA.Mods.RA2/Traits/World/TintedCellsLayer.cs +++ b/OpenRA.Mods.RA2/Traits/World/TintedCellsLayer.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/OpenRA.Mods.RA2/Warheads/CreateTintedCellsWarhead.cs b/OpenRA.Mods.RA2/Warheads/CreateTintedCellsWarhead.cs index 1e406ffb4..e719a3a8b 100644 --- a/OpenRA.Mods.RA2/Warheads/CreateTintedCellsWarhead.cs +++ b/OpenRA.Mods.RA2/Warheads/CreateTintedCellsWarhead.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made diff --git a/launch-dedicated.cmd b/launch-dedicated.cmd index 694d1b410..b6d2aee8d 100644 --- a/launch-dedicated.cmd +++ b/launch-dedicated.cmd @@ -1,50 +1,50 @@ -:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated for details - -@echo on - -set Name="Dedicated Server" -set ListenPort=1234 -set AdvertiseOnline=True -set Password="" - -set RequireAuthentication=False -set ProfileIDBlacklist="" -set ProfileIDWhitelist="" - -set EnableSingleplayer=False -set EnableSyncReports=False -set EnableGeoIP=True -set ShareAnonymizedIPs=True - -@echo off -setlocal EnableDelayedExpansion - -title %Name% -FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) -if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) -set MOD_SEARCH_PATHS=%~dp0mods,./mods - -if "!MOD_ID!" == "" goto badconfig -if "!ENGINE_VERSION!" == "" goto badconfig -if "!ENGINE_DIRECTORY!" == "" goto badconfig - -if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine ->nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine -cd %ENGINE_DIRECTORY% - -:loop -OpenRA.Server.exe Game.Mod=%MOD_ID% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Engine.SupportDir=%SupportDir% -goto loop - -:noengine -echo Required engine files not found. -echo Run `make all` in the mod directory to fetch and build the required files, then try again. -pause -exit /b - -:badconfig -echo Required mod.config variables are missing. -echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are -echo defined in your mod.config (or user.config) and try again. -pause -exit /b +:: example launch script, see https://github.com/OpenRA/OpenRA/wiki/Dedicated for details + +@echo on + +set Name="Dedicated Server" +set ListenPort=1234 +set AdvertiseOnline=True +set Password="" + +set RequireAuthentication=False +set ProfileIDBlacklist="" +set ProfileIDWhitelist="" + +set EnableSingleplayer=False +set EnableSyncReports=False +set EnableGeoIP=True +set ShareAnonymizedIPs=True + +@echo off +setlocal EnableDelayedExpansion + +title %Name% +FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) +if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) +set MOD_SEARCH_PATHS=%~dp0mods,./mods + +if "!MOD_ID!" == "" goto badconfig +if "!ENGINE_VERSION!" == "" goto badconfig +if "!ENGINE_DIRECTORY!" == "" goto badconfig + +if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine +>nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine +cd %ENGINE_DIRECTORY% + +:loop +OpenRA.Server.exe Game.Mod=%MOD_ID% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% Server.EnableGeoIP=%EnableGeoIP% Server.ShareAnonymizedIPs=%ShareAnonymizedIPs% Engine.SupportDir=%SupportDir% +goto loop + +:noengine +echo Required engine files not found. +echo Run `make all` in the mod directory to fetch and build the required files, then try again. +pause +exit /b + +:badconfig +echo Required mod.config variables are missing. +echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are +echo defined in your mod.config (or user.config) and try again. +pause +exit /b diff --git a/launch-game.cmd b/launch-game.cmd index 41013364c..2c98fda32 100644 --- a/launch-game.cmd +++ b/launch-game.cmd @@ -1,45 +1,45 @@ -@echo off -setlocal EnableDelayedExpansion -title OpenRA - -FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) -if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) -set TEMPLATE_LAUNCHER=%0 -set MOD_SEARCH_PATHS=%~dp0mods,./mods - -if "!MOD_ID!" == "" goto badconfig -if "!ENGINE_VERSION!" == "" goto badconfig -if "!ENGINE_DIRECTORY!" == "" goto badconfig - -set TEMPLATE_DIR=%CD% -if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine ->nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine -cd %ENGINE_DIRECTORY% - -OpenRA.Game.exe Game.Mod=%MOD_ID% Engine.LaunchPath="%TEMPLATE_LAUNCHER%" "Engine.ModSearchPaths=%MOD_SEARCH_PATHS%" "%*" -set ERROR=%errorlevel% -cd %TEMPLATE_DIR% - -if %ERROR% neq 0 goto crashdialog -exit /b - -:noengine -echo Required engine files not found. -echo Run `make all` in the mod directory to fetch and build the required files, then try again. -pause -exit /b - -:badconfig -echo Required mod.config variables are missing. -echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are -echo defined in your mod.config (or user.config) and try again. -pause -exit /b - -:crashdialog -echo ---------------------------------------- -echo OpenRA has encountered a fatal error. -echo * Log Files are available in Documents\OpenRA\Logs -echo * FAQ is available at https://github.com/OpenRA/OpenRA/wiki/FAQ -echo ---------------------------------------- -pause +@echo off +setlocal EnableDelayedExpansion +title OpenRA + +FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) +if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) +set TEMPLATE_LAUNCHER=%0 +set MOD_SEARCH_PATHS=%~dp0mods,./mods + +if "!MOD_ID!" == "" goto badconfig +if "!ENGINE_VERSION!" == "" goto badconfig +if "!ENGINE_DIRECTORY!" == "" goto badconfig + +set TEMPLATE_DIR=%CD% +if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine +>nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine +cd %ENGINE_DIRECTORY% + +OpenRA.Game.exe Game.Mod=%MOD_ID% Engine.LaunchPath="%TEMPLATE_LAUNCHER%" "Engine.ModSearchPaths=%MOD_SEARCH_PATHS%" "%*" +set ERROR=%errorlevel% +cd %TEMPLATE_DIR% + +if %ERROR% neq 0 goto crashdialog +exit /b + +:noengine +echo Required engine files not found. +echo Run `make all` in the mod directory to fetch and build the required files, then try again. +pause +exit /b + +:badconfig +echo Required mod.config variables are missing. +echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are +echo defined in your mod.config (or user.config) and try again. +pause +exit /b + +:crashdialog +echo ---------------------------------------- +echo OpenRA has encountered a fatal error. +echo * Log Files are available in Documents\OpenRA\Logs +echo * FAQ is available at https://github.com/OpenRA/OpenRA/wiki/FAQ +echo ---------------------------------------- +pause diff --git a/make.cmd b/make.cmd index c88f86626..92b05b706 100644 --- a/make.cmd +++ b/make.cmd @@ -1 +1 @@ -@powershell -NoProfile -ExecutionPolicy Bypass -File make.ps1 %* +@powershell -NoProfile -ExecutionPolicy Bypass -File make.ps1 %* diff --git a/make.ps1 b/make.ps1 index 543335898..ca92ab3c3 100644 --- a/make.ps1 +++ b/make.ps1 @@ -1,412 +1,412 @@ -####### The starting point for the script is the bottom ####### - -############################################################### -########################## FUNCTIONS ########################## -############################################################### -function All-Command -{ - If (!(Test-Path "*.sln")) - { - return - } - - if ((CheckForDotnet) -eq 1) - { - return - } - - dotnet build /p:Configuration=Release /nologo - if ($lastexitcode -ne 0) - { - Write-Host "Build failed. If just the development tools failed to build, try installing Visual Studio. You may also still be able to run the game." -ForegroundColor Red - } - else - { - Write-Host "Build succeeded." -ForegroundColor Green - } -} - -function Clean-Command -{ - If (!(Test-Path "*.sln")) - { - return - } - - if ((CheckForDotnet) -eq 1) - { - return - } - - dotnet clean /nologo - rm *.dll - rm mods/*/*.dll - rm *.dll.config - rm *.pdb - rm mods/*/*.pdb - rm *.exe - rm ./*/bin -r - rm ./*/obj -r - - rm $env:ENGINE_DIRECTORY/*.dll - rm $env:ENGINE_DIRECTORY/mods/*/*.dll - rm env:ENGINE_DIRECTORY/*.config - rm env:ENGINE_DIRECTORY/*.pdb - rm mods/*/*.pdb - rm env:ENGINE_DIRECTORY/*.exe - rm env:ENGINE_DIRECTORY/*/bin -r - rm env:ENGINE_DIRECTORY/*/obj -r - if (Test-Path env:ENGINE_DIRECTORY/thirdparty/download/) - { - rmdir env:ENGINE_DIRECTORY/thirdparty/download -Recurse -Force - } - - Write-Host "Clean complete." -ForegroundColor Green -} - -function Version-Command -{ - if ($command.Length -gt 1) - { - $version = $command[1] - } - elseif (Get-Command 'git' -ErrorAction SilentlyContinue) - { - $gitRepo = git rev-parse --is-inside-work-tree - if ($gitRepo) - { - $version = git name-rev --name-only --tags --no-undefined HEAD 2>$null - if ($version -eq $null) - { - $version = "git-" + (git rev-parse --short HEAD) - } - } - else - { - Write-Host "Not a git repository. The version will remain unchanged." -ForegroundColor Red - } - } - else - { - Write-Host "Unable to locate Git. The version will remain unchanged." -ForegroundColor Red - } - - if ($version -ne $null) - { - $mod = "mods/" + $modID + "/mod.yaml" - $replacement = (gc $mod) -Replace "Version:.*", ("Version: {0}" -f $version) - sc $mod $replacement - - $prefix = $(gc $mod) | Where { $_.ToString().EndsWith(": User") } - if ($prefix -and $prefix.LastIndexOf("/") -ne -1) - { - $prefix = $prefix.Substring(0, $prefix.LastIndexOf("/")) - } - $replacement = (gc $mod) -Replace ".*: User", ("{0}/{1}: User" -f $prefix, $version) - sc $mod $replacement - - Write-Host ("Version strings set to '{0}'." -f $version) - } -} - -function Test-Command -{ - if ((CheckForUtility) -eq 1) - { - return - } - - Write-Host "Testing $modID mod MiniYAML..." -ForegroundColor Cyan - Invoke-Expression "$utilityPath $modID --check-yaml" -} - -function Check-Command -{ - If (!(Test-Path "*.sln")) - { - Write-Host "No custom solution file found. Skipping static code checks." -ForegroundColor Cyan - return - } - - Write-Host "Compiling in debug configuration..." -ForegroundColor Cyan - dotnet build /p:Configuration=Debug /nologo - if ($lastexitcode -ne 0) - { - Write-Host "Build failed." -ForegroundColor Red - } - - if ((CheckForUtility) -eq 0) - { - Write-Host "Checking for explicit interface violations..." -ForegroundColor Cyan - Invoke-Expression "$utilityPath $modID --check-explicit-interfaces" - - Write-Host "Checking for incorrect conditional trait interface overrides..." -ForegroundColor Cyan - Invoke-Expression "$utilityPath $modID --check-conditional-trait-interface-overrides" - } -} - -function Check-Scripts-Command -{ - if ((Get-Command "luac.exe" -ErrorAction SilentlyContinue) -ne $null) - { - Write-Host "Testing Lua scripts..." -ForegroundColor Cyan - foreach ($script in ls "mods/*/maps/*/*.lua") - { - luac -p $script - } - Write-Host "Check completed!" -ForegroundColor Green - } - else - { - Write-Host "luac.exe could not be found. Please install Lua." -ForegroundColor Red - } -} - -function Docs-Command -{ - if ((CheckForUtility) -eq 1) - { - return - } - - ./make.ps1 version - Invoke-Expression "$utilityPath $modID --docs | Out-File -Encoding 'UTF8' DOCUMENTATION.md" - Invoke-Expression "$utilityPath $modID --weapon-docs | Out-File -Encoding "UTF8" WEAPONS.md" - Invoke-Expression "$utilityPath $modID --lua-docs | Out-File -Encoding 'UTF8' Lua-API.md" - Write-Host "Docs generated." -ForegroundColor Green -} - -function CheckForUtility -{ - if (Test-Path $utilityPath) - { - return 0 - } - - Write-Host "OpenRA.Utility.exe could not be found. Build the project first using the `"all`" command." -ForegroundColor Red - return 1 -} - -function CheckForDotnet -{ - if ((Get-Command "dotnet" -ErrorAction SilentlyContinue) -eq $null) - { - Write-Host "The 'dotnet' tool is required to compile OpenRA. Please install the .NET Core SDK or Visual Studio and try again. https://dotnet.microsoft.com/download" -ForegroundColor Red - return 1 - } - - return 0 -} - -function WaitForInput -{ - echo "Press enter to continue." - while ($true) - { - if ([System.Console]::KeyAvailable) - { - exit - } - Start-Sleep -Milliseconds 50 - } -} - -function ReadConfigLine($line, $name) -{ - $prefix = $name + '=' - if ($line.StartsWith($prefix)) - { - [Environment]::SetEnvironmentVariable($name, $line.Replace($prefix, '').Replace('"', '')) - } -} - -function ParseConfigFile($fileName) -{ - $names = @("MOD_ID", "ENGINE_VERSION", "AUTOMATIC_ENGINE_MANAGEMENT", "AUTOMATIC_ENGINE_SOURCE", - "AUTOMATIC_ENGINE_EXTRACT_DIRECTORY", "AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME", "ENGINE_DIRECTORY") - - $reader = [System.IO.File]::OpenText($fileName) - while($null -ne ($line = $reader.ReadLine())) - { - foreach ($name in $names) - { - ReadConfigLine $line $name - } - } - $reader.Close() - - $missing = @() - foreach ($name in $names) - { - if (!([System.Environment]::GetEnvironmentVariable($name))) - { - $missing += $name - } - } - - if ($missing) - { - echo "Required mod.config variables are missing:" - foreach ($m in $missing) - { - echo " $m" - } - echo "Repair your mod.config (or user.config) and try again." - WaitForInput - exit - } -} - -############################################################### -############################ Main ############################# -############################################################### -if ($PSVersionTable.PSVersion.Major -clt 3) -{ - echo "The makefile requires PowerShell version 3 or higher." - echo "Please download and install the latest Windows Management Framework version from Microsoft." - WaitForInput -} - -if ($args.Length -eq 0) -{ - echo "Command list:" - echo "" - echo " all Builds the game, its development tools and the mod dlls." - echo " version Sets the version strings for all mods to the latest" - echo " version for the current Git branch." - echo " clean Removes all built and copied files." - echo " from the mods and the engine directories." - echo " test Tests the mod's MiniYAML for errors." - echo " check Checks .cs files for StyleCop violations." - echo " check-scripts Checks .lua files for syntax errors." - echo " docs Generates the trait and Lua API documentation." - echo "" - $command = (Read-Host "Enter command").Split(' ', 2) -} -else -{ - $command = $args -} - -# Set the working directory for our IO methods -$templateDir = $pwd.Path -[System.IO.Directory]::SetCurrentDirectory($templateDir) - -# Load the environment variables from the config file -# and get the mod ID from the local environment variable -ParseConfigFile "mod.config" - -if (Test-Path "user.config") -{ - ParseConfigFile "user.config" -} - -$modID = $env:MOD_ID - -$env:MOD_SEARCH_PATHS = (Get-Item -Path ".\" -Verbose).FullName + "\mods,./mods" - -# Run the same command on the engine's make file -if ($command -eq "all" -or $command -eq "clean") -{ - $versionFile = $env:ENGINE_DIRECTORY + "/VERSION" - $currentEngine = "" - if (Test-Path $versionFile) - { - $reader = [System.IO.File]::OpenText($versionFile) - $currentEngine = $reader.ReadLine() - $reader.Close() - } - - if ($currentEngine -ne "" -and $currentEngine -eq $env:ENGINE_VERSION) - { - cd $env:ENGINE_DIRECTORY - Invoke-Expression ".\make.cmd $command" - echo "" - cd $templateDir - } - elseif ($env:AUTOMATIC_ENGINE_MANAGEMENT -ne "True") - { - echo "Automatic engine management is disabled." - echo "Please manually update the engine to version $env:ENGINE_VERSION." - WaitForInput - } - else - { - echo "OpenRA engine version $env:ENGINE_VERSION is required." - - if (Test-Path $env:ENGINE_DIRECTORY) - { - if ($currentEngine -ne "") - { - echo "Deleting engine version $currentEngine." - } - else - { - echo "Deleting existing engine (unknown version)." - } - - rm $env:ENGINE_DIRECTORY -r - } - - echo "Downloading engine..." - - if (Test-Path $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) - { - rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r - } - - $url = $env:AUTOMATIC_ENGINE_SOURCE - $url = $url.Replace("$", "").Replace("{ENGINE_VERSION}", $env:ENGINE_VERSION) - - mkdir $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY > $null - $dlPath = Join-Path $pwd (Split-Path -leaf $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) - $dlPath = Join-Path $dlPath (Split-Path -leaf $env:AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME) - - $client = new-object System.Net.WebClient - [Net.ServicePointManager]::SecurityProtocol = 'Tls12' - $client.DownloadFile($url, $dlPath) - - Add-Type -assembly "system.io.compression.filesystem" - [io.compression.zipfile]::ExtractToDirectory($dlPath, $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) - rm $dlPath - - $extractedDir = Get-ChildItem $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -Recurse | ?{ $_.PSIsContainer } | Select-Object -First 1 - Move-Item $extractedDir.FullName -Destination $templateDir - Rename-Item $extractedDir.Name (Split-Path -leaf $env:ENGINE_DIRECTORY) - - rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r - - cd $env:ENGINE_DIRECTORY - Invoke-Expression ".\make.cmd version $env:ENGINE_VERSION" - Invoke-Expression ".\make.cmd $command" - echo "" - cd $templateDir - } -} - -$utilityPath = $env:ENGINE_DIRECTORY + "/OpenRA.Utility.exe" -$styleCheckPath = $env:ENGINE_DIRECTORY + "/OpenRA.StyleCheck.exe" - -$execute = $command -if ($command.Length -gt 1) -{ - $execute = $command[0] -} - -switch ($execute) -{ - "all" { All-Command } - "version" { Version-Command } - "clean" { Clean-Command } - "test" { Test-Command } - "check" { Check-Command } - "check-scripts" { Check-Scripts-Command } - "docs" { Docs-Command } - Default { echo ("Invalid command '{0}'" -f $command) } -} - -# In case the script was called without any parameters we keep the window open -if ($args.Length -eq 0) -{ - WaitForInput -} +####### The starting point for the script is the bottom ####### + +############################################################### +########################## FUNCTIONS ########################## +############################################################### +function All-Command +{ + If (!(Test-Path "*.sln")) + { + return + } + + if ((CheckForDotnet) -eq 1) + { + return + } + + dotnet build /p:Configuration=Release /nologo + if ($lastexitcode -ne 0) + { + Write-Host "Build failed. If just the development tools failed to build, try installing Visual Studio. You may also still be able to run the game." -ForegroundColor Red + } + else + { + Write-Host "Build succeeded." -ForegroundColor Green + } +} + +function Clean-Command +{ + If (!(Test-Path "*.sln")) + { + return + } + + if ((CheckForDotnet) -eq 1) + { + return + } + + dotnet clean /nologo + rm *.dll + rm mods/*/*.dll + rm *.dll.config + rm *.pdb + rm mods/*/*.pdb + rm *.exe + rm ./*/bin -r + rm ./*/obj -r + + rm $env:ENGINE_DIRECTORY/*.dll + rm $env:ENGINE_DIRECTORY/mods/*/*.dll + rm env:ENGINE_DIRECTORY/*.config + rm env:ENGINE_DIRECTORY/*.pdb + rm mods/*/*.pdb + rm env:ENGINE_DIRECTORY/*.exe + rm env:ENGINE_DIRECTORY/*/bin -r + rm env:ENGINE_DIRECTORY/*/obj -r + if (Test-Path env:ENGINE_DIRECTORY/thirdparty/download/) + { + rmdir env:ENGINE_DIRECTORY/thirdparty/download -Recurse -Force + } + + Write-Host "Clean complete." -ForegroundColor Green +} + +function Version-Command +{ + if ($command.Length -gt 1) + { + $version = $command[1] + } + elseif (Get-Command 'git' -ErrorAction SilentlyContinue) + { + $gitRepo = git rev-parse --is-inside-work-tree + if ($gitRepo) + { + $version = git name-rev --name-only --tags --no-undefined HEAD 2>$null + if ($version -eq $null) + { + $version = "git-" + (git rev-parse --short HEAD) + } + } + else + { + Write-Host "Not a git repository. The version will remain unchanged." -ForegroundColor Red + } + } + else + { + Write-Host "Unable to locate Git. The version will remain unchanged." -ForegroundColor Red + } + + if ($version -ne $null) + { + $mod = "mods/" + $modID + "/mod.yaml" + $replacement = (gc $mod) -Replace "Version:.*", ("Version: {0}" -f $version) + sc $mod $replacement + + $prefix = $(gc $mod) | Where { $_.ToString().EndsWith(": User") } + if ($prefix -and $prefix.LastIndexOf("/") -ne -1) + { + $prefix = $prefix.Substring(0, $prefix.LastIndexOf("/")) + } + $replacement = (gc $mod) -Replace ".*: User", ("{0}/{1}: User" -f $prefix, $version) + sc $mod $replacement + + Write-Host ("Version strings set to '{0}'." -f $version) + } +} + +function Test-Command +{ + if ((CheckForUtility) -eq 1) + { + return + } + + Write-Host "Testing $modID mod MiniYAML..." -ForegroundColor Cyan + Invoke-Expression "$utilityPath $modID --check-yaml" +} + +function Check-Command +{ + If (!(Test-Path "*.sln")) + { + Write-Host "No custom solution file found. Skipping static code checks." -ForegroundColor Cyan + return + } + + Write-Host "Compiling in debug configuration..." -ForegroundColor Cyan + dotnet build /p:Configuration=Debug /nologo + if ($lastexitcode -ne 0) + { + Write-Host "Build failed." -ForegroundColor Red + } + + if ((CheckForUtility) -eq 0) + { + Write-Host "Checking for explicit interface violations..." -ForegroundColor Cyan + Invoke-Expression "$utilityPath $modID --check-explicit-interfaces" + + Write-Host "Checking for incorrect conditional trait interface overrides..." -ForegroundColor Cyan + Invoke-Expression "$utilityPath $modID --check-conditional-trait-interface-overrides" + } +} + +function Check-Scripts-Command +{ + if ((Get-Command "luac.exe" -ErrorAction SilentlyContinue) -ne $null) + { + Write-Host "Testing Lua scripts..." -ForegroundColor Cyan + foreach ($script in ls "mods/*/maps/*/*.lua") + { + luac -p $script + } + Write-Host "Check completed!" -ForegroundColor Green + } + else + { + Write-Host "luac.exe could not be found. Please install Lua." -ForegroundColor Red + } +} + +function Docs-Command +{ + if ((CheckForUtility) -eq 1) + { + return + } + + ./make.ps1 version + Invoke-Expression "$utilityPath $modID --docs | Out-File -Encoding 'UTF8' DOCUMENTATION.md" + Invoke-Expression "$utilityPath $modID --weapon-docs | Out-File -Encoding "UTF8" WEAPONS.md" + Invoke-Expression "$utilityPath $modID --lua-docs | Out-File -Encoding 'UTF8' Lua-API.md" + Write-Host "Docs generated." -ForegroundColor Green +} + +function CheckForUtility +{ + if (Test-Path $utilityPath) + { + return 0 + } + + Write-Host "OpenRA.Utility.exe could not be found. Build the project first using the `"all`" command." -ForegroundColor Red + return 1 +} + +function CheckForDotnet +{ + if ((Get-Command "dotnet" -ErrorAction SilentlyContinue) -eq $null) + { + Write-Host "The 'dotnet' tool is required to compile OpenRA. Please install the .NET Core SDK or Visual Studio and try again. https://dotnet.microsoft.com/download" -ForegroundColor Red + return 1 + } + + return 0 +} + +function WaitForInput +{ + echo "Press enter to continue." + while ($true) + { + if ([System.Console]::KeyAvailable) + { + exit + } + Start-Sleep -Milliseconds 50 + } +} + +function ReadConfigLine($line, $name) +{ + $prefix = $name + '=' + if ($line.StartsWith($prefix)) + { + [Environment]::SetEnvironmentVariable($name, $line.Replace($prefix, '').Replace('"', '')) + } +} + +function ParseConfigFile($fileName) +{ + $names = @("MOD_ID", "ENGINE_VERSION", "AUTOMATIC_ENGINE_MANAGEMENT", "AUTOMATIC_ENGINE_SOURCE", + "AUTOMATIC_ENGINE_EXTRACT_DIRECTORY", "AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME", "ENGINE_DIRECTORY") + + $reader = [System.IO.File]::OpenText($fileName) + while($null -ne ($line = $reader.ReadLine())) + { + foreach ($name in $names) + { + ReadConfigLine $line $name + } + } + $reader.Close() + + $missing = @() + foreach ($name in $names) + { + if (!([System.Environment]::GetEnvironmentVariable($name))) + { + $missing += $name + } + } + + if ($missing) + { + echo "Required mod.config variables are missing:" + foreach ($m in $missing) + { + echo " $m" + } + echo "Repair your mod.config (or user.config) and try again." + WaitForInput + exit + } +} + +############################################################### +############################ Main ############################# +############################################################### +if ($PSVersionTable.PSVersion.Major -clt 3) +{ + echo "The makefile requires PowerShell version 3 or higher." + echo "Please download and install the latest Windows Management Framework version from Microsoft." + WaitForInput +} + +if ($args.Length -eq 0) +{ + echo "Command list:" + echo "" + echo " all Builds the game, its development tools and the mod dlls." + echo " version Sets the version strings for all mods to the latest" + echo " version for the current Git branch." + echo " clean Removes all built and copied files." + echo " from the mods and the engine directories." + echo " test Tests the mod's MiniYAML for errors." + echo " check Checks .cs files for StyleCop violations." + echo " check-scripts Checks .lua files for syntax errors." + echo " docs Generates the trait and Lua API documentation." + echo "" + $command = (Read-Host "Enter command").Split(' ', 2) +} +else +{ + $command = $args +} + +# Set the working directory for our IO methods +$templateDir = $pwd.Path +[System.IO.Directory]::SetCurrentDirectory($templateDir) + +# Load the environment variables from the config file +# and get the mod ID from the local environment variable +ParseConfigFile "mod.config" + +if (Test-Path "user.config") +{ + ParseConfigFile "user.config" +} + +$modID = $env:MOD_ID + +$env:MOD_SEARCH_PATHS = (Get-Item -Path ".\" -Verbose).FullName + "\mods,./mods" + +# Run the same command on the engine's make file +if ($command -eq "all" -or $command -eq "clean") +{ + $versionFile = $env:ENGINE_DIRECTORY + "/VERSION" + $currentEngine = "" + if (Test-Path $versionFile) + { + $reader = [System.IO.File]::OpenText($versionFile) + $currentEngine = $reader.ReadLine() + $reader.Close() + } + + if ($currentEngine -ne "" -and $currentEngine -eq $env:ENGINE_VERSION) + { + cd $env:ENGINE_DIRECTORY + Invoke-Expression ".\make.cmd $command" + echo "" + cd $templateDir + } + elseif ($env:AUTOMATIC_ENGINE_MANAGEMENT -ne "True") + { + echo "Automatic engine management is disabled." + echo "Please manually update the engine to version $env:ENGINE_VERSION." + WaitForInput + } + else + { + echo "OpenRA engine version $env:ENGINE_VERSION is required." + + if (Test-Path $env:ENGINE_DIRECTORY) + { + if ($currentEngine -ne "") + { + echo "Deleting engine version $currentEngine." + } + else + { + echo "Deleting existing engine (unknown version)." + } + + rm $env:ENGINE_DIRECTORY -r + } + + echo "Downloading engine..." + + if (Test-Path $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) + { + rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r + } + + $url = $env:AUTOMATIC_ENGINE_SOURCE + $url = $url.Replace("$", "").Replace("{ENGINE_VERSION}", $env:ENGINE_VERSION) + + mkdir $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY > $null + $dlPath = Join-Path $pwd (Split-Path -leaf $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) + $dlPath = Join-Path $dlPath (Split-Path -leaf $env:AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME) + + $client = new-object System.Net.WebClient + [Net.ServicePointManager]::SecurityProtocol = 'Tls12' + $client.DownloadFile($url, $dlPath) + + Add-Type -assembly "system.io.compression.filesystem" + [io.compression.zipfile]::ExtractToDirectory($dlPath, $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY) + rm $dlPath + + $extractedDir = Get-ChildItem $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -Recurse | ?{ $_.PSIsContainer } | Select-Object -First 1 + Move-Item $extractedDir.FullName -Destination $templateDir + Rename-Item $extractedDir.Name (Split-Path -leaf $env:ENGINE_DIRECTORY) + + rm $env:AUTOMATIC_ENGINE_EXTRACT_DIRECTORY -r + + cd $env:ENGINE_DIRECTORY + Invoke-Expression ".\make.cmd version $env:ENGINE_VERSION" + Invoke-Expression ".\make.cmd $command" + echo "" + cd $templateDir + } +} + +$utilityPath = $env:ENGINE_DIRECTORY + "/OpenRA.Utility.exe" +$styleCheckPath = $env:ENGINE_DIRECTORY + "/OpenRA.StyleCheck.exe" + +$execute = $command +if ($command.Length -gt 1) +{ + $execute = $command[0] +} + +switch ($execute) +{ + "all" { All-Command } + "version" { Version-Command } + "clean" { Clean-Command } + "test" { Test-Command } + "check" { Check-Command } + "check-scripts" { Check-Scripts-Command } + "docs" { Docs-Command } + Default { echo ("Invalid command '{0}'" -f $command) } +} + +# In case the script was called without any parameters we keep the window open +if ($args.Length -eq 0) +{ + WaitForInput +} diff --git a/utility.cmd b/utility.cmd index 7259a1b99..0a9eee325 100644 --- a/utility.cmd +++ b/utility.cmd @@ -1,47 +1,47 @@ -@echo off -setlocal EnableDelayedExpansion - -FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) -if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) -set MOD_SEARCH_PATHS=%~dp0mods,./mods - -if "!MOD_ID!" == "" goto badconfig -if "!ENGINE_VERSION!" == "" goto badconfig -if "!ENGINE_DIRECTORY!" == "" goto badconfig - -title OpenRA.Utility.exe %MOD_ID% - -set TEMPLATE_DIR=%CD% -if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine ->nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine -cd %ENGINE_DIRECTORY% - -:loop -echo. -echo ---------------------------------------- -echo. -echo Enter a utility command or --exit to exit. -echo Press enter to view a list of valid utility commands. -echo. - -set /P command=Please enter a command: OpenRA.Utility.exe %MOD_ID% -if /I "%command%" EQU "--exit" (cd %TEMPLATE_DIR% & exit /b) -echo. -echo ---------------------------------------- -echo. -echo OpenRA.Utility.exe %MOD_ID% %command% -call OpenRA.Utility.exe %MOD_ID% %command% -goto loop - -:noengine -echo Required engine files not found. -echo Run `make all` in the mod directory to fetch and build the required files, then try again. -pause -exit /b - -:badconfig -echo Required mod.config variables are missing. -echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are -echo defined in your mod.config (or user.config) and try again. -pause +@echo off +setlocal EnableDelayedExpansion + +FOR /F "tokens=1,2 delims==" %%A IN (mod.config) DO (set %%A=%%B) +if exist user.config (FOR /F "tokens=1,2 delims==" %%A IN (user.config) DO (set %%A=%%B)) +set MOD_SEARCH_PATHS=%~dp0mods,./mods + +if "!MOD_ID!" == "" goto badconfig +if "!ENGINE_VERSION!" == "" goto badconfig +if "!ENGINE_DIRECTORY!" == "" goto badconfig + +title OpenRA.Utility.exe %MOD_ID% + +set TEMPLATE_DIR=%CD% +if not exist %ENGINE_DIRECTORY%\OpenRA.Game.exe goto noengine +>nul find %ENGINE_VERSION% %ENGINE_DIRECTORY%\VERSION || goto noengine +cd %ENGINE_DIRECTORY% + +:loop +echo. +echo ---------------------------------------- +echo. +echo Enter a utility command or --exit to exit. +echo Press enter to view a list of valid utility commands. +echo. + +set /P command=Please enter a command: OpenRA.Utility.exe %MOD_ID% +if /I "%command%" EQU "--exit" (cd %TEMPLATE_DIR% & exit /b) +echo. +echo ---------------------------------------- +echo. +echo OpenRA.Utility.exe %MOD_ID% %command% +call OpenRA.Utility.exe %MOD_ID% %command% +goto loop + +:noengine +echo Required engine files not found. +echo Run `make all` in the mod directory to fetch and build the required files, then try again. +pause +exit /b + +:badconfig +echo Required mod.config variables are missing. +echo Ensure that MOD_ID ENGINE_VERSION and ENGINE_DIRECTORY are +echo defined in your mod.config (or user.config) and try again. +pause exit /b \ No newline at end of file From d0d31932fbb3c1e756d85ff2ebf7504fa1286392 Mon Sep 17 00:00:00 2001 From: penev92 Date: Tue, 20 Jul 2021 14:52:54 +0300 Subject: [PATCH 3/3] Added missing macos-background image placeholders --- packaging/artwork/macos-background-2x.png | Bin 0 -> 31678 bytes packaging/artwork/macos-background.png | Bin 0 -> 14756 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packaging/artwork/macos-background-2x.png create mode 100644 packaging/artwork/macos-background.png diff --git a/packaging/artwork/macos-background-2x.png b/packaging/artwork/macos-background-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4050f207305017df97b08df29410c1ee70942db GIT binary patch literal 31678 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 literal 0 HcmV?d00001 diff --git a/packaging/artwork/macos-background.png b/packaging/artwork/macos-background.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b0b21b81f4ff7b78d8122cf5a896ddd9c579b5 GIT binary patch literal 14756 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