diff --git a/README.md b/README.md index 11dad57..7346c7b 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,5 @@ primarily for its own benefit, as opposed to being a modder friendly developer p For more information, please visit: https://github.com/RAunplugged/uRA/wiki RA Unplugged on Discord: https://discord.gg/KMWnrcB + +The OpenRA engine and SDK scripts are made available under the [GPLv3](https://github.com/OpenRA/OpenRA/blob/bleed/COPYING) license, and any executable code developed by a mod and loaded by the engine (i.e. custom mod DLLs, lua scripts) must be released under a compatible license. \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index a6999ce..ea0668f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ temporary placement of changelog, -OpenRA PR list +OpenRA PR list PER commit 9c61217 #15035 not logged @@ -8,42 +8,38 @@ OpenRA PR list GENERAL IMPROVEMENTS -#14861 ignored -#15197 engine only +#14947, #15197 engine only + #14853 +#15307 engine only #14980 -#15089 engine only -#15185 -#15006 -#14947 engine only + #14853 -#14597 engine only +#14861 ignored +#15216 engine only +#15222 #15144 -#15137 +#14597 engine only +#15137 + #15287 engine only +#15279 +#15379 engine only #15179 engine only -#15176 engine only +#14899 engine only (#14901) #15057 #14929 engine only #14976 engine only #15122 engine only +#15176 engine only +#14594 +#15178 engine only #15147 #14874 engine only -#14424 engine only #14868 engine only #14915 engine only -#14950 #14975 engine only #15025 engine only -#15152 engine only -#14899 engine only (#14901) -#15065 engine only -#15003 engine only -(#14913, #14928, #14935, #14932, #14917, #14934, #14930 #14931, #14933, #14900, - #14943, #14940, #14977, #15036, #15034, #14984, #15098, #15109, #15121, #15148, #15129, #15149, #15177, #15212, #15182, #15194) engine only + #15069 - - - -AI IMPROVEMENTS +#15089 engine only +#15324 engine only +#15339 engine only -#14594 +(#14913, #14928, #14935, #14932, #14917, #14934, #14930 #14931, #14933, #14900, + #14943, #14940, #14977, #15036, #15034, #14984, #15098, #15109, #15121, #15148, #15129, #15149, #15182, #15194, #15290, #15375) engine only + #15069, #15198 @@ -52,41 +48,35 @@ RED ALERT #15106 #15147 #14815 -#14897 #15159 #14926 #14951 #14982 -#14941 -#14888 ignored +#15260 +#15253 +#15270 +#14950 #14945 +#15300 +#14888 ignored +#14941 +#14897 +#15354 #15180 ignored #15069, #15205 #15206 -#15091 ignored +#15091 ignored, #14982, #15302, ENGINE/MODDING -(#14964, #15005, #15009, #15011, #15095, #15096, #15090, #15156) engine only + #15125 -#14831 engine only -(#14859, #15001) engine only -#14948 engine only -#14249 engine only -#15064 engine only -#14684 engine only -#15108 -#14974 engine only -#14946 engine only -#15031 engine only -#15030 engine only -#15007 engine only -#14286 engine only -#15103 -#14837 engine only -#14742 -#15094 +#15204 engine only +#15094 engine only +#15288 engine only +(#14964, #15005, #15009, #15011, #15090, #15095, #15096, #15010, #15128 (ModSDK related), #15156, #15219, #15295) engine only + #15125 +#14851 engine only (commit/12054506e1399bccadd94727299266fc3133821f) +#15006 #14916 engine only #15111 engine only #14777 engine only @@ -94,32 +84,56 @@ ENGINE/MODDING #15022 engine only #14216 engine only #14890 engine only +#15306 engine only #14862 engine only #14840 engine only #14818 engine only #14791 engine only -#14851 engine only (commit/12054506e1399bccadd94727299266fc3133821f) -#14882 engine only #15072 engine only #15066 engine only +#14757 engine only #15144 -#15128 (ModSDK related) #15140 -#14757 engine only -#14685 engine only + #14889 -#14759 engine only -#14817 engine only -#14738 engine only -(#14895, #14896) engine only -#15088 engine only +#15185 +#14882 engine only +#15007 engine only +#14837 engine only +(#14738, #14759, #14817, #14895, #14896, #15043) engine only +#14988 engine only +#15317 +#14790 #15157 engine only +#14831 engine only +(#14859, #15001) engine only +#14948 engine only +#14249 engine only +#15064 engine only +#14684 engine only +#15108 +#14974 engine only +#14946 engine only +#15031 engine only +#15030 engine only +#14286 engine only +#15103 +#14424 engine only +#15252 engine only +#15224 +#15065 engine only +#15145 +#14988 engine only +#15366 engine only #14349 engine only -#14997 + #15209 engine only (ModSDK related) -#15129 engine only +#15140 +#14893 + #15115, #15262 engine only +#15263 #14846 engine only +#14997 + #15209 engine only (ModSDK related) #15161 engine only + #15171 -#14893 + #15115 engine only -#15028 +#15088 engine only +#15269 +#15253, #15258 +#15028 #14839 #14978 engine only #14845 engine only @@ -127,18 +141,23 @@ ENGINE/MODDING #14892 #14949 engine only #15037 engine only +#15210 engine only +#14742 +(#14685, #14899(#14901)) engine only + -DEDICATED +DEDICATED SERVER -#15152 +#15152 engine only +#15003 engine only PACKAGING -#15086 engine only +#15086, #15291, #15299, #15316, #15374 engine only diff --git a/mod.config b/mod.config index 2289723..1282cab 100644 --- a/mod.config +++ b/mod.config @@ -9,7 +9,7 @@ MOD_ID="ura" # The OpenRA engine version to use for this project. -ENGINE_VERSION="8461a82" +ENGINE_VERSION="9c61217" ############################################################################## # Continuous Integration @@ -65,7 +65,7 @@ PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" PACKAGING_AUTHORS="SoScared" # The git tag to use for the macOS Launcher files. -PACKAGING_OSX_LAUNCHER_TAG="osx-launcher-20171118" +PACKAGING_OSX_LAUNCHER_TAG="osx-launcher-20180723" # Filename to use for the launcher executable on Windows. PACKAGING_WINDOWS_LAUNCHER_NAME="Red Alert Unplugged" @@ -77,13 +77,20 @@ PACKAGING_WINDOWS_INSTALL_DIR_NAME="Red Alert Unplugged" # This should not contain spaces or special characters. PACKAGING_WINDOWS_REGISTRY_KEY="RedAlertUnplugged" +# Path to the file containing the text to show in the Windows installer license dialog +PACKAGING_WINDOWS_LICENSE_FILE="./COPYING" + # The git tag to use for the AppImage dependencies. -PACKAGING_APPIMAGE_DEPENDENCIES_TAG="20180408" +PACKAGING_APPIMAGE_DEPENDENCIES_TAG="20180723" # Space delimited list of additional files/directories to copy from the engine directory # when packaging your mod. e.g. "./mods/modcontent" or "./mods/d2k/OpenRA.Mods.D2k.dll" PACKAGING_COPY_ENGINE_FILES="./mods/modcontent" +# Overwrite the version in mod.yaml with the tag used for the SDK release +# Accepts values "True" or "False". +PACKAGING_OVERWRITE_MOD_VERSION="True" + ############################################################################## # Advanced Configuration # diff --git a/mods/ura/bits/factpdox.shp b/mods/ura/bits/factpdox.shp new file mode 100644 index 0000000..d07b694 Binary files /dev/null and b/mods/ura/bits/factpdox.shp differ diff --git a/mods/ura/maps/minigames/bomber-john/rules.yaml b/mods/ura/maps/minigames/bomber-john/rules.yaml index a11f9f8..e3a73e3 100644 --- a/mods/ura/maps/minigames/bomber-john/rules.yaml +++ b/mods/ura/maps/minigames/bomber-john/rules.yaml @@ -17,6 +17,9 @@ World: TechLevel: unrestricted MPStartLocations: SeparateTeamSpawnsCheckboxVisible: false + Locomotor@LIGHTTRACKED: + WaitAverage: 1 + WaitSpread: 1 APWR: Buildable: @@ -118,8 +121,6 @@ MNLYR: Type: Heavy Mobile: Speed: 128 - WaitAverage: 1 - WaitSpread: 1 TurnSpeed: 900 RevealsShroud: Range: 40c0 diff --git a/mods/ura/maps/minigames/drop-zone-w/rules.yaml b/mods/ura/maps/minigames/drop-zone-w/rules.yaml index b6d48e3..361d679 100644 --- a/mods/ura/maps/minigames/drop-zone-w/rules.yaml +++ b/mods/ura/maps/minigames/drop-zone-w/rules.yaml @@ -48,9 +48,7 @@ LST: Name: secondary Weapon: M60mg AttackFrontal: - WithMuzzleOverlay@PRIMARY: - WithMuzzleOverlay@SECONDARY: - Armament: secondary + WithMuzzleOverlay: MustBeDestroyed: RequiredForShortGame: true diff --git a/mods/ura/maps/minigames/fort-lonestar/weapons.yaml b/mods/ura/maps/minigames/fort-lonestar/weapons.yaml index aed77be..0d86f0b 100644 --- a/mods/ura/maps/minigames/fort-lonestar/weapons.yaml +++ b/mods/ura/maps/minigames/fort-lonestar/weapons.yaml @@ -145,7 +145,6 @@ SCUD: Range: 7c0 ReloadDelay: 280 Projectile: Bullet - Arm: 10 TrailImage: smokey Blockable: false Inaccuracy: 0c426 diff --git a/mods/ura/maps/missions/co-op - exodus/rules.yaml b/mods/ura/maps/missions/co-op - exodus/rules.yaml index 943320a..e7b6f09 100644 --- a/mods/ura/maps/missions/co-op - exodus/rules.yaml +++ b/mods/ura/maps/missions/co-op - exodus/rules.yaml @@ -30,9 +30,8 @@ powerproxy.paratroopers: HBOX: Buildable: + # Invalid targets for YakAttack Prerequisites: ~disabled - EditorOnlyTooltip: - Description: invalid targets for YakAttack E7: Buildable: @@ -182,7 +181,6 @@ GAP: CAMERA.Large: Inherits: CAMERA + # Required for YakAttack to work RevealsShroud: Range: 49c0 - EditorOnlyTooltip: - Description: required for YakAttack to work diff --git a/mods/ura/maps/other/snow-shellmap/map.yaml b/mods/ura/maps/other/snow-shellmap/map.yaml index 96ea92d..7738f02 100644 --- a/mods/ura/maps/other/snow-shellmap/map.yaml +++ b/mods/ura/maps/other/snow-shellmap/map.yaml @@ -106,10 +106,10 @@ Actors: Location: 60,93 Owner: Neutral Chinook1Entry: waypoint - Location: 44,126 + Location: 45,126 Owner: Neutral Chinook2Entry: waypoint - Location: 47,126 + Location: 48,126 Owner: Neutral Paradrop1: waypoint Location: 70,50 diff --git a/mods/ura/rules/ai.yaml b/mods/ura/rules/ai.yaml index 534ba2f..b1d9617 100644 --- a/mods/ura/rules/ai.yaml +++ b/mods/ura/rules/ai.yaml @@ -68,54 +68,55 @@ Player: dog: 4 harv: 8 SquadSize: 20 - SupportPowerDecision@spyplane: - OrderName: SovietSpyPlane - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@paratroopers: - OrderName: SovietParatroopers - MinimumAttractiveness: 5 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 8c0 - Consideration@2: - Against: Enemy - Types: Water - Attractiveness: -5 - TargetMetric: None - CheckRadius: 8c0 - SupportPowerDecision@parabombs: - OrderName: UkraineParabombs - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@nukepower: - OrderName: NukePowerInfoOrder - MinimumAttractiveness: 3000 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: Value - CheckRadius: 5c0 - Consideration@2: - Against: Ally - Types: Air, Ground, Water - Attractiveness: -10 - TargetMetric: Value - CheckRadius: 7c0 + SupportPowerDecisions: + spyplane: + OrderName: SovietSpyPlane + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + paratroopers: + OrderName: SovietParatroopers + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + nukepower: + OrderName: NukePowerInfoOrder + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 5c0 + Consideration@2: + Against: Ally + Types: Air, Ground, Water + Attractiveness: -10 + TargetMetric: Value + CheckRadius: 7c0 HackyAI@NormalAI: Name: Normal AI Type: normal @@ -203,54 +204,55 @@ Player: dog: 4 harv: 8 SquadSize: 40 - SupportPowerDecision@spyplane: - OrderName: SovietSpyPlane - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@paratroopers: - OrderName: SovietParatroopers - MinimumAttractiveness: 5 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 8c0 - Consideration@2: - Against: Enemy - Types: Water - Attractiveness: -5 - TargetMetric: None - CheckRadius: 8c0 - SupportPowerDecision@parabombs: - OrderName: UkraineParabombs - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@nukepower: - OrderName: NukePowerInfoOrder - MinimumAttractiveness: 3000 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: Value - CheckRadius: 5c0 - Consideration@2: - Against: Ally - Types: Air, Ground, Water - Attractiveness: -10 - TargetMetric: Value - CheckRadius: 7c0 + SupportPowerDecisions: + spyplane: + OrderName: SovietSpyPlane + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + paratroopers: + OrderName: SovietParatroopers + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + nukepower: + OrderName: NukePowerInfoOrder + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 5c0 + Consideration@2: + Against: Ally + Types: Air, Ground, Water + Attractiveness: -10 + TargetMetric: Value + CheckRadius: 7c0 HackyAI@TurtleAI: Name: Turtle AI Type: turtle @@ -338,54 +340,55 @@ Player: dog: 4 harv: 8 SquadSize: 10 - SupportPowerDecision@spyplane: - OrderName: SovietSpyPlane - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@paratroopers: - OrderName: SovietParatroopers - MinimumAttractiveness: 5 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 8c0 - Consideration@2: - Against: Enemy - Types: Water - Attractiveness: -5 - TargetMetric: None - CheckRadius: 8c0 - SupportPowerDecision@parabombs: - OrderName: UkraineParabombs - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@nukepower: - OrderName: NukePowerInfoOrder - MinimumAttractiveness: 3000 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: Value - CheckRadius: 5c0 - Consideration@2: - Against: Ally - Types: Air, Ground, Water - Attractiveness: -10 - TargetMetric: Value - CheckRadius: 7c0 + SupportPowerDecisions: + spyplane: + OrderName: SovietSpyPlane + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + paratroopers: + OrderName: SovietParatroopers + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + nukepower: + OrderName: NukePowerInfoOrder + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 5c0 + Consideration@2: + Against: Ally + Types: Air, Ground, Water + Attractiveness: -10 + TargetMetric: Value + CheckRadius: 7c0 HackyAI@NavalAI: Name: Naval AI Type: naval @@ -451,51 +454,52 @@ Player: UnitLimits: harv: 8 SquadSize: 1 - SupportPowerDecision@spyplane: - OrderName: SovietSpyPlane - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@paratroopers: - OrderName: SovietParatroopers - MinimumAttractiveness: 5 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 8c0 - Consideration@2: - Against: Enemy - Types: Water - Attractiveness: -5 - TargetMetric: None - CheckRadius: 8c0 - SupportPowerDecision@parabombs: - OrderName: UkraineParabombs - MinimumAttractiveness: 1 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: None - CheckRadius: 5c0 - SupportPowerDecision@nukepower: - OrderName: NukePowerInfoOrder - MinimumAttractiveness: 3000 - Consideration@1: - Against: Enemy - Types: Structure - Attractiveness: 1 - TargetMetric: Value - CheckRadius: 5c0 - Consideration@2: - Against: Ally - Types: Air, Ground, Water - Attractiveness: -10 - TargetMetric: Value - CheckRadius: 7c0 + SupportPowerDecisions: + spyplane: + OrderName: SovietSpyPlane + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + paratroopers: + OrderName: SovietParatroopers + MinimumAttractiveness: 5 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 8c0 + Consideration@2: + Against: Enemy + Types: Water + Attractiveness: -5 + TargetMetric: None + CheckRadius: 8c0 + parabombs: + OrderName: UkraineParabombs + MinimumAttractiveness: 1 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: None + CheckRadius: 5c0 + nukepower: + OrderName: NukePowerInfoOrder + MinimumAttractiveness: 3000 + Consideration@1: + Against: Enemy + Types: Structure + Attractiveness: 1 + TargetMetric: Value + CheckRadius: 5c0 + Consideration@2: + Against: Ally + Types: Air, Ground, Water + Attractiveness: -10 + TargetMetric: Value + CheckRadius: 7c0 \ No newline at end of file diff --git a/mods/ura/rules/aircraft.yaml b/mods/ura/rules/aircraft.yaml index ce716a4..a30e3e0 100644 --- a/mods/ura/rules/aircraft.yaml +++ b/mods/ura/rules/aircraft.yaml @@ -5,8 +5,6 @@ BADR: ChuteSound: chute1.aud Health: HP: 300 - Armor: - Type: Light Aircraft: CruiseAltitude: 2560 TurnSpeed: 5 @@ -46,8 +44,6 @@ BADR.Bomber: Weapon: ParaBomb Health: HP: 300 - Armor: - Type: Light Aircraft: CruiseAltitude: 2560 TurnSpeed: 5 @@ -98,8 +94,6 @@ MIG: Name: MiG Health: HP: 80 - Armor: - Type: Light RevealsShroud: Range: 15c0 Type: GroundPosition @@ -164,8 +158,6 @@ YAK: Name: Yak Health: HP: 60 - Armor: - Type: Light RevealsShroud: Range: 13c0 Type: GroundPosition @@ -232,8 +224,6 @@ TRAN: Name: Chinook Health: HP: 160 - Armor: - Type: Light Armament@PRIMARY: Weapon: Hover AttackHeli: @@ -298,8 +288,6 @@ HELI: Name: Longbow Health: HP: 120 - Armor: - Type: Light RevealsShroud: Range: 14c0 Type: GroundPosition @@ -363,8 +351,6 @@ HIND: Name: Hind Health: HP: 100 - Armor: - Type: Light RevealsShroud: Range: 12c0 Type: GroundPosition @@ -422,8 +408,6 @@ U2: HP: 2000 Tooltip: Name: Spy Plane - Armor: - Type: Heavy Aircraft: CruiseAltitude: 3840 TurnSpeed: 7 diff --git a/mods/ura/rules/civilian.yaml b/mods/ura/rules/civilian.yaml index 8e0866e..0402255 100644 --- a/mods/ura/rules/civilian.yaml +++ b/mods/ura/rules/civilian.yaml @@ -65,6 +65,8 @@ TECN: FCOM: Inherits: ^TechBuilding Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, NoAutoTarget OwnerLostAction: @@ -112,6 +114,7 @@ HOSP: TargetTypes: Ground, C4, DetonateAttack, Structure, NoAutoTarget Selectable: Priority: 0 + Bounds: 48,48 OwnerLostAction: Action: ChangeOwner Building: @@ -395,6 +398,7 @@ MISS: TargetableOffsets: 0,0,0, 840,0,0, 840,-1024,0, 420,768,0, -840,0,0, -840,-1024,0, -840,1024,0 Selectable: Priority: 0 + Bounds: 72,48 OwnerLostAction: Action: ChangeOwner Building: @@ -432,6 +436,8 @@ MISS: BIO: Inherits: ^TechBuilding Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, NoAutoTarget OwnerLostAction: @@ -471,6 +477,7 @@ OILB: TargetableOffsets: 0,0,0, 630,-300,0, 420,512,0, -420,-512,0, -630,300,0 Selectable: Priority: 0 + Bounds: 48,48 Building: Footprint: xx xx Dimensions: 2,2 diff --git a/mods/ura/rules/decoration.yaml b/mods/ura/rules/decoration.yaml index 39d42cf..61ce855 100644 --- a/mods/ura/rules/decoration.yaml +++ b/mods/ura/rules/decoration.yaml @@ -219,6 +219,7 @@ BOXES01: Palette: player Tooltip: Name: Boxes + EditorTilesetFilter: Categories: Decoration BOXES02: diff --git a/mods/ura/rules/defaults.yaml b/mods/ura/rules/defaults.yaml index 0bb9533..b8e9af7 100644 --- a/mods/ura/rules/defaults.yaml +++ b/mods/ura/rules/defaults.yaml @@ -301,6 +301,7 @@ Huntable: OwnerLostAction: Action: Kill + DeathTypes: DefaultDeath DrawLineToTarget: Health: HP: 25 @@ -413,6 +414,8 @@ GenericVisibility: None RevealsShroud: Range: 3c0 + Passenger: + PipType: Gray ProximityCaptor: Types: CivilianInfantry ScaredyCat: @@ -487,6 +490,8 @@ OwnerLostAction: Action: Kill DrawLineToTarget: + Armor: + Type: Light UpdatesPlayerStatistics: AppearsOnRadar: UseLocation: true @@ -636,6 +641,8 @@ ^Defense: Inherits: ^Building + Selectable: + Bounds: 24,24 Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, Defense MustBeDestroyed: @@ -656,6 +663,7 @@ Inherits@2: ^SpriteActor Inherits@shape: ^1x1Shape Interactable: + Bounds: 24,24 OwnerLostAction: Action: Kill Building: @@ -821,17 +829,17 @@ Targetable: TargetTypes: Trees WithDamageOverlay@SmallBurn: - DamageType: Incendiary + DamageTypes: Incendiary Image: burn-s MinimumDamageState: Light MaximumDamageState: Medium WithDamageOverlay@MediumBurn: - DamageType: Incendiary + DamageTypes: Incendiary Image: burn-m MinimumDamageState: Medium MaximumDamageState: Heavy WithDamageOverlay@LargeBurn: - DamageType: Incendiary + DamageTypes: Incendiary Image: burn-l MinimumDamageState: Heavy MaximumDamageState: Dead @@ -992,6 +1000,7 @@ ^Crate: Inherits@1: ^SpriteActor Interactable: + Bounds: 24,24 HiddenUnderFog: Tooltip: Name: Crate @@ -1026,6 +1035,7 @@ ^Mine: Inherits: ^SpriteActor Interactable: + Bounds: 24,24 WithSpriteBody: HiddenUnderFog: Mine: diff --git a/mods/ura/rules/fakes.yaml b/mods/ura/rules/fakes.yaml index 23afa93..3dfd991 100644 --- a/mods/ura/rules/fakes.yaml +++ b/mods/ura/rules/fakes.yaml @@ -2,6 +2,8 @@ FPWR: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 640,-384,0, 640,512,0, -710,-512,0, -710,512,0 @@ -34,6 +36,8 @@ TENF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 @@ -65,6 +69,8 @@ TENF: SYRF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake + Selectable: + Bounds: 72,48 Buildable: BuildPaletteOrder: 890 Queue: Defense @@ -108,6 +114,8 @@ SYRF: SPEF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake + Selectable: + Bounds: 72,48 Targetable: TargetTypes: Ground, Water, Structure, SpyInfiltrate Buildable: @@ -151,6 +159,8 @@ WEAF: Inherits: ^FakeBuilding Inherits@infiltrate: ^InfiltratableFake Inherits@shape: ^3x2Shape + Selectable: + Bounds: 72,48 Buildable: BuildPaletteOrder: 920 Prerequisites: ~structures.france, ~techlevel.medium @@ -183,6 +193,8 @@ DOMF: Inherits@IDISABLE: ^DisableOnLowPower Inherits@infiltrate: ^InfiltratableFake Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-384,0, 630,384,0, -700,-512,0, -700,512,0 @@ -213,6 +225,9 @@ DOMF: FIXF: Inherits: ^FakeBuilding + Selectable: + Bounds: 68,34,0,3 + DecorationBounds: 72,48 Buildable: BuildPaletteOrder: 940 Queue: Defense @@ -225,7 +240,7 @@ FIXF: GenericVisibility: Enemy GenericStancePrefix: False Building: - Footprint: _X_ xxx _X_ + Footprint: _=_ xxx _=_ Dimensions: 3,3 Health: HP: 800 @@ -281,6 +296,8 @@ ATEF: Inherits: ^FakeBuilding Inherits@IDISABLE: ^DisableOnLowPower Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Tooltip: Name: Fake Allied Tech Center GenericName: Allied Tech Center @@ -310,6 +327,8 @@ PDOF: Inherits: ^FakeBuilding Inherits@IDISABLE: ^DisableOnLowPower Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Tooltip: Name: Fake Chronosphere GenericName: Chronosphere @@ -342,6 +361,8 @@ MSLF: Inherits: ^FakeBuilding Inherits@IDISABLE: ^DisableOnLowPower Inherits@shape: ^2x1Shape + Selectable: + Bounds: 48,24 Tooltip: Name: Fake Missile Silo GenericName: Missile Silo @@ -370,6 +391,8 @@ MSLF: FACF: Inherits: ^FakeBuilding + Selectable: + Bounds: 72,72 Buildable: BuildPaletteOrder: 1000 Queue: Defense diff --git a/mods/ura/rules/infantry.yaml b/mods/ura/rules/infantry.yaml index 8c804f5..0c98748 100644 --- a/mods/ura/rules/infantry.yaml +++ b/mods/ura/rules/infantry.yaml @@ -268,7 +268,7 @@ SPY: RevealsShroud: Range: 6c0 Passenger: - PipType: Yellow + PipType: Blue Voice: Move Disguise: DisguisedCondition: disguise @@ -411,7 +411,7 @@ MEDI: RevealsShroud: Range: 4c0 Passenger: - PipType: Yellow + PipType: Blue Armament: Weapon: Heal Cursor: heal @@ -447,7 +447,7 @@ MECH: RevealsShroud: Range: 4c0 Passenger: - PipType: Yellow + PipType: Blue Voice: Move Armament: Weapon: Repair @@ -533,9 +533,8 @@ THF: RevealsShroud: Range: 5c0 Passenger: - PipType: Yellow + PipType: Blue Infiltrates: - InfiltrateTypes: Cash PlayerExperience: 50 Voiced: VoiceSet: ThiefVoice @@ -562,7 +561,7 @@ HIJACKER: RevealsShroud: Range: 6c0 Passenger: - PipType: Yellow + PipType: Blue Captures: CaptureTypes: vehicle PlayerExperience: 50 @@ -742,7 +741,7 @@ Ant: Mobile: Speed: 99 TurnSpeed: 12 - SharesCell: no + Locomotor: lighttracked -Crushable: AutoTarget: ScanRadius: 6 diff --git a/mods/ura/rules/palettes.yaml b/mods/ura/rules/palettes.yaml index 4aa12f2..02d6a42 100644 --- a/mods/ura/rules/palettes.yaml +++ b/mods/ura/rules/palettes.yaml @@ -85,7 +85,6 @@ A: 180 ShroudPalette@shroud: Name: shroud - Type: Shroud ShroudPalette@fog: Name: fog Fog: true diff --git a/mods/ura/rules/structures.yaml b/mods/ura/rules/structures.yaml index cb66d47..392123c 100644 --- a/mods/ura/rules/structures.yaml +++ b/mods/ura/rules/structures.yaml @@ -2,6 +2,8 @@ MSLO: Inherits: ^ScienceBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@shape: ^2x1Shape + Selectable: + Bounds: 48,24 Valued: Cost: 2500 Tooltip: @@ -108,6 +110,8 @@ GAP: SPEN: Inherits: ^Building + Selectable: + Bounds: 72,48 InfiltrateForSupportPower: Proxy: powerproxy.sonarpulse Types: SpyInfiltrate @@ -241,6 +245,8 @@ SPEN: SYRD: Inherits: ^Building + Selectable: + Bounds: 72,48 InfiltrateForSupportPower: Proxy: powerproxy.sonarpulse Types: SpyInfiltrate @@ -419,6 +425,8 @@ PDOX: Inherits: ^ScienceBuilding Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Buildable: Queue: Defense BuildPaletteOrder: 120 @@ -589,6 +597,8 @@ DOME: Inherits: ^Building Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-384,0, 630,384,0, -700,-512,0, -700,512,0 @@ -851,6 +861,8 @@ SAM: Inherits@IDISABLE: ^DisableOnLowPowerOrPowerDown Inherits@AUTOTARGET: ^AutoTargetAir Inherits@shape: ^2x1Shape + Selectable: + Bounds: 48,24 HitShape: Type: Rectangle TopLeft: -768,-512 @@ -901,6 +913,8 @@ ATEK: Inherits: ^ScienceBuilding Inherits@IDISABLE: ^DisableOnLowPower Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 Buildable: Queue: Building BuildPaletteOrder: 140 @@ -944,6 +958,8 @@ ATEK: WEAP: Inherits: ^Building Inherits@shape: ^3x2Shape + Selectable: + Bounds: 72,48 Buildable: Queue: Building BuildPaletteOrder: 80 @@ -1050,6 +1066,8 @@ WEAP: FACT: Inherits: ^Building + Selectable: + Bounds: 72,72 Building: Footprint: xxX xxx XxX === Dimensions: 3,4 @@ -1102,16 +1120,17 @@ FACT: Cost: 2500 Tooltip: Name: Construction Yard - CustomSellValue: - Value: 2500 SpawnActorsOnSell: ActorTypes: e1,e1,e1,tecn,tecn,e6 BaseBuilding: Transforms: + PauseOnCondition: chrono-vortex IntoActor: mcv Offset: 1,1 Facing: 96 RequiresCondition: factundeploy + Sellable: + RequiresCondition: !chrono-vortex GrantConditionOnPrerequisite@GLOBALFACTUNDEPLOY: Condition: factundeploy Prerequisites: global-factundeploy @@ -1134,6 +1153,11 @@ FACT: Type: Rectangle TopLeft: -1536, -1536 BottomRight: 1536, 1536 + ConyardChronoReturn: + Condition: chrono-vortex + Damage: 950 + TransferTimedExternalConditionOnTransform: + Condition: invulnerability PROC: Inherits: ^Building @@ -1151,7 +1175,7 @@ PROC: Dimensions: 3,4 LocalCenterOffset: 0,-512,0 Selectable: - Bounds: 72,50,0,12 + Bounds: 72,50,0,4 DecorationBounds: 72,70,0,-2 SelectionDecorations: Targetable: @@ -1174,7 +1198,7 @@ PROC: Capacity: 2000 DrawLineToTarget: CustomSellValue: - Value: 600 + Value: 300 FreeActor: Actor: HARV SpawnOffset: 1,2 @@ -1208,6 +1232,8 @@ PROC: SILO: Inherits: ^Building + Selectable: + Bounds: 24,24 Buildable: Queue: Defense BuildPaletteOrder: 35 @@ -1241,6 +1267,8 @@ SILO: HPAD: Inherits: ^Building Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 768,-512,0, 768,512,0, -281,-512,0, -630,512,0 @@ -1345,6 +1373,7 @@ AFLD: Name: Airfield Selectable: Class: afld + Bounds: 72,48 Building: Footprint: xxx xxx Dimensions: 3,2 @@ -1483,6 +1512,8 @@ POWR: Inherits: ^Building Inherits@POWER_OUTAGE: ^DisabledByPowerOutage Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 640,-384,0, 640,512,0, -710,-512,0, -710,512,0 @@ -1561,6 +1592,8 @@ APWR: STEK: Inherits: ^ScienceBuilding Inherits@shape: ^3x2Shape + Selectable: + Bounds: 72,48 HitShape: TargetableOffsets: 420,-768,0, 420,768,0, -770,-768,0, -770,768,0 Buildable: @@ -1595,6 +1628,8 @@ STEK: BARR: Inherits: ^Building Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 490,-470,0, 355,512,0, -355,-512,0, -630,512,0 @@ -1676,6 +1711,8 @@ BARR: KENN: Inherits: ^Building + Selectable: + Bounds: 24,24 Buildable: Queue: Building BuildPaletteOrder: 175 @@ -1724,6 +1761,8 @@ KENN: TENT: Inherits: ^Building Inherits@shape: ^2x2Shape + Selectable: + Bounds: 48,48 HitShape: UseTargetableCellsOffsets: false TargetableOffsets: 0,0,0, 630,-512,0, 355,512,0, -281,-512,0, -630,512,0 @@ -1873,7 +1912,6 @@ SBAG: Armor: Type: Wood LineBuild: - Range: 8 NodeTypes: sandbag LineBuildNode: Types: sandbag @@ -1898,7 +1936,6 @@ FENC: Armor: Type: Wood LineBuild: - Range: 8 NodeTypes: fence LineBuildNode: Types: fence @@ -1929,7 +1966,6 @@ BRIK: CrushClasses: heavywall BlocksProjectiles: LineBuild: - Range: 8 NodeTypes: concrete LineBuildNode: Types: concrete diff --git a/mods/ura/rules/vehicles.yaml b/mods/ura/rules/vehicles.yaml index 54e5393..68854e7 100644 --- a/mods/ura/rules/vehicles.yaml +++ b/mods/ura/rules/vehicles.yaml @@ -30,9 +30,11 @@ V2RL: AttackFrontal: WithFacingSpriteBody: RequiresCondition: !reloading + Name: loaded WithFacingSpriteBody@EMPTY: RequiresCondition: !reloading Sequence: empty-idle + Name: reloading SelectionDecorations: Explodes: Weapon: V2Explode @@ -393,7 +395,7 @@ HARV: OwnerType: InternalName EffectiveOwnerFromOwner: true HarvesterHuskModifier: - FullActor: HARV.FullHusk + FullHuskActor: HARV.FullHusk FullnessThreshold: 50 SelfHealing: Step: 1 @@ -447,6 +449,8 @@ MCV: Actor: MCV.Husk OwnerType: InternalName EffectiveOwnerFromOwner: true + TransferTimedExternalConditionOnTransform: + Condition: invulnerability # Jeep IFV traits using custom yaml code by Grayon Dilach JEEP: diff --git a/mods/ura/sequences/infantry.yaml b/mods/ura/sequences/infantry.yaml index cc1cc53..d27a145 100644 --- a/mods/ura/sequences/infantry.yaml +++ b/mods/ura/sequences/infantry.yaml @@ -1084,11 +1084,11 @@ c1: Start: 168 Length: 12 die4: + Start: 168 + Length: 12 + die5: Start: 180 Length: 18 - die5: - Start: 160 - Length: 8 die6: electro Length: * UseTilesetExtension: true @@ -1134,11 +1134,11 @@ c2: Start: 168 Length: 12 die4: + Start: 168 + Length: 12 + die5: Start: 180 Length: 18 - die5: - Start: 160 - Length: 8 die6: electro Length: * UseTilesetExtension: true @@ -1184,11 +1184,11 @@ c3: Start: 168 Length: 12 die4: + Start: 168 + Length: 12 + die5: Start: 180 Length: 18 - die5: - Start: 160 - Length: 8 die6: electro Length: * UseTilesetExtension: true @@ -1235,11 +1235,11 @@ einstein: Start: 135 Length: 12 die4: - Start: 147 - Length: 17 + Start: 135 + Length: 12 die5: - Start: 123 - Length: 8 + Start: 147 + Length: 17 die6: electro Length: * UseTilesetExtension: true @@ -1281,11 +1281,11 @@ delphi: Start: 135 Length: 12 die4: - Start: 147 - Length: 17 + Start: 135 + Length: 12 die5: - Start: 123 - Length: 8 + Start: 147 + Length: 17 die6: electro Length: * UseTilesetExtension: true @@ -1327,11 +1327,11 @@ chan: Start: 135 Length: 12 die4: - Start: 147 - Length: 17 + Start: 135 + Length: 12 die5: - Start: 123 - Length: 8 + Start: 147 + Length: 17 die6: electro Length: * UseTilesetExtension: true diff --git a/mods/ura/sequences/structures.yaml b/mods/ura/sequences/structures.yaml index 5c7ef80..e8d17c5 100644 --- a/mods/ura/sequences/structures.yaml +++ b/mods/ura/sequences/structures.yaml @@ -59,11 +59,16 @@ fact: build: Start: 1 Length: 25 + pdox: factpdox + Length: 80 damaged-idle: Start: 26 damaged-build: Start: 27 Length: 25 + damaged-pdox: factpdox + Start: 80 + Length: 80 dead: factdead Tick: 800 bib: bib2 diff --git a/mods/ura/weapons/ballistics.yaml b/mods/ura/weapons/ballistics.yaml index a34a2d7..713a864 100644 --- a/mods/ura/weapons/ballistics.yaml +++ b/mods/ura/weapons/ballistics.yaml @@ -116,7 +116,6 @@ TurretGun: Wood: 40 Light: 60 Heavy: 25 - Concrete: 50 DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath Warhead@3Eff: CreateEffect Explosions: artillery_explosion @@ -211,11 +210,7 @@ DepthCharge: Damage: 80 ValidTargets: Submarine Versus: - None: 30 - Wood: 75 Light: 75 - Heavy: 100 - Concrete: 50 DamageTypes: ExplosionDeath Warhead@4EffWater: CreateEffect Explosions: large_splash diff --git a/mods/ura/weapons/explosions.yaml b/mods/ura/weapons/explosions.yaml index 1ab017a..ec74b25 100644 --- a/mods/ura/weapons/explosions.yaml +++ b/mods/ura/weapons/explosions.yaml @@ -158,7 +158,7 @@ ATMine: Spread: 256 Damage: 400 AffectsParent: true - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath + DamageTypes: Prone50Percent, TriggerProne, ExplosionDeath Warhead@2Eff: CreateEffect Explosions: large_explosion ImpactSounds: mineblo1.aud diff --git a/mods/ura/weapons/missiles.yaml b/mods/ura/weapons/missiles.yaml index b2e6a7d..98bf2cc 100644 --- a/mods/ura/weapons/missiles.yaml +++ b/mods/ura/weapons/missiles.yaml @@ -136,7 +136,6 @@ MammothTusk: Warhead@1Dam: SpreadDamage Spread: 256 Damage: 50 - ValidTargets: Air, Infantry Versus: None: 100 Light: 60 @@ -170,7 +169,6 @@ MammothTuskAT: Warhead@1Dam: SpreadDamage Spread: 256 Damage: 25 - ValidTargets: Tank, Vehicle, Husk Versus: Light: 80 Heavy: 110 @@ -207,9 +205,7 @@ Nike: Damage: 50 ValidTargets: Air Versus: - None: 90 Light: 90 - Heavy: 50 Warhead@3Eff: CreateEffect Explosions: med_explosion_air ImpactSounds: kaboom25.aud @@ -225,9 +221,7 @@ RedEye: Damage: 40 ValidTargets: Air Versus: - Wood: 75 Light: 60 - Heavy: 25 Stinger: Inherits: ^AntiGroundMissile @@ -301,7 +295,6 @@ TorpTube: Damage: 180 ValidTargets: Water, Underwater, Bridge Versus: - None: 30 Wood: 75 Light: 75 Heavy: 100 @@ -327,7 +320,6 @@ TorpTube: Inaccuracy: 0c614 HorizontalRateOfTurn: 15 RangeLimit: 11c0 - LaunchAngle: 120 Image: MISSILE TrailImage: smokey ContrailLength: 30 diff --git a/mods/ura/weapons/other.yaml b/mods/ura/weapons/other.yaml index 201aa02..7e4ae3c 100644 --- a/mods/ura/weapons/other.yaml +++ b/mods/ura/weapons/other.yaml @@ -177,13 +177,6 @@ Hover: Damage: 0 ValidTargets: Ground, Water -Crush: - Warhead@1Dam: SpreadDamage - Damage: 100 - DamageTypes: Prone50Percent, TriggerProne, DefaultDeath - Warhead@2Eff: CreateEffect - ImpactSounds: squishy2.aud - Demolish: Warhead@1Dam: SpreadDamage DamageTypes: DefaultDeath @@ -214,6 +207,7 @@ Mandible: Damage: 60 Versus: None: 90 + DamageTypes: Prone50Percent, TriggerProne, BulletDeath MADTankThump: InvalidTargets: MADTank diff --git a/mods/ura/weapons/smallcaliber.yaml b/mods/ura/weapons/smallcaliber.yaml index 2eb2507..2327209 100644 --- a/mods/ura/weapons/smallcaliber.yaml +++ b/mods/ura/weapons/smallcaliber.yaml @@ -91,6 +91,7 @@ FLAK-23-AG: Light: 30 Heavy: 10 Concrete: 10 + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath Vulcan: Inherits: ^HeavyMG @@ -279,7 +280,7 @@ M60mg: Spread: 42 Damage: 150 ValidTargets: Barrel, Infantry - DamageTypes: Prone50Percent, TriggerProne, BulletDeath + DamageTypes: Prone50Percent, TriggerProne, DefaultDeath SilencedPPK: Inherits: ^SnipeWeapon diff --git a/packaging/linux/buildpackage.sh b/packaging/linux/buildpackage.sh index 57b4674..712409a 100755 --- a/packaging/linux/buildpackage.sh +++ b/packaging/linux/buildpackage.sh @@ -37,7 +37,7 @@ fi require_variables "MOD_ID" "ENGINE_DIRECTORY" "PACKAGING_DISPLAY_NAME" "PACKAGING_INSTALLER_NAME" \ "PACKAGING_APPIMAGE_DEPENDENCIES_TAG" "PACKAGING_APPIMAGE_DEPENDENCIES_SOURCE" "PACKAGING_APPIMAGE_DEPENDENCIES_TEMP_ARCHIVE_NAME" \ - "PACKAGING_FAQ_URL" + "PACKAGING_FAQ_URL" "PACKAGING_OVERWRITE_MOD_VERSION" TAG="$1" if [ $# -eq "1" ]; then @@ -66,7 +66,13 @@ fi echo "Building core files" -make version VERSION="${TAG}" +MOD_VERSION=$(grep 'Version:' mods/${MOD_ID}/mod.yaml | awk '{print $2}') + +if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then + make version VERSION="${TAG}" +else + echo "Mod version ${MOD_VERSION} will remain unchanged."; +fi pushd "${ENGINE_DIRECTORY}" > /dev/null make linux-dependencies @@ -132,6 +138,8 @@ install -m 0755 openra-mod.temp "${BUILTDIR}/usr/bin/openra-${MOD_ID}" sed "s/{MODID}/${MOD_ID}/g" include/mod-server.in > openra-mod-server.temp install -m 0755 openra-mod-server.temp "${BUILTDIR}/usr/bin/openra-${MOD_ID}-server" +install -m 0755 include/gtk-dialog.py "${BUILTDIR}/usr/bin/gtk-dialog.py" + # travis-ci doesn't support mounting FUSE filesystems so extract and run the contents manually ./appimagetool-x86_64.AppImage --appimage-extract ARCH=x86_64 ./squashfs-root/AppRun "${BUILTDIR}" "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-${TAG}.AppImage" diff --git a/packaging/linux/include/AppRun.in b/packaging/linux/include/AppRun.in index 353e9de..d2fbc4d 100644 --- a/packaging/linux/include/AppRun.in +++ b/packaging/linux/include/AppRun.in @@ -3,6 +3,16 @@ # Make sure the user has a sufficiently recent version of mono on the PATH MINIMUM_MONO_VERSION="4.2" +prompt_apt_install_mono_complete() { + command -v mono >/dev/null 2>&1 && return 1 + command -v apt-cache > /dev/null || return 1 + command -v xdg-mime > /dev/null || return 1 + command -v xdg-open > /dev/null || return 1 + [ ! "$(xdg-mime query default x-scheme-handler/apt)" ] && return 1 + apt-cache search --names-only mono-complete | cut -d' ' -f1 | grep "^mono-complete$" > /dev/null || return 1 + return 0 +} + make_version() { echo "$1" | tr '.' '\n' | head -n 4 | xargs printf "%03d%03d%03d%03d"; } @@ -14,23 +24,50 @@ mono_missing_or_old() { return 1 } +HERE="$(dirname "$(readlink -f "${0}")")" +export PATH="${HERE}"/usr/bin/:"${PATH}" +export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}" + +# If mono is not installed, and the user has apt-cache, apt-url, +# xdg-open, and either zenity or kdialog, then we can prompt to +# automatically install the mono-complete package +if prompt_apt_install_mono_complete; then + PROMPT_MESSAGE="{MODNAME} requires the Mono runtime.\nWould you like to install it now?" + if command -v zenity > /dev/null; then + zenity --no-wrap --question --title "{MODNAME}" --text "${PROMPT_MESSAGE}" 2> /dev/null && xdg-open apt://mono-complete && exit 0 + elif command -v kdialog > /dev/null; then + kdialog --title "{MODNAME}" --yesno "${PROMPT_MESSAGE}" && xdg-open apt://mono-complete && exit 0 + elif "${HERE}/usr/bin/gtk-dialog.py" test > /dev/null; then + "${HERE}/usr/bin/gtk-dialog.py" question --title "{MODNAME}" --text "${PROMPT_MESSAGE}" 2> /dev/null && xdg-open apt://mono-complete && exit 0 + fi +fi + if mono_missing_or_old; then ERROR_MESSAGE="{MODNAME} requires Mono ${MINIMUM_MONO_VERSION} or greater.\nPlease install Mono using your system package manager." if command -v zenity > /dev/null; then zenity --no-wrap --error --title "{MODNAME}" --text "${ERROR_MESSAGE}" 2> /dev/null elif command -v kdialog > /dev/null; then kdialog --title "{MODNAME}" --error "${ERROR_MESSAGE}" + elif "${HERE}/usr/bin/gtk-dialog.py" test > /dev/null; then + "${HERE}/usr/bin/gtk-dialog.py" error --title "{MODNAME}" --text "${ERROR_MESSAGE}" 2> /dev/null else printf "${ERROR_MESSAGE}" fi exit 1 fi -# Run the game or server -HERE="$(dirname "$(readlink -f "${0}")")" -export PATH="${HERE}"/usr/bin/:"${PATH}" -export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}" +# Some distros and self-compiled mono installations don't set up +# the SSL required for http web queries. If we detect that these +# are missing we can try and create a local sync as a fallback. +if [ ! -d "/usr/share/.mono/certs" ] && [ ! -d "${HOME}/.config/.mono/certs" ]; then + if [ -f "/etc/pki/tls/certs/ca-bundle.crt" ]; then + cert-sync --quiet --user /etc/pki/tls/certs/ca-bundle.crt + elif [ -f "/etc/ssl/certs/ca-certificates.crt" ]; then + cert-sync --quiet --user /etc/ssl/certs/ca-certificates.crt + fi +fi +# Run the game or server if [ -n "$1" ] && [ "$1" = "--server" ]; then exec "openra-{MODID}-server" "$@" else diff --git a/packaging/linux/include/gtk-dialog.py b/packaging/linux/include/gtk-dialog.py new file mode 100644 index 0000000..337f9b9 --- /dev/null +++ b/packaging/linux/include/gtk-dialog.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +"""A simple GTK3 graphical dialog helper that can be used as a fallback if zenity is not available + Compatible with python 2 or 3 with the gi bindings. + + Three modes are available: + test: accepts no arguments, returns 0 if the python dependencies are available, or 1 if not + error: show a gtk-3 error dialog + accepts arguments --title and --text + question: show a gtk-3 question dialog + accepts arguments --title and --text + returns 0 on Yes, or 1 on No +""" + +import sys + +try: + import argparse + import gi + gi.require_version('Gtk', '3.0') + from gi.repository import Gtk +except ImportError: + sys.exit(1) + +class Error(): + def __init__(self, title, text): + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, title) + dialog.format_secondary_text(text) + dialog.run() + dialog.destroy() + +class Question(): + def __init__(self, title, text): + dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, title) + dialog.format_secondary_text(text) + response = dialog.run() + dialog.destroy() + sys.exit(0 if response == Gtk.ResponseType.YES else 1) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('type', choices=['error', 'question', 'test']) + parser.add_argument('--title', type=str, required=False, default='') + parser.add_argument('--text', type=str, required=False, default='') + args = parser.parse_args() + if args.type == 'question': + Question(args.title, args.text.replace('\\n', '\n')) + elif args.type == 'error': + Error(args.title, args.text.replace('\\n', '\n')) diff --git a/packaging/linux/include/mod.in b/packaging/linux/include/mod.in index 45bf353..b4245e4 100644 --- a/packaging/linux/include/mod.in +++ b/packaging/linux/include/mod.in @@ -45,6 +45,8 @@ if [ $? != 0 ] && [ $? != 1 ]; then zenity --no-wrap --error --title "{MODNAME}" --text "${ERROR_MESSAGE}" 2> /dev/null elif command -v kdialog > /dev/null; then kdialog --title "{MODNAME}" --error "${ERROR_MESSAGE}" + elif "${HERE}/gtk-dialog.py" test > /dev/null; then + "${HERE}/gtk-dialog.py" error --title "{MODNAME}" --text "${ERROR_MESSAGE}" 2> /dev/null else printf "${ERROR_MESSAGE}\n" fi diff --git a/packaging/osx/buildpackage.sh b/packaging/osx/buildpackage.sh index 7c8a623..42d4b78 100755 --- a/packaging/osx/buildpackage.sh +++ b/packaging/osx/buildpackage.sh @@ -36,7 +36,7 @@ fi require_variables "MOD_ID" "ENGINE_DIRECTORY" "PACKAGING_DISPLAY_NAME" "PACKAGING_INSTALLER_NAME" \ "PACKAGING_OSX_LAUNCHER_TAG" "PACKAGING_OSX_LAUNCHER_SOURCE" "PACKAGING_OSX_LAUNCHER_TEMP_ARCHIVE_NAME" \ - "PACKAGING_FAQ_URL" + "PACKAGING_FAQ_URL" "PACKAGING_OVERWRITE_MOD_VERSION" TAG="$1" if [ $# -eq "1" ]; then @@ -78,7 +78,13 @@ if [ ! -d "${OUTPUTDIR}" ]; then exit 1 fi -make version VERSION="${TAG}" +MOD_VERSION=$(grep 'Version:' mods/${MOD_ID}/mod.yaml | awk '{print $2}') + +if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then + make version VERSION="${TAG}" +else + echo "Mod version ${MOD_VERSION} will remain unchanged."; +fi pushd ${ENGINE_DIRECTORY} > /dev/null make osx-dependencies diff --git a/packaging/windows/buildpackage.nsi b/packaging/windows/buildpackage.nsi index b0a2070..f05d005 100644 --- a/packaging/windows/buildpackage.nsi +++ b/packaging/windows/buildpackage.nsi @@ -29,7 +29,7 @@ SetCompressor lzma RequestExecutionLevel admin !insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE "${SRCDIR}\COPYING" +!insertmacro MUI_PAGE_LICENSE "${PACKAGING_WINDOWS_LICENSE_FILE}" !insertmacro MUI_PAGE_DIRECTORY !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" diff --git a/packaging/windows/buildpackage.sh b/packaging/windows/buildpackage.sh index 9ff3489..7ad36e8 100755 --- a/packaging/windows/buildpackage.sh +++ b/packaging/windows/buildpackage.sh @@ -34,7 +34,7 @@ fi require_variables "MOD_ID" "ENGINE_DIRECTORY" "PACKAGING_DISPLAY_NAME" "PACKAGING_INSTALLER_NAME" \ "PACKAGING_WINDOWS_LAUNCHER_NAME" "PACKAGING_WINDOWS_REGISTRY_KEY" "PACKAGING_WINDOWS_INSTALL_DIR_NAME" \ - "PACKAGING_FAQ_URL" "PACKAGING_WEBSITE_URL" "PACKAGING_AUTHORS" + "PACKAGING_WINDOWS_LICENSE_FILE" "PACKAGING_FAQ_URL" "PACKAGING_WEBSITE_URL" "PACKAGING_AUTHORS" "PACKAGING_OVERWRITE_MOD_VERSION" TAG="$1" if [ $# -eq "1" ]; then @@ -65,7 +65,13 @@ if [ ! -d "${OUTPUTDIR}" ]; then exit 1 fi -make version VERSION="${TAG}" +MOD_VERSION=$(grep 'Version:' mods/${MOD_ID}/mod.yaml | awk '{print $2}') + +if [ "${PACKAGING_OVERWRITE_MOD_VERSION}" == "True" ]; then + make version VERSION="${TAG}" +else + echo "Mod version ${MOD_VERSION} will remain unchanged."; +fi pushd ${ENGINE_DIRECTORY} > /dev/null SRC_DIR="$(pwd)" @@ -95,7 +101,7 @@ mono "${SRC_DIR}/fixheader.exe" "${BUILTDIR}/${PACKAGING_WINDOWS_LAUNCHER_NAME}. echo "Building Windows setup.exe" pushd "${PACKAGING_DIR}" > /dev/null -makensis -V2 -DSRCDIR="${BUILTDIR}" -DDEPSDIR="${SRC_DIR}/thirdparty/download/windows" -DTAG="${TAG}" -DMOD_ID="${MOD_ID}" -DPACKAGING_WINDOWS_INSTALL_DIR_NAME="${PACKAGING_WINDOWS_INSTALL_DIR_NAME}" -DPACKAGING_WINDOWS_LAUNCHER_NAME="${PACKAGING_WINDOWS_LAUNCHER_NAME}" -DPACKAGING_DISPLAY_NAME="${PACKAGING_DISPLAY_NAME}" -DPACKAGING_WEBSITE_URL="${PACKAGING_WEBSITE_URL}" -DPACKAGING_AUTHORS="${PACKAGING_AUTHORS}" -DPACKAGING_WINDOWS_REGISTRY_KEY="${PACKAGING_WINDOWS_REGISTRY_KEY}" buildpackage.nsi +makensis -V2 -DSRCDIR="${BUILTDIR}" -DDEPSDIR="${SRC_DIR}/thirdparty/download/windows" -DTAG="${TAG}" -DMOD_ID="${MOD_ID}" -DPACKAGING_WINDOWS_INSTALL_DIR_NAME="${PACKAGING_WINDOWS_INSTALL_DIR_NAME}" -DPACKAGING_WINDOWS_LAUNCHER_NAME="${PACKAGING_WINDOWS_LAUNCHER_NAME}" -DPACKAGING_DISPLAY_NAME="${PACKAGING_DISPLAY_NAME}" -DPACKAGING_WEBSITE_URL="${PACKAGING_WEBSITE_URL}" -DPACKAGING_AUTHORS="${PACKAGING_AUTHORS}" -DPACKAGING_WINDOWS_REGISTRY_KEY="${PACKAGING_WINDOWS_REGISTRY_KEY}" -DPACKAGING_WINDOWS_LICENSE_FILE="${TEMPLATE_ROOT}/${PACKAGING_WINDOWS_LICENSE_FILE}" buildpackage.nsi if [ $? -eq 0 ]; then mv OpenRA.Setup.exe "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-$TAG.exe" fi